exonware-xwlazy 0.1.0.22__py3-none-any.whl → 1.0.1.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. exonware/__init__.py +86 -16
  2. exonware/xwlazy/version.py +5 -5
  3. exonware/xwlazy.py +2546 -0
  4. exonware/xwlazy_external_libs.toml +716 -0
  5. {exonware_xwlazy-0.1.0.22.dist-info → exonware_xwlazy-1.0.1.2.dist-info}/METADATA +6 -6
  6. exonware_xwlazy-1.0.1.2.dist-info/RECORD +8 -0
  7. exonware/xwlazy/__init__.py +0 -367
  8. exonware/xwlazy/common/__init__.py +0 -47
  9. exonware/xwlazy/common/base.py +0 -56
  10. exonware/xwlazy/common/cache.py +0 -504
  11. exonware/xwlazy/common/logger.py +0 -257
  12. exonware/xwlazy/common/services/__init__.py +0 -72
  13. exonware/xwlazy/common/services/dependency_mapper.py +0 -232
  14. exonware/xwlazy/common/services/install_async_utils.py +0 -165
  15. exonware/xwlazy/common/services/install_cache_utils.py +0 -245
  16. exonware/xwlazy/common/services/keyword_detection.py +0 -283
  17. exonware/xwlazy/common/services/spec_cache.py +0 -165
  18. exonware/xwlazy/common/services/state_manager.py +0 -84
  19. exonware/xwlazy/common/strategies/__init__.py +0 -28
  20. exonware/xwlazy/common/strategies/caching_dict.py +0 -44
  21. exonware/xwlazy/common/strategies/caching_installation.py +0 -88
  22. exonware/xwlazy/common/strategies/caching_lfu.py +0 -66
  23. exonware/xwlazy/common/strategies/caching_lru.py +0 -63
  24. exonware/xwlazy/common/strategies/caching_multitier.py +0 -59
  25. exonware/xwlazy/common/strategies/caching_ttl.py +0 -59
  26. exonware/xwlazy/config.py +0 -193
  27. exonware/xwlazy/contracts.py +0 -1396
  28. exonware/xwlazy/defs.py +0 -378
  29. exonware/xwlazy/errors.py +0 -276
  30. exonware/xwlazy/facade.py +0 -991
  31. exonware/xwlazy/module/__init__.py +0 -18
  32. exonware/xwlazy/module/base.py +0 -565
  33. exonware/xwlazy/module/data.py +0 -17
  34. exonware/xwlazy/module/facade.py +0 -246
  35. exonware/xwlazy/module/importer_engine.py +0 -2117
  36. exonware/xwlazy/module/strategies/__init__.py +0 -22
  37. exonware/xwlazy/module/strategies/module_helper_lazy.py +0 -93
  38. exonware/xwlazy/module/strategies/module_helper_simple.py +0 -65
  39. exonware/xwlazy/module/strategies/module_manager_advanced.py +0 -111
  40. exonware/xwlazy/module/strategies/module_manager_simple.py +0 -95
  41. exonware/xwlazy/package/__init__.py +0 -18
  42. exonware/xwlazy/package/base.py +0 -798
  43. exonware/xwlazy/package/conf.py +0 -324
  44. exonware/xwlazy/package/data.py +0 -17
  45. exonware/xwlazy/package/facade.py +0 -480
  46. exonware/xwlazy/package/services/__init__.py +0 -84
  47. exonware/xwlazy/package/services/async_install_handle.py +0 -87
  48. exonware/xwlazy/package/services/config_manager.py +0 -245
  49. exonware/xwlazy/package/services/discovery.py +0 -370
  50. exonware/xwlazy/package/services/host_packages.py +0 -145
  51. exonware/xwlazy/package/services/install_async.py +0 -277
  52. exonware/xwlazy/package/services/install_cache.py +0 -145
  53. exonware/xwlazy/package/services/install_interactive.py +0 -59
  54. exonware/xwlazy/package/services/install_policy.py +0 -156
  55. exonware/xwlazy/package/services/install_registry.py +0 -54
  56. exonware/xwlazy/package/services/install_result.py +0 -17
  57. exonware/xwlazy/package/services/install_sbom.py +0 -153
  58. exonware/xwlazy/package/services/install_utils.py +0 -79
  59. exonware/xwlazy/package/services/installer_engine.py +0 -406
  60. exonware/xwlazy/package/services/lazy_installer.py +0 -718
  61. exonware/xwlazy/package/services/manifest.py +0 -496
  62. exonware/xwlazy/package/services/strategy_registry.py +0 -186
  63. exonware/xwlazy/package/strategies/__init__.py +0 -57
  64. exonware/xwlazy/package/strategies/package_discovery_file.py +0 -129
  65. exonware/xwlazy/package/strategies/package_discovery_hybrid.py +0 -84
  66. exonware/xwlazy/package/strategies/package_discovery_manifest.py +0 -101
  67. exonware/xwlazy/package/strategies/package_execution_async.py +0 -113
  68. exonware/xwlazy/package/strategies/package_execution_cached.py +0 -90
  69. exonware/xwlazy/package/strategies/package_execution_pip.py +0 -99
  70. exonware/xwlazy/package/strategies/package_execution_wheel.py +0 -106
  71. exonware/xwlazy/package/strategies/package_mapping_discovery_first.py +0 -100
  72. exonware/xwlazy/package/strategies/package_mapping_hybrid.py +0 -105
  73. exonware/xwlazy/package/strategies/package_mapping_manifest_first.py +0 -100
  74. exonware/xwlazy/package/strategies/package_policy_allow_list.py +0 -57
  75. exonware/xwlazy/package/strategies/package_policy_deny_list.py +0 -57
  76. exonware/xwlazy/package/strategies/package_policy_permissive.py +0 -46
  77. exonware/xwlazy/package/strategies/package_timing_clean.py +0 -67
  78. exonware/xwlazy/package/strategies/package_timing_full.py +0 -66
  79. exonware/xwlazy/package/strategies/package_timing_smart.py +0 -68
  80. exonware/xwlazy/package/strategies/package_timing_temporary.py +0 -66
  81. exonware/xwlazy/runtime/__init__.py +0 -18
  82. exonware/xwlazy/runtime/adaptive_learner.py +0 -129
  83. exonware/xwlazy/runtime/base.py +0 -274
  84. exonware/xwlazy/runtime/facade.py +0 -94
  85. exonware/xwlazy/runtime/intelligent_selector.py +0 -170
  86. exonware/xwlazy/runtime/metrics.py +0 -60
  87. exonware/xwlazy/runtime/performance.py +0 -37
  88. exonware_xwlazy-0.1.0.22.dist-info/RECORD +0 -87
  89. {exonware_xwlazy-0.1.0.22.dist-info → exonware_xwlazy-1.0.1.2.dist-info}/WHEEL +0 -0
  90. {exonware_xwlazy-0.1.0.22.dist-info → exonware_xwlazy-1.0.1.2.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,716 @@
1
+ # xwlazy-lite External Library Mappings
2
+ # Maps import names to package names with optional version constraints
3
+ # Format: "import_name" = "package_name" or "package_name>=version"
4
+
5
+ # Blocked packages - these will be denied from being imported/installed
6
+ # Packages listed here are blocked due to compatibility issues or security concerns
7
+ [deny_list]
8
+ "lxml" = "Blocked: Python 2 syntax incompatibility (exec without parentheses) - use html.parser instead"
9
+
10
+ [mappings]
11
+ # Google & Protocol Buffers
12
+ "google.protobuf" = "protobuf"
13
+ "google.protobuf.message" = "protobuf"
14
+ "google.protobuf.json_format" = "protobuf"
15
+ "google.auth" = "google-auth"
16
+ "google.cloud.storage" = "google-cloud-storage"
17
+ "google.api" = "google-api-python-client"
18
+ "google.genai" = "google-genai"
19
+ "google.api_core" = "google-api-core"
20
+ "google.oauth2" = "google-auth"
21
+ "google.oauth2.credentials" = "google-auth"
22
+ "google.oauth2.service_account" = "google-auth"
23
+ "google.auth.transport" = "google-auth"
24
+ "google_auth_oauthlib" = "google-auth-oauthlib"
25
+ "protobuf" = "protobuf"
26
+
27
+ # Computer Vision & Image Processing
28
+ "cv2" = "opencv-python"
29
+ "PIL" = "Pillow"
30
+
31
+ # Machine Learning & Data Science
32
+ "sklearn" = "scikit-learn"
33
+ "pandas" = "pandas"
34
+ "numpy" = "numpy"
35
+ "scipy" = "scipy"
36
+ "scipy.io" = "scipy"
37
+ "regex" = "regex"
38
+ "h5py" = "h5py"
39
+ "pyarrow" = "pyarrow"
40
+ "numexpr" = "numexpr"
41
+ "bottleneck" = "bottleneck"
42
+ "cloudpickle" = "cloudpickle"
43
+ "pyarrow.ipc" = "pyarrow"
44
+ "pyarrow.parquet" = "pyarrow"
45
+ "pyarrow.feather" = "pyarrow"
46
+ "parquet" = "pyarrow"
47
+ "feather" = "pyarrow"
48
+ "fastavro" = "fastavro"
49
+ "avro" = "fastavro"
50
+ "torch" = "torch"
51
+ "tensorflow" = "tensorflow"
52
+ "tf" = "tensorflow"
53
+ "keras" = "keras"
54
+ "transformers" = "transformers"
55
+ "jax" = "jax"
56
+ "jaxlib" = "jaxlib"
57
+ "scikit_image" = "scikit-image"
58
+ "skimage" = "scikit-image"
59
+ "statsmodels" = "statsmodels"
60
+ "xgboost" = "xgboost"
61
+ "lightgbm" = "lightgbm"
62
+ "catboost" = "catboost"
63
+ "joblib" = "joblib"
64
+ "networkx" = "networkx"
65
+ "igraph" = "python-igraph"
66
+ "dask" = "dask"
67
+ "distributed" = "dask"
68
+
69
+ # Data Visualization
70
+ "matplotlib" = "matplotlib"
71
+ "plt" = "matplotlib"
72
+ "mpl" = "matplotlib"
73
+ "seaborn" = "seaborn"
74
+ "sns" = "seaborn"
75
+ "plotly" = "plotly"
76
+ "bokeh" = "bokeh"
77
+ "altair" = "altair"
78
+ "pygal" = "pygal"
79
+ "graphviz" = "graphviz"
80
+ "pygraphviz" = "pygraphviz"
81
+ "folium" = "folium"
82
+ "geopandas" = "geopandas"
83
+ "cartopy" = "cartopy"
84
+ "basemap" = "basemap"
85
+ "mplleaflet" = "mplleaflet"
86
+ "wordcloud" = "wordcloud"
87
+ "pyecharts" = "pyecharts"
88
+ "ggplot" = "ggplot"
89
+
90
+ # Web & HTTP
91
+ "requests" = "requests"
92
+ "httpx" = "httpx"
93
+ "aiohttp" = "aiohttp"
94
+ "fastapi" = "fastapi"
95
+ "uvicorn" = "uvicorn"
96
+ "multipart" = "python-multipart"
97
+ "python_multipart" = "python-multipart"
98
+ "django" = "django"
99
+ "flask" = "flask"
100
+ "flask.views" = "flask"
101
+ "flask.Blueprint" = "flask"
102
+ "tornado" = "tornado"
103
+ "sanic" = "sanic"
104
+ "quart" = "quart"
105
+ "starlette" = "starlette"
106
+ "gunicorn" = "gunicorn"
107
+ "bottle" = "bottle"
108
+ "falcon" = "falcon"
109
+ "cherrypy" = "cherrypy"
110
+ "websockets" = "websockets"
111
+ "websocket" = "websockets-client"
112
+ "urllib3" = "urllib3"
113
+ "certifi" = "certifi"
114
+
115
+ # Serialization & Data Formats
116
+ "yaml" = "PyYAML"
117
+ "pyyaml" = "PyYAML"
118
+ "ruamel.yaml" = "ruamel.yaml"
119
+ "bs4" = "beautifulsoup4"
120
+ "toml" = "tomli"
121
+ "tomllib" = "tomli"
122
+ "tomli_w" = "tomli-w"
123
+ "rtoml" = "rtoml"
124
+ "msgpack" = "msgpack"
125
+ "cbor" = "cbor2"
126
+ "cbor2" = "cbor2"
127
+ "lz4.frame" = "lz4"
128
+ "lz4" = "lz4"
129
+ "zstd" = "zstd"
130
+ "zstandard" = "zstandard"
131
+ "ubjson" = "py-ubjson"
132
+ "flatbuffers" = "flatbuffers"
133
+ "thrift" = "thrift"
134
+ "thrift.protocol" = "thrift"
135
+ "thrift.transport" = "thrift"
136
+ "pycapnp" = "pycapnp"
137
+ "capnp" = "pycapnp"
138
+ "pyorc" = "pyorc"
139
+ "dill" = "dill"
140
+ "pypostcard" = "pypostcard"
141
+ "postcard" = "pypostcard"
142
+ "serde" = "pyserde"
143
+ "attrs2bin" = "attrs2bin"
144
+ "zope" = "zope.interface"
145
+ "zope.interface" = "zope.interface"
146
+
147
+ # XML Processing
148
+ "lxml" = "lxml"
149
+ "xml" = "lxml"
150
+ "xmlschema" = "xmlschema"
151
+ "defusedxml" = "defusedxml"
152
+ "xmltodict" = "xmltodict"
153
+ "dicttoxml" = "dicttoxml"
154
+ "beautifulsoup" = "beautifulsoup4"
155
+ "html5lib" = "html5lib"
156
+ "html_parser" = "html5lib"
157
+
158
+ # Templating & Markup
159
+ "jinja2" = "Jinja2"
160
+ "jinja" = "Jinja2"
161
+ "mako" = "Mako"
162
+ "cheetah" = "Cheetah3"
163
+ "markdown" = "Markdown"
164
+ "markupsafe" = "MarkupSafe"
165
+ "pygments" = "Pygments"
166
+ "mistune" = "mistune"
167
+ "commonmark" = "commonmark"
168
+ "markdown2" = "markdown2"
169
+ "pymdown_extensions" = "pymdown-extensions"
170
+ "docutils" = "docutils"
171
+ "sphinx" = "sphinx"
172
+ "mkdocs" = "mkdocs"
173
+ "pelican" = "pelican"
174
+ "nikola" = "Nikola"
175
+
176
+ # JSON Processing
177
+ "jsonpointer" = "jsonpointer"
178
+ "jsonpatch" = "jsonpatch"
179
+ "jsonpath" = "jsonpath-ng"
180
+ "jsonpath_ng" = "jsonpath-ng"
181
+ "jsonschema" = "jsonschema"
182
+ "orjson" = "orjson"
183
+ "ijson" = "ijson"
184
+ "json5" = "json5"
185
+ "msgspec" = "msgspec"
186
+ "ujson" = "ujson"
187
+ "rapidjson" = "python-rapidjson"
188
+ "simplejson" = "simplejson"
189
+
190
+ # Data Validation & Serialization
191
+ "pydantic" = "pydantic"
192
+ "marshmallow" = "marshmallow"
193
+ "voluptuous" = "voluptuous"
194
+ "cerberus" = "cerberus"
195
+ "schematics" = "schematics"
196
+ "attrs" = "attrs"
197
+ "attr" = "attrs"
198
+ "dataclasses" = "dataclasses-json"
199
+ "dataclasses_json" = "dataclasses-json"
200
+ "cattrs" = "cattrs"
201
+ "apischema" = "apischema"
202
+ "valideer" = "valideer"
203
+ "django_forms" = "django"
204
+ "wtforms" = "WTForms"
205
+ "formencode" = "FormEncode"
206
+
207
+ # Database Drivers
208
+ "mysqldb" = "mysqlclient"
209
+ "mysql.connector" = "mysql-connector-python"
210
+ "mysql.connector.pooling" = "mysql-connector-python"
211
+ "pymysql" = "pymysql"
212
+ "aiomysql" = "aiomysql"
213
+ "psycopg2" = "psycopg2-binary"
214
+ "psycopg2.pool" = "psycopg2-binary"
215
+ "asyncpg" = "asyncpg"
216
+ "oracledb" = "oracledb"
217
+ "pyodbc" = "pyodbc"
218
+ "pymssql" = "pymssql"
219
+ "sqlalchemy" = "sqlalchemy"
220
+ "peewee" = "peewee"
221
+ "tortoise" = "tortoise-orm"
222
+ "databases" = "databases"
223
+ "records" = "records"
224
+ "dataset" = "dataset"
225
+ "alembic" = "alembic"
226
+ "pep249" = "dbapi2"
227
+
228
+ # MongoDB & Document Databases
229
+ "bson" = "pymongo"
230
+ "mongo" = "pymongo"
231
+ "pymongo" = "pymongo"
232
+ "pymongo.errors" = "pymongo"
233
+ "motor" = "motor"
234
+ "motor.motor_asyncio" = "motor"
235
+
236
+ # NoSQL Databases
237
+ "redis" = "redis"
238
+ "redis.asyncio" = "redis"
239
+ "couchdb" = "couchdb"
240
+ "couchbase" = "couchbase"
241
+ "aerospike" = "aerospike"
242
+ "riak" = "riak"
243
+ "rocksdb" = "python-rocksdb"
244
+ "plyvel" = "plyvel"
245
+ "lmdb" = "lmdb"
246
+
247
+ # Graph Databases
248
+ "neo4j" = "neo4j"
249
+ "pydgraph" = "pydgraph"
250
+ "gremlin" = "gremlinpython"
251
+ "SPARQL" = "SPARQLWrapper"
252
+ "orient" = "pyorient"
253
+ "arango" = "python-arango"
254
+ "rethinkdb" = "rethinkdb"
255
+
256
+ # Excel & Office Files
257
+ "openpyxl" = "openpyxl"
258
+ "xlrd" = "xlrd"
259
+ "xlwt" = "xlwt"
260
+ "xlsxwriter" = "xlsxwriter"
261
+ "pyexcel" = "pyexcel"
262
+ "pyexcel_xls" = "pyexcel-xls"
263
+ "pyexcel_xlsx" = "pyexcel-xlsx"
264
+ "xlutils" = "xlutils"
265
+ "python_docx" = "python-docx"
266
+ "docx" = "python-docx"
267
+ "pptx" = "python-pptx"
268
+ "python_pptx" = "python-pptx"
269
+ "odfpy" = "odfpy"
270
+ "pdfminer" = "pdfminer.six"
271
+ "pdfminer3" = "pdfminer.six"
272
+ "pypdf" = "pypdf"
273
+ "pypdf2" = "pypdf2"
274
+ "reportlab" = "reportlab"
275
+ "fpdf" = "fpdf2"
276
+ "gspread" = "gspread"
277
+ "gspread_dataframe" = "gspread-dataframe"
278
+ "oauth2client" = "oauth2client"
279
+
280
+ # Search Engines
281
+ "elasticsearch" = "elasticsearch"
282
+ "opensearch" = "opensearch-py"
283
+ "influxdb" = "influxdb-client"
284
+
285
+ # Cloud Storage & Services
286
+ "boto3" = "boto3"
287
+ "azure.storage.blob" = "azure-storage-blob"
288
+ "azure.storage" = "azure-storage-blob"
289
+ "dropbox" = "dropbox"
290
+ "boxsdk" = "boxsdk"
291
+ "google.cloud" = "google-cloud-storage"
292
+ "googleapiclient" = "google-api-python-client"
293
+ "stripe" = "stripe"
294
+ "twilio" = "twilio"
295
+ "sendgrid" = "sendgrid"
296
+ "mailgun" = "mailgun"
297
+ "boto" = "boto"
298
+ "botocore" = "botocore"
299
+ "s3fs" = "s3fs"
300
+ "gcsfs" = "gcsfs"
301
+ "adlfs" = "adlfs"
302
+
303
+ # Authentication & Security
304
+ "jwt" = "PyJWT"
305
+ "Crypto" = "pycrypto"
306
+ "crypto" = "pycrypto"
307
+ "authlib" = "authlib"
308
+ "msal" = "msal"
309
+ "bcrypt" = "bcrypt"
310
+ "cryptography" = "cryptography"
311
+ "passlib" = "passlib"
312
+ "python_jose" = "python-jose"
313
+ "jose" = "python-jose"
314
+ "itsdangerous" = "itsdangerous"
315
+ "python_oauth2" = "python-oauth2"
316
+ "oauthlib" = "oauthlib"
317
+ "requests_oauthlib" = "requests-oauthlib"
318
+ "social_auth" = "social-auth-app-python"
319
+ "social_auth_core" = "social-auth-core"
320
+ "python_social_auth" = "python-social-auth"
321
+ "keyring" = "keyring"
322
+ "keyrings" = "keyrings.alt"
323
+ "argon2" = "argon2-cffi"
324
+ "scrypt" = "scrypt"
325
+ "nacl" = "pynacl"
326
+
327
+ # AI & LLM APIs
328
+ "openai" = "openai"
329
+ "anthropic" = "anthropic"
330
+ "cohere" = "cohere"
331
+ "huggingface_hub" = "huggingface-hub"
332
+ "hf_hub" = "huggingface-hub"
333
+ "langchain" = "langchain"
334
+ "langsmith" = "langsmith"
335
+ "llama_index" = "llama-index"
336
+ "litellm" = "litellm"
337
+ "vllm" = "vllm"
338
+ "ollama" = "ollama"
339
+
340
+ # Messaging & Communication
341
+ "telegram" = "python-telegram-bot"
342
+ "telegram.ext" = "python-telegram-bot"
343
+ "celery" = "celery"
344
+ "prefect" = "prefect"
345
+ "kombu" = "kombu"
346
+ "rq" = "rq"
347
+ "dramatiq" = "dramatiq"
348
+ "pika" = "pika"
349
+ "amqp" = "amqp"
350
+ "kafka" = "kafka-python"
351
+ "confluent_kafka" = "confluent-kafka"
352
+ "zmq" = "pyzmq"
353
+ "zeromq" = "pyzmq"
354
+ "twisted" = "twisted"
355
+ "slack_sdk" = "slack-sdk"
356
+ "slack" = "slack-sdk"
357
+ "discord" = "discord.py"
358
+ "whatsapp" = "python-whatsapp"
359
+
360
+ # Async Utilities
361
+ "aiofiles" = "aiofiles"
362
+ "nest_asyncio" = "nest-asyncio"
363
+ "aioredis" = "aioredis"
364
+ "aiocache" = "aiocache"
365
+ "aiopg" = "aiopg"
366
+ "aiosqlite" = "aiosqlite"
367
+ "trio" = "trio"
368
+ "curio" = "curio"
369
+ "asyncio" = "asyncio"
370
+ "gevent" = "gevent"
371
+ "eventlet" = "eventlet"
372
+ "greenlet" = "greenlet"
373
+ "uvloop" = "uvloop"
374
+
375
+ # System & Utilities
376
+ "psutil" = "psutil"
377
+ "pytz" = "pytz"
378
+ "colorama" = "colorama"
379
+ "xxhash" = "xxhash"
380
+ "rpds" = "rpds-py"
381
+ "opentelemetry" = "opentelemetry-api"
382
+ "opentelemetry.sdk" = "opentelemetry-sdk"
383
+ "opentelemetry.sdk.trace" = "opentelemetry-sdk"
384
+ "opentelemetry.sdk.trace.export" = "opentelemetry-sdk"
385
+ "opentelemetry.exporter" = "opentelemetry-exporter-otlp"
386
+ "opentelemetry.exporter.otlp" = "opentelemetry-exporter-otlp"
387
+ "opentelemetry.exporter.otlp.proto.http" = "opentelemetry-exporter-otlp-proto-http"
388
+ "opentelemetry.exporter.otlp.proto.http.trace_exporter" = "opentelemetry-exporter-otlp-proto-http"
389
+ "opentelemetry.exporter.zipkin" = "opentelemetry-exporter-zipkin-json"
390
+ "opentelemetry.exporter.zipkin.json" = "opentelemetry-exporter-zipkin-json"
391
+ "opentelemetry.metrics" = "opentelemetry-api"
392
+ "pywin32" = "pywin32"
393
+ "netCDF4" = "netCDF4"
394
+ "zarr" = "zarr"
395
+
396
+ # Monitoring & Observability
397
+ "prometheus_client" = "prometheus-client"
398
+ "prometheus" = "prometheus-client"
399
+ "sentry_sdk" = "sentry-sdk"
400
+ "sentry" = "sentry-sdk"
401
+ "raven" = "raven"
402
+ "newrelic" = "newrelic"
403
+ "datadog" = "datadog"
404
+ "ddtrace" = "ddtrace"
405
+ "dynatrace" = "dynatrace-opentelemetry"
406
+ "elastic_apm" = "elastic-apm"
407
+ "apm" = "elastic-apm"
408
+ "structlog" = "structlog"
409
+ "loguru" = "loguru"
410
+ "python_json_logger" = "python-json-logger"
411
+ "fluent_logger" = "fluent-logger"
412
+ "python_fluentd" = "fluent-logger"
413
+ "python_dotenv" = "python-dotenv"
414
+ "dotenv" = "python-dotenv"
415
+ "dynaconf" = "dynaconf"
416
+ "click" = "click"
417
+ "typer" = "typer"
418
+ "rich" = "rich"
419
+ "tabulate" = "tabulate"
420
+ "tqdm" = "tqdm"
421
+ "tenacity" = "tenacity"
422
+ "more_itertools" = "more-itertools"
423
+ "moreitertools" = "more-itertools"
424
+ "python_dateutil" = "python-dateutil"
425
+ "dateutil" = "python-dateutil"
426
+ "humanize" = "humanize"
427
+ "pendulum" = "pendulum"
428
+ "arrow" = "arrow"
429
+ "freezegun" = "freezegun"
430
+ "faker" = "faker"
431
+ "inflect" = "inflect"
432
+ "pathlib" = "pathlib2"
433
+ "backports" = "backports"
434
+ "typing_extensions" = "typing-extensions"
435
+ "charset_normalizer" = "charset-normalizer"
436
+ "idna" = "idna"
437
+ "setuptools" = "setuptools"
438
+ "wheel" = "wheel"
439
+ "packaging" = "packaging"
440
+ "semver" = "semver"
441
+ "version" = "packaging"
442
+
443
+ # Network & SSH
444
+ "aioftp" = "aioftp"
445
+ "asyncssh" = "asyncssh"
446
+ "paramiko" = "paramiko"
447
+ "sshtunnel" = "sshtunnel"
448
+ "fabric" = "fabric"
449
+ "invoke" = "invoke"
450
+ "pexpect" = "pexpect"
451
+ "pyexpect" = "pexpect"
452
+ "netmiko" = "netmiko"
453
+ "napalm" = "napalm"
454
+ "nornir" = "nornir"
455
+ "scapy" = "scapy"
456
+ "dnspython" = "dnspython"
457
+ "dns" = "dnspython"
458
+ "pycurl" = "pycurl"
459
+ "pyasn1" = "pyasn1"
460
+
461
+ # gRPC & RPC
462
+ "grpc" = "grpcio"
463
+ "grpcio" = "grpcio"
464
+ "grpcio_tools" = "grpcio-tools"
465
+ "grpcio_health" = "grpcio-health-checking"
466
+ "grpcio_status" = "grpcio-status"
467
+ "grpcio_reflection" = "grpcio-reflection"
468
+ "google_protobuf" = "protobuf"
469
+ "pyro" = "Pyro4"
470
+ "Pyro4" = "Pyro4"
471
+ "zerorpc" = "zerorpc"
472
+ "rpyc" = "rpyc"
473
+
474
+ # Parsers & Language Servers
475
+ "lark" = "lark"
476
+ "lark.exceptions" = "lark"
477
+ "pygls" = "pygls"
478
+ "tree_sitter" = "tree-sitter"
479
+ "ply" = "ply"
480
+ "pyparsing" = "pyparsing"
481
+ "parsy" = "parsy"
482
+ "pep517" = "pep517"
483
+ "setuptools_rust" = "setuptools-rust"
484
+ "mypyc" = "mypy"
485
+ "validators" = "validators"
486
+ "email_validator" = "email-validator"
487
+ "phonenumbers" = "phonenumbers"
488
+ "babel" = "Babel"
489
+ "pytesseract" = "pytesseract"
490
+ "tesseract" = "pytesseract"
491
+ "pdf2image" = "pdf2image"
492
+ "pypdfium2" = "pypdfium2"
493
+
494
+ # Configuration Management
495
+ "configparser" = "configparser"
496
+ "configobj" = "configobj"
497
+ "pyhocon" = "pyhocon"
498
+ "configargparse" = "ConfigArgParse"
499
+ "pydantic_settings" = "pydantic-settings"
500
+ "omegaconf" = "omegaconf"
501
+ "hydra" = "hydra-core"
502
+
503
+ # Caching & Rate Limiting
504
+ "cachetools" = "cachetools"
505
+ "cachebox" = "cachebox"
506
+ "diskcache" = "diskcache"
507
+ "pymemcache" = "pymemcache"
508
+ "memcache" = "pymemcache"
509
+ "limits" = "limits"
510
+ "ratelimit" = "ratelimit"
511
+ "slowapi" = "slowapi"
512
+ "flask_limiter" = "flask-limiter"
513
+ "cachecontrol" = "CacheControl"
514
+ "beaker" = "Beaker"
515
+ "dogpile_cache" = "dogpile.cache"
516
+ "flask_cache" = "Flask-Caching"
517
+
518
+ # Environment Variables & Secrets
519
+ "python_decouple" = "python-decouple"
520
+ "decouple" = "python-decouple"
521
+ "environ" = "django-environ"
522
+ "environs" = "environs"
523
+ "python_vault" = "hvac"
524
+ "vault" = "hvac"
525
+ "boto3_secrets" = "boto3-secrets"
526
+ "aws_secretsmanager" = "aws-secrets-manager"
527
+
528
+ # Date & Time Utilities
529
+ "zoneinfo" = "backports.zoneinfo"
530
+ "moment" = "moment"
531
+ "delorean" = "Delorean"
532
+ "timezonefinder" = "timezonefinder"
533
+ "pytimeparse" = "pytimeparse"
534
+ "timedelta" = "timedelta"
535
+ "iso8601" = "iso8601"
536
+ "dateparser" = "dateparser"
537
+ "parsedatetime" = "parsedatetime"
538
+ "maya" = "maya"
539
+ "when.py" = "when.py"
540
+
541
+ # Testing & Development Tools
542
+ "pytest" = "pytest"
543
+ "pytest_cov" = "pytest-cov"
544
+ "pytest_asyncio" = "pytest-asyncio"
545
+ "pytest_benchmark" = "pytest-benchmark"
546
+ "pytest_mock" = "pytest-mock"
547
+ "pytest_xdist" = "pytest-xdist"
548
+ "pytest_timeout" = "pytest-timeout"
549
+ "pytest_html" = "pytest-html"
550
+ "unittest" = "unittest2"
551
+ "nose" = "nose"
552
+ "coverage" = "coverage"
553
+ "black" = "black"
554
+ "isort" = "isort"
555
+ "flake8" = "flake8"
556
+ "mypy" = "mypy"
557
+ "ruff" = "ruff"
558
+ "pylint" = "pylint"
559
+ "pylama" = "pylama"
560
+ "autopep8" = "autopep8"
561
+ "yapf" = "yapf"
562
+ "bandit" = "bandit"
563
+ "safety" = "safety"
564
+ "semgrep" = "semgrep"
565
+ "dlint" = "dlint"
566
+ "radon" = "radon"
567
+ "vulture" = "vulture"
568
+ "mccabe" = "mccabe"
569
+ "prospector" = "prospector"
570
+ "pydocstyle" = "pydocstyle"
571
+ "pep8" = "pep8"
572
+ "pycodestyle" = "pycodestyle"
573
+ "pyflakes" = "pyflakes"
574
+ "pre_commit" = "pre-commit"
575
+ "precommit" = "pre-commit"
576
+ "tox" = "tox"
577
+ "nox" = "nox"
578
+ "build" = "build"
579
+ "twine" = "twine"
580
+ "setuptools_scm" = "setuptools-scm"
581
+ "pip_tools" = "pip-tools"
582
+ "pipreqs" = "pipreqs"
583
+ "poetry" = "poetry"
584
+ "pipenv" = "pipenv"
585
+ "conda" = "conda"
586
+ "hatchling" = "hatchling"
587
+ "flit" = "flit"
588
+ "distutils" = "setuptools"
589
+
590
+ # Additional Popular Libraries
591
+ "watchdog" = "watchdog"
592
+ "schedule" = "schedule"
593
+ "apscheduler" = "APScheduler"
594
+ "python_crontab" = "python-crontab"
595
+ "crontab" = "python-crontab"
596
+ "shutil" = "pathlib"
597
+ "pathlib2" = "pathlib2"
598
+ "six" = "six"
599
+ "future" = "future"
600
+ "past" = "future"
601
+ "ipaddress" = "ipaddress"
602
+ "enum34" = "enum34"
603
+ "singledispatch" = "singledispatch"
604
+ "typing" = "typing-extensions"
605
+ "collections_abc" = "collections-extended"
606
+ "python_bidi" = "python-bidi"
607
+ "bidi" = "python-bidi"
608
+ "python_language_detection" = "langdetect"
609
+ "langdetect" = "langdetect"
610
+ "textdistance" = "textdistance"
611
+ "editdistance" = "editdistance"
612
+ "fuzzywuzzy" = "fuzzywuzzy"
613
+ "thefuzz" = "thefuzz"
614
+ "rapidfuzz" = "rapidfuzz"
615
+ "python_levenshtein" = "python-Levenshtein"
616
+ "Levenshtein" = "python-Levenshtein"
617
+ "nltk" = "nltk"
618
+ "spacy" = "spacy"
619
+ "gensim" = "gensim"
620
+ "polyglot" = "polyglot"
621
+ "textblob" = "textblob"
622
+ "vaderSentiment" = "vaderSentiment"
623
+ "vader" = "vaderSentiment"
624
+ "pattern" = "pattern"
625
+ "lxml_html" = "lxml"
626
+ "html5" = "html5lib"
627
+ "bleach" = "bleach"
628
+ "bleach_allowlist" = "bleach-allowlist"
629
+ "chameleon" = "Chameleon"
630
+ "pyramid_chameleon" = "pyramid-chameleon"
631
+ "genshi" = "Genshi"
632
+ "mistletoe" = "mistletoe"
633
+ "pypandoc" = "pypandoc"
634
+ "pandoc" = "pypandoc"
635
+ "weasyprint" = "weasyprint"
636
+ "pdfkit" = "pdfkit"
637
+ "wkhtmltopdf" = "wkhtmltopdf"
638
+ "xhtml2pdf" = "xhtml2pdf"
639
+ "pillow" = "Pillow"
640
+ "wand" = "Wand"
641
+ "pyvips" = "pyvips"
642
+ "imageio" = "imageio"
643
+ "opencv_python" = "opencv-python"
644
+ "rawpy" = "rawpy"
645
+ "exifread" = "exifread"
646
+ "piexif" = "piexif"
647
+ "easyocr" = "easyocr"
648
+ "paddleocr" = "paddleocr"
649
+ "paddlepaddle" = "paddlepaddle"
650
+ "paddle" = "paddlepaddle"
651
+
652
+ # Additional Utility Libraries
653
+ "python_slugify" = "python-slugify"
654
+ "slugify" = "python-slugify"
655
+ "awesome_slugify" = "awesome-slugify"
656
+ "python_barcode" = "python-barcode"
657
+ "barcode" = "python-barcode"
658
+ "qrcode" = "qrcode"
659
+ "qr" = "qrcode"
660
+ "pyqrcode" = "PyQRCode"
661
+ "python_qrcode" = "PyQRCode"
662
+ "brotli" = "brotli"
663
+ "brotlipy" = "brotlipy"
664
+ "snappy" = "python-snappy"
665
+ "python_snappy" = "python-snappy"
666
+ "lzma" = "backports.lzma"
667
+ "backports_lzma" = "backports.lzma"
668
+ "backports_ssl" = "backports.ssl-match-hostname"
669
+ "backports_shutil_get_terminal_size" = "backports.shutil_get_terminal_size"
670
+ "termcolor" = "termcolor"
671
+ "colorlog" = "colorlog"
672
+ "coloredlogs" = "coloredlogs"
673
+ "pyfiglet" = "pyfiglet"
674
+ "figlet" = "pyfiglet"
675
+ "art" = "art"
676
+ "ascii_magic" = "ascii-magic"
677
+ "python_terminal" = "python-term"
678
+ "blessed" = "blessed"
679
+ "prompt_toolkit" = "prompt-toolkit"
680
+ "prompttoolkit" = "prompt-toolkit"
681
+ "click_spinner" = "click-spinner"
682
+ "python_progressbar" = "progressbar2"
683
+ "progressbar" = "progressbar2"
684
+ "alive_progress" = "alive-progress"
685
+ "rich_progress" = "rich"
686
+ "halo" = "halo"
687
+ "yaspin" = "yaspin"
688
+ "spinner" = "yaspin"
689
+ "spinners" = "spinners"
690
+ "python_spinner" = "python-spinner"
691
+ "loading" = "loading"
692
+ "clint" = "clint"
693
+ "fire" = "fire"
694
+ "cement" = "cement"
695
+ "plumbum" = "plumbum"
696
+ "cliff" = "cliff"
697
+ "cmd2" = "cmd2"
698
+ "python_prompt_toolkit" = "prompt-toolkit"
699
+ "inquirer" = "inquirer"
700
+ "pick" = "pick"
701
+ "questionary" = "questionary"
702
+ "pickleshare" = "pickleshare"
703
+ "sh" = "sh"
704
+ "pbs" = "pbs"
705
+ "shutilwhich" = "shutilwhich"
706
+ "whichcraft" = "whichcraft"
707
+ "python_which" = "python-which"
708
+ "find_executable" = "distutils"
709
+ "which" = "whichcraft"
710
+ "wexpect" = "wexpect"
711
+ "ptyprocess" = "ptyprocess"
712
+ "subprocess32" = "subprocess32"
713
+ "envoy" = "envoy"
714
+ "python_sh" = "python-sh"
715
+ "delegator" = "delegator.py"
716
+ "subprocess_run" = "subprocess-run"