Use BinaryInstaller for CPython, update sdks registry, remove os field from FUS (PY-71414)

* os field is a reserved field, it is an autofilled field, no need to add it manually.

GitOrigin-RevId: 9506335e17c6e049adce9ebf17352c609739022a
This commit is contained in:
Vitaly Legchilkin
2024-05-10 13:41:02 +02:00
committed by intellij-monorepo-bot
parent d44ff7cb2f
commit 9a56930105
8 changed files with 671 additions and 265 deletions

View File

@@ -418,7 +418,6 @@ python.sdk.executable.not.found.option.install.with.cldt=Click {0} to install Py
python.sdk.executable.not.found.option.install.or.brew=Install Python manually from python.org or via Homebrew
python.sdk.admin.permissions.needed.consider.creating.venv=<html><strong>Note:</strong> You'll need admin permissions to install packages for this interpreter. Consider creating a per-project virtual environment instead.</html>
python.sdk.admin.permissions.needed.consider.creating.venv.content=<strong>Note:</strong> You'll need admin permissions to install packages for this interpreter. Consider creating a per-project virtual environment instead.
python.sdk.try.to.install.python.manually=Try to install Python from https://www.python.org manually.
python.sdk.try.to.install.manually=Try to install {0} manually.
python.sdk.invalid.python.sdk=Invalid Python SDK
python.sdk.cannot.setup.sdk=Cannot set up a python SDK \nat {0}.\nThe SDK seems invalid.

View File

@@ -1,21 +1,21 @@
{
"python": [
{
"version": "3.12.2",
"version": "3.12.3",
"product": "CPython",
"sources": [
{
"url": "https://www.python.org/ftp/python/3.12.2/Python-3.12.2.tar.xz",
"size": 20591308,
"sha256": "be28112dac813d2053545c14bf13a16401a21877f1a69eb6ea5d84c4a0f3d870",
"fileName": "Python-3.12.2.tar.xz",
"url": "https://www.python.org/ftp/python/3.12.3/Python-3.12.3.tar.xz",
"size": 20625068,
"sha256": "56bfef1fdfc1221ce6720e43a661e3eb41785dd914ce99698d8c7896af4bdaa1",
"fileName": "Python-3.12.3.tar.xz",
"type": "COMPRESSED"
},
{
"url": "https://www.python.org/ftp/python/3.12.2/Python-3.12.2.tgz",
"size": 27116462,
"sha256": "a7c4f6a9dc423d8c328003254ab0c9338b83037bd787d680826a5bf84308116e",
"fileName": "Python-3.12.2.tgz",
"url": "https://www.python.org/ftp/python/3.12.3/Python-3.12.3.tgz",
"size": 27159482,
"sha256": "a6b9459f45a6ebbbc1af44f5762623fa355a0c87208ed417628b379d762dddb0",
"fileName": "Python-3.12.3.tgz",
"type": "COMPRESSED"
}
],
@@ -25,10 +25,10 @@
"cpuArch": "X86_64",
"resources": [
{
"url": "https://www.python.org/ftp/python/3.12.2/python-3.12.2-amd64.exe",
"size": 26667456,
"sha256": "b9314802f9efbf0f20a8e2cb4cacc4d5cfb0110dac2818d94e770e1ba5137c65",
"fileName": "python-3.12.2-amd64.exe",
"url": "https://www.python.org/ftp/python/3.12.3/python-3.12.3-amd64.exe",
"size": 26712328,
"sha256": "edfc6c84dc47eebd4fae9167e96ff5d9c27f8abaa779ee1deab9c3d964d0de3c",
"fileName": "python-3.12.3-amd64.exe",
"type": "MICROSOFT_WINDOWS_EXECUTABLE"
}
]
@@ -38,10 +38,10 @@
"cpuArch": "X86",
"resources": [
{
"url": "https://www.python.org/ftp/python/3.12.2/python-3.12.2.exe",
"size": 25320328,
"sha256": "f10f43cdcaf4b788d98bcb072f08aa43330502b25513a8fdffb6d77263cbab8e",
"fileName": "python-3.12.2.exe",
"url": "https://www.python.org/ftp/python/3.12.3/python-3.12.3.exe",
"size": 25408176,
"sha256": "a9f37c55f9922d00ef25af40d5017e86c2d98abd7d599307bccf0f2b3d055983",
"fileName": "python-3.12.3.exe",
"type": "MICROSOFT_WINDOWS_EXECUTABLE"
}
]
@@ -51,10 +51,10 @@
"cpuArch": "ARM64",
"resources": [
{
"url": "https://www.python.org/ftp/python/3.12.2/python-3.12.2-arm64.exe",
"size": 25882872,
"sha256": "3c1876607a70ca4b3f2db13f79392ffc773ed45e6cc0f12d49adfd5370c1cb6b",
"fileName": "python-3.12.2-arm64.exe",
"url": "https://www.python.org/ftp/python/3.12.3/python-3.12.3-arm64.exe",
"size": 25940336,
"sha256": "4399c3ccde91c703a368b6d4463af8ed24ce08e694485bed6eff180373b0dff1",
"fileName": "python-3.12.3-arm64.exe",
"type": "MICROSOFT_WINDOWS_EXECUTABLE"
}
]
@@ -63,33 +63,33 @@
"os": "macOS",
"resources": [
{
"url": "https://www.python.org/ftp/python/3.12.2/python-3.12.2-macos11.pkg",
"size": 45586819,
"sha256": "af7284515fc601c878aadbb9ded6a031a2309d3d52c1c1d5443c4e5567d500a4",
"fileName": "python-3.12.2-macos11.pkg",
"url": "https://www.python.org/ftp/python/3.12.3/python-3.12.3-macos11.pkg",
"size": 45672323,
"sha256": "70a701542ff297760ac5e20f81d0e610aaaa1aba016e411788aa80029e571c5e",
"fileName": "python-3.12.3-macos11.pkg",
"type": "APPLE_SOFTWARE_PACKAGE"
}
]
}
],
"title": "Python 3.12.2"
"title": "Python 3.12.3"
},
{
"version": "3.11.8",
"version": "3.11.9",
"product": "CPython",
"sources": [
{
"url": "https://www.python.org/ftp/python/3.11.8/Python-3.11.8.tar.xz",
"size": 20041256,
"sha256": "9e06008c8901924395bc1da303eac567a729ae012baa182ab39269f650383bb3",
"fileName": "Python-3.11.8.tar.xz",
"url": "https://www.python.org/ftp/python/3.11.9/Python-3.11.9.tar.xz",
"size": 20175816,
"sha256": "9b1e896523fc510691126c864406d9360a3d1e986acbda59cda57b5abda45b87",
"fileName": "Python-3.11.9.tar.xz",
"type": "COMPRESSED"
},
{
"url": "https://www.python.org/ftp/python/3.11.8/Python-3.11.8.tgz",
"size": 26477136,
"sha256": "d3019a613b9e8761d260d9ebe3bd4df63976de30464e5c0189566e1ae3f61889",
"fileName": "Python-3.11.8.tgz",
"url": "https://www.python.org/ftp/python/3.11.9/Python-3.11.9.tgz",
"size": 26521757,
"sha256": "e7de3240a8bc2b1e1ba5c81bf943f06861ff494b69fda990ce2722a504c6153d",
"fileName": "Python-3.11.9.tgz",
"type": "COMPRESSED"
}
],
@@ -99,10 +99,10 @@
"cpuArch": "X86_64",
"resources": [
{
"url": "https://www.python.org/ftp/python/3.11.8/python-3.11.8-amd64.exe",
"size": 26132480,
"sha256": "fd3428eb6c80901b877d036ffa2be127ccad9bbe036a43f00fc96a48b724f9c7",
"fileName": "python-3.11.8-amd64.exe",
"url": "https://www.python.org/ftp/python/3.11.9/python-3.11.9-amd64.exe",
"size": 26216840,
"sha256": "5ee42c4eee1e6b4464bb23722f90b45303f79442df63083f05322f1785f5fdde",
"fileName": "python-3.11.9-amd64.exe",
"type": "MICROSOFT_WINDOWS_EXECUTABLE"
}
]
@@ -112,10 +112,10 @@
"cpuArch": "X86",
"resources": [
{
"url": "https://www.python.org/ftp/python/3.11.8/python-3.11.8.exe",
"size": 24853336,
"sha256": "9184e270a087dec2a60cb3b1b3757e20318f8733c62732b68385837188298bdc",
"fileName": "python-3.11.8.exe",
"url": "https://www.python.org/ftp/python/3.11.9/python-3.11.9.exe",
"size": 24933192,
"sha256": "af19e5e2f03e715a822181f2cb7d4efef4eda13fa4a2db6da12e998e46f5cbf9",
"fileName": "python-3.11.9.exe",
"type": "MICROSOFT_WINDOWS_EXECUTABLE"
}
]
@@ -125,10 +125,10 @@
"cpuArch": "ARM64",
"resources": [
{
"url": "https://www.python.org/ftp/python/3.11.8/python-3.11.8-arm64.exe",
"size": 25410920,
"sha256": "70b050c446929e98dbeb947e30936c2cfba9105a633718880f15b829da9e819e",
"fileName": "python-3.11.8-arm64.exe",
"url": "https://www.python.org/ftp/python/3.11.9/python-3.11.9-arm64.exe",
"size": 25483288,
"sha256": "58f3a4e91b63d5a680ecc77c1db4565a1e3966e8656d4c8b89200d58c1f5c4f3",
"fileName": "python-3.11.9-arm64.exe",
"type": "MICROSOFT_WINDOWS_EXECUTABLE"
}
]
@@ -137,37 +137,37 @@
"os": "macOS",
"resources": [
{
"url": "https://www.python.org/ftp/python/3.11.8/python-3.11.8-macos11.pkg",
"size": 44774987,
"sha256": "db3e2ba967acac293c0063591a1d3c4ba713fd89929447715cd56ce06b598200",
"fileName": "python-3.11.8-macos11.pkg",
"url": "https://www.python.org/ftp/python/3.11.9/python-3.11.9-macos11.pkg",
"size": 44860848,
"sha256": "b6cfdee2571ca56ee895043ca1e7110fb78a878cee3eb0c21accb2de34d24b55",
"fileName": "python-3.11.9-macos11.pkg",
"type": "APPLE_SOFTWARE_PACKAGE"
}
]
}
],
"title": "Python 3.11.8"
"title": "Python 3.11.9"
},
{
"version": "3.10.13",
"version": "3.10.14",
"product": "CPython",
"sources": [
{
"url": "https://www.python.org/ftp/python/3.10.13/Python-3.10.13.tar.xz",
"size": 19663088,
"sha256": "5c88848668640d3e152b35b4536ef1c23b2ca4bd2c957ef1ecbb053f571dd3f6",
"fileName": "Python-3.10.13.tar.xz",
"url": "https://www.python.org/ftp/python/3.10.14/Python-3.10.14.tar.xz",
"size": 19600188,
"sha256": "9c50481faa8c2832329ba0fc8868d0a606a680fc4f60ec48d26ce8e076751fda",
"fileName": "Python-3.10.14.tar.xz",
"type": "COMPRESSED"
},
{
"url": "https://www.python.org/ftp/python/3.10.13/Python-3.10.13.tgz",
"size": 26111363,
"sha256": "698ec55234c1363bd813b460ed53b0f108877c7a133d48bde9a50a1eb57b7e65",
"fileName": "Python-3.10.13.tgz",
"url": "https://www.python.org/ftp/python/3.10.14/Python-3.10.14.tgz",
"size": 25927516,
"sha256": "cefea32d3be89c02436711c95a45c7f8e880105514b78680c14fe76f5709a0f6",
"fileName": "Python-3.10.14.tgz",
"type": "COMPRESSED"
}
],
"title": "Python 3.10.13"
"title": "Python 3.10.14"
},
{
"version": "3.10.11",
@@ -215,25 +215,25 @@
"title": "Python 3.10.11"
},
{
"version": "3.9.18",
"version": "3.9.19",
"product": "CPython",
"sources": [
{
"url": "https://www.python.org/ftp/python/3.9.18/Python-3.9.18.tar.xz",
"size": 19673928,
"sha256": "01597db0132c1cf7b331eff68ae09b5a235a3c3caa9c944c29cac7d1c4c4c00a",
"fileName": "Python-3.9.18.tar.xz",
"url": "https://www.python.org/ftp/python/3.9.19/Python-3.9.19.tar.xz",
"size": 19682840,
"sha256": "d4892cd1618f6458cb851208c030df1482779609d0f3939991bd38184f8c679e",
"fileName": "Python-3.9.19.tar.xz",
"type": "COMPRESSED"
},
{
"url": "https://www.python.org/ftp/python/3.9.18/Python-3.9.18.tgz",
"size": 26294072,
"sha256": "504ce8cfd59addc04c22f590377c6be454ae7406cb1ebf6f5a350149225a9354",
"fileName": "Python-3.9.18.tgz",
"url": "https://www.python.org/ftp/python/3.9.19/Python-3.9.19.tgz",
"size": 26304238,
"sha256": "f5f9ec8088abca9e399c3b62fd8ef31dbd2e1472c0ccb35070d4d136821aaf71",
"fileName": "Python-3.9.19.tgz",
"type": "COMPRESSED"
}
],
"title": "Python 3.9.18"
"title": "Python 3.9.19"
},
{
"version": "3.9.13",
@@ -281,25 +281,25 @@
"title": "Python 3.9.13"
},
{
"version": "3.8.18",
"version": "3.8.19",
"product": "CPython",
"sources": [
{
"url": "https://www.python.org/ftp/python/3.8.18/Python-3.8.18.tar.xz",
"size": 20696952,
"sha256": "3ffb71cd349a326ba7b2fadc7e7df86ba577dd9c4917e52a8401adbda7405e3f",
"fileName": "Python-3.8.18.tar.xz",
"url": "https://www.python.org/ftp/python/3.8.19/Python-3.8.19.tar.xz",
"size": 18975156,
"sha256": "d2807ac69f69b84fd46a0b93bbd02a4fa48d3e70f4b2835ff0f72a2885040076",
"fileName": "Python-3.8.19.tar.xz",
"type": "COMPRESSED"
},
{
"url": "https://www.python.org/ftp/python/3.8.18/Python-3.8.18.tgz",
"size": 27337549,
"sha256": "7c5df68bab1be81a52dea0cc2e2705ea00553b67107a301188383d7b57320b16",
"fileName": "Python-3.8.18.tgz",
"url": "https://www.python.org/ftp/python/3.8.19/Python-3.8.19.tgz",
"size": 25276823,
"sha256": "c7fa55a36e5c7a19ec37d8f90f60a2197548908c9ac8b31e7c0dbffdd470eeac",
"fileName": "Python-3.8.19.tgz",
"type": "COMPRESSED"
}
],
"title": "Python 3.8.18"
"title": "Python 3.8.19"
},
{
"version": "3.8.10",
@@ -384,6 +384,525 @@
}
],
"conda": [
{
"version": "24.3.0-0",
"product": "Miniconda",
"binaries": [
{
"os": "Windows",
"cpuArch": "X86_64",
"resources": [
{
"url": "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.3.0-0-Windows-x86_64.exe",
"size": 80056744,
"sha256": "2789122e1d978a4bd74dfe4f8154fe82ab575ed3b4880a3295e1c9e2d0864c95",
"fileName": "Miniconda3-py39_24.3.0-0-Windows-x86_64.exe",
"type": "MICROSOFT_WINDOWS_EXECUTABLE"
}
],
"tags": [
"PYTHON39"
]
},
{
"os": "macOS",
"cpuArch": "X86_64",
"resources": [
{
"url": "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.3.0-0-MacOSX-x86_64.sh",
"size": 105109793,
"sha256": "ed7cfddd313f3ec568f95abae38b337ebf339cddd378ee2f91c86e5da53374e5",
"fileName": "Miniconda3-py39_24.3.0-0-MacOSX-x86_64.sh",
"type": "SHELL_SCRIPT"
}
],
"tags": [
"PYTHON39"
]
},
{
"os": "macOS",
"cpuArch": "X86_64",
"resources": [
{
"url": "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.3.0-0-MacOSX-x86_64.pkg",
"size": 104431720,
"sha256": "bb8ea7817437a2dd65daf981a22bd2e4d7ec603ab71d37f40bfcf3378dbdc895",
"fileName": "Miniconda3-py39_24.3.0-0-MacOSX-x86_64.pkg",
"type": "APPLE_SOFTWARE_PACKAGE"
}
],
"tags": [
"PYTHON39"
]
},
{
"os": "macOS",
"cpuArch": "ARM64",
"resources": [
{
"url": "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.3.0-0-MacOSX-arm64.sh",
"size": 102462725,
"sha256": "f091e4e2d7c2521d40c8c2e561c344a401cf9900e4efa122bf1c93fd6ae5cc9c",
"fileName": "Miniconda3-py39_24.3.0-0-MacOSX-arm64.sh",
"type": "SHELL_SCRIPT"
}
],
"tags": [
"PYTHON39"
]
},
{
"os": "macOS",
"cpuArch": "ARM64",
"resources": [
{
"url": "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.3.0-0-MacOSX-arm64.pkg",
"size": 101705090,
"sha256": "f8c364c227cb452d81b55abda67d9a89e86070efaf1f2b0973ce6e22e9a4fa6a",
"fileName": "Miniconda3-py39_24.3.0-0-MacOSX-arm64.pkg",
"type": "APPLE_SOFTWARE_PACKAGE"
}
],
"tags": [
"PYTHON39"
]
},
{
"os": "Linux",
"cpuArch": "X86_64",
"resources": [
{
"url": "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.3.0-0-Linux-x86_64.sh",
"size": 131503805,
"sha256": "1c3d44e987dc56c7d8954419fa1a078be5ddbc293d8cb98b184a23f9a270faad",
"fileName": "Miniconda3-py39_24.3.0-0-Linux-x86_64.sh",
"type": "SHELL_SCRIPT"
}
],
"tags": [
"PYTHON39"
]
},
{
"os": "Linux",
"cpuArch": "OTHER",
"resources": [
{
"url": "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.3.0-0-Linux-s390x.sh",
"size": 127779570,
"sha256": "1570e27adba2dcc24b182c21cd4e793ab5719aa5b1f7f8e29c16ec74d6d9a16f",
"fileName": "Miniconda3-py39_24.3.0-0-Linux-s390x.sh",
"type": "SHELL_SCRIPT"
}
],
"tags": [
"PYTHON39"
]
},
{
"os": "Linux",
"cpuArch": "ARM64",
"resources": [
{
"url": "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.3.0-0-Linux-aarch64.sh",
"size": 125430036,
"sha256": "860f532a33501cf0eccc2677048e21db4a12151938d181821af3e5d30e2dc390",
"fileName": "Miniconda3-py39_24.3.0-0-Linux-aarch64.sh",
"type": "SHELL_SCRIPT"
}
],
"tags": [
"PYTHON39"
]
},
{
"os": "Windows",
"cpuArch": "X86_64",
"resources": [
{
"url": "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.3.0-0-Windows-x86_64.exe",
"size": 81274240,
"sha256": "21b56b75861573ec8ab146d555b20e1ed4462a06aa286d7e92a1cd31acc64dba",
"fileName": "Miniconda3-py312_24.3.0-0-Windows-x86_64.exe",
"type": "MICROSOFT_WINDOWS_EXECUTABLE"
}
],
"tags": [
"PYTHON312"
]
},
{
"os": "macOS",
"cpuArch": "X86_64",
"resources": [
{
"url": "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.3.0-0-MacOSX-x86_64.sh",
"size": 107987235,
"sha256": "fd71a4bf03fbb21d4b4d25245f17bef6308dfec478e901a60594dfa02e4605eb",
"fileName": "Miniconda3-py312_24.3.0-0-MacOSX-x86_64.sh",
"type": "SHELL_SCRIPT"
}
],
"tags": [
"PYTHON312"
]
},
{
"os": "macOS",
"cpuArch": "X86_64",
"resources": [
{
"url": "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.3.0-0-MacOSX-x86_64.pkg",
"size": 107294031,
"sha256": "040fe2b7508587a9c55bf27e83cbf25de2639efa449d7b78e6d8a9e52c5074ed",
"fileName": "Miniconda3-py312_24.3.0-0-MacOSX-x86_64.pkg",
"type": "APPLE_SOFTWARE_PACKAGE"
}
],
"tags": [
"PYTHON312"
]
},
{
"os": "macOS",
"cpuArch": "ARM64",
"resources": [
{
"url": "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.3.0-0-MacOSX-arm64.sh",
"size": 106927367,
"sha256": "72d4e9198a6884c0bd86cce2b4a3e8abb05415776e3b142c4b1de625bbaf4c50",
"fileName": "Miniconda3-py312_24.3.0-0-MacOSX-arm64.sh",
"type": "SHELL_SCRIPT"
}
],
"tags": [
"PYTHON312"
]
},
{
"os": "macOS",
"cpuArch": "ARM64",
"resources": [
{
"url": "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.3.0-0-MacOSX-arm64.pkg",
"size": 106154814,
"sha256": "1d7505562b59d28872a5d4066a0f44d1714e57f2a953138ed51883af4bde43c4",
"fileName": "Miniconda3-py312_24.3.0-0-MacOSX-arm64.pkg",
"type": "APPLE_SOFTWARE_PACKAGE"
}
],
"tags": [
"PYTHON312"
]
},
{
"os": "Linux",
"cpuArch": "X86_64",
"resources": [
{
"url": "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.3.0-0-Linux-x86_64.sh",
"size": 143351488,
"sha256": "96a44849ff17e960eeb8877ecd9055246381c4d4f2d031263b63fa7e2e930af1",
"fileName": "Miniconda3-py312_24.3.0-0-Linux-x86_64.sh",
"type": "SHELL_SCRIPT"
}
],
"tags": [
"PYTHON312"
]
},
{
"os": "Linux",
"cpuArch": "OTHER",
"resources": [
{
"url": "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.3.0-0-Linux-s390x.sh",
"size": 138838773,
"sha256": "b601cb8e3ea65a4ed1aecd96d4f3d14aca5b590b2e1ab0ec5c04c825f5c5e439",
"fileName": "Miniconda3-py312_24.3.0-0-Linux-s390x.sh",
"type": "SHELL_SCRIPT"
}
],
"tags": [
"PYTHON312"
]
},
{
"os": "Linux",
"cpuArch": "ARM64",
"resources": [
{
"url": "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.3.0-0-Linux-aarch64.sh",
"size": 115630358,
"sha256": "05f70cbc89b6caf84e22db836f7696a16b617992eb23d6102acf7651eb132365",
"fileName": "Miniconda3-py312_24.3.0-0-Linux-aarch64.sh",
"type": "SHELL_SCRIPT"
}
],
"tags": [
"PYTHON312"
]
},
{
"os": "Windows",
"cpuArch": "X86_64",
"resources": [
{
"url": "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.3.0-0-Windows-x86_64.exe",
"size": 83663592,
"sha256": "de2e3f93137f8162b224abd2c3e545229ef7718c31922e816d686d8024d95e4b",
"fileName": "Miniconda3-py311_24.3.0-0-Windows-x86_64.exe",
"type": "MICROSOFT_WINDOWS_EXECUTABLE"
}
],
"tags": [
"PYTHON311"
]
},
{
"os": "macOS",
"cpuArch": "X86_64",
"resources": [
{
"url": "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.3.0-0-MacOSX-x86_64.sh",
"size": 110035235,
"sha256": "fdd6294aaa0472f7ddeac89deacceec1469e76bd2a16ac11f37b4ab584fe5089",
"fileName": "Miniconda3-py311_24.3.0-0-MacOSX-x86_64.sh",
"type": "SHELL_SCRIPT"
}
],
"tags": [
"PYTHON311"
]
},
{
"os": "macOS",
"cpuArch": "X86_64",
"resources": [
{
"url": "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.3.0-0-MacOSX-x86_64.pkg",
"size": 109344963,
"sha256": "aeae2b1333d2ea44287c225a450119b4c47e3c9f252e3ca247ec167e3169ab9c",
"fileName": "Miniconda3-py311_24.3.0-0-MacOSX-x86_64.pkg",
"type": "APPLE_SOFTWARE_PACKAGE"
}
],
"tags": [
"PYTHON311"
]
},
{
"os": "macOS",
"cpuArch": "ARM64",
"resources": [
{
"url": "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.3.0-0-MacOSX-arm64.sh",
"size": 107336967,
"sha256": "b7663626fedf8395d3fed78383b08060a13bd6747003bdb2a39220407f55cf65",
"fileName": "Miniconda3-py311_24.3.0-0-MacOSX-arm64.sh",
"type": "SHELL_SCRIPT"
}
],
"tags": [
"PYTHON311"
]
},
{
"os": "macOS",
"cpuArch": "ARM64",
"resources": [
{
"url": "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.3.0-0-MacOSX-arm64.pkg",
"size": 106568885,
"sha256": "dcb67032c52c02f689d98c40d0ba2e93a627f82c78e58b1e4bf54de8a55eae84",
"fileName": "Miniconda3-py311_24.3.0-0-MacOSX-arm64.pkg",
"type": "APPLE_SOFTWARE_PACKAGE"
}
],
"tags": [
"PYTHON311"
]
},
{
"os": "Linux",
"cpuArch": "X86_64",
"resources": [
{
"url": "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.3.0-0-Linux-x86_64.sh",
"size": 141446848,
"sha256": "4da8dde69eca0d9bc31420349a204851bfa2a1c87aeb87fe0c05517797edaac4",
"fileName": "Miniconda3-py311_24.3.0-0-Linux-x86_64.sh",
"type": "SHELL_SCRIPT"
}
],
"tags": [
"PYTHON311"
]
},
{
"os": "Linux",
"cpuArch": "OTHER",
"resources": [
{
"url": "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.3.0-0-Linux-s390x.sh",
"size": 137343733,
"sha256": "8e52dd1300c9462367d303a596a931e6ef8db422c7c79194efa6fdb152c92b61",
"fileName": "Miniconda3-py311_24.3.0-0-Linux-s390x.sh",
"type": "SHELL_SCRIPT"
}
],
"tags": [
"PYTHON311"
]
},
{
"os": "Linux",
"cpuArch": "ARM64",
"resources": [
{
"url": "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.3.0-0-Linux-aarch64.sh",
"size": 117668118,
"sha256": "49082882752167cdea60e1aeedac7b73136bdfdd63b9bb3aca3c038901544458",
"fileName": "Miniconda3-py311_24.3.0-0-Linux-aarch64.sh",
"type": "SHELL_SCRIPT"
}
],
"tags": [
"PYTHON311"
]
},
{
"os": "Windows",
"cpuArch": "X86_64",
"resources": [
{
"url": "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.3.0-0-Windows-x86_64.exe",
"size": 79884560,
"sha256": "5c683a007e5383b1a566c15c25972b35f33bc2c9252333c82dbd94513173321e",
"fileName": "Miniconda3-py310_24.3.0-0-Windows-x86_64.exe",
"type": "MICROSOFT_WINDOWS_EXECUTABLE"
}
],
"tags": [
"PYTHON310"
]
},
{
"os": "macOS",
"cpuArch": "X86_64",
"resources": [
{
"url": "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.3.0-0-MacOSX-x86_64.sh",
"size": 105806115,
"sha256": "094c5a94818caf41deba41411876c3cffa918efdf8ada40dc32bcc535d181c78",
"fileName": "Miniconda3-py310_24.3.0-0-MacOSX-x86_64.sh",
"type": "SHELL_SCRIPT"
}
],
"tags": [
"PYTHON310"
]
},
{
"os": "macOS",
"cpuArch": "X86_64",
"resources": [
{
"url": "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.3.0-0-MacOSX-x86_64.pkg",
"size": 105126220,
"sha256": "26a4ce2553d4443a8865b1cd9357e9a2d38faf599a0ff8eaeb0dc48a9b86ef47",
"fileName": "Miniconda3-py310_24.3.0-0-MacOSX-x86_64.pkg",
"type": "APPLE_SOFTWARE_PACKAGE"
}
],
"tags": [
"PYTHON310"
]
},
{
"os": "macOS",
"cpuArch": "ARM64",
"resources": [
{
"url": "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.3.0-0-MacOSX-arm64.sh",
"size": 103097607,
"sha256": "ceae63e7c99b4ff33ddb1a9973956d829d4a00d39f1f7c6e2056e0e076059535",
"fileName": "Miniconda3-py310_24.3.0-0-MacOSX-arm64.sh",
"type": "SHELL_SCRIPT"
}
],
"tags": [
"PYTHON310"
]
},
{
"os": "macOS",
"cpuArch": "ARM64",
"resources": [
{
"url": "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.3.0-0-MacOSX-arm64.pkg",
"size": 102331278,
"sha256": "9c1d03f42edd7777635a53762d2971113ac3d9f0da5aca92bd6a99e405c8439c",
"fileName": "Miniconda3-py310_24.3.0-0-MacOSX-arm64.pkg",
"type": "APPLE_SOFTWARE_PACKAGE"
}
],
"tags": [
"PYTHON310"
]
},
{
"os": "Linux",
"cpuArch": "X86_64",
"resources": [
{
"url": "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.3.0-0-Linux-x86_64.sh",
"size": 134094528,
"sha256": "def595b1b182749df0974cddb5c8befe70664ace16403d7a7bf54467be5ea48b",
"fileName": "Miniconda3-py310_24.3.0-0-Linux-x86_64.sh",
"type": "SHELL_SCRIPT"
}
],
"tags": [
"PYTHON310"
]
},
{
"os": "Linux",
"cpuArch": "OTHER",
"resources": [
{
"url": "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.3.0-0-Linux-s390x.sh",
"size": 130605812,
"sha256": "fb0f113b0ad2eb9a05b017f49d4a27960ff9ec3d8ec0b580b79efb8c84d15d8e",
"fileName": "Miniconda3-py310_24.3.0-0-Linux-s390x.sh",
"type": "SHELL_SCRIPT"
}
],
"tags": [
"PYTHON310"
]
},
{
"os": "Linux",
"cpuArch": "ARM64",
"resources": [
{
"url": "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.3.0-0-Linux-aarch64.sh",
"size": 114166038,
"sha256": "cacbd0c4b829dae73ddbcee6b30674dc7aa20bf6dea720929fb01d4b6279f743",
"fileName": "Miniconda3-py310_24.3.0-0-Linux-aarch64.sh",
"type": "SHELL_SCRIPT"
}
],
"tags": [
"PYTHON310"
]
}
],
"title": "Miniconda 24.3.0-0"
},
{
"version": "2024.02-1",
"product": "Anaconda",

View File

@@ -8,6 +8,7 @@ import com.intellij.openapi.projectRoots.Sdk
import com.intellij.openapi.projectRoots.impl.ProjectJdkImpl
import com.intellij.openapi.util.NlsContexts
import com.intellij.openapi.util.UserDataHolder
import com.intellij.openapi.util.Version
import com.intellij.openapi.util.text.HtmlBuilder
import com.intellij.openapi.util.text.HtmlChunk
import com.intellij.openapi.util.text.StringUtil
@@ -16,6 +17,7 @@ import com.intellij.ui.SimpleTextAttributes
import com.intellij.util.concurrency.annotations.RequiresEdt
import com.jetbrains.python.PyBundle
import com.jetbrains.python.sdk.installer.BinaryInstallation
import com.jetbrains.python.sdk.installer.installBinary
import com.jetbrains.python.sdk.installer.toResourcePreview
import org.jetbrains.annotations.CalledInAny
@@ -73,6 +75,13 @@ class PySdkToInstall(val installation: BinaryInstallation)
@RequiresEdt
fun install(module: Module?, systemWideSdksDetector: () -> List<PyDetectedSdk>): PyDetectedSdk? {
return PySdkToInstallManager.install(this, module, systemWideSdksDetector)
val project = module?.project
return installBinary(installation, project) {
PySdkToInstallManager.findInstalledSdk(
languageLevel = Version.parseVersion(installation.release.version).toLanguageLevel(),
project = project,
systemWideSdksDetector = systemWideSdksDetector
)
}
}
}

View File

@@ -1,86 +0,0 @@
// Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package com.jetbrains.python.sdk
import com.intellij.internal.statistic.eventLog.EventLogGroup
import com.intellij.internal.statistic.eventLog.events.EventFields
import com.intellij.internal.statistic.eventLog.events.EventPair
import com.intellij.internal.statistic.service.fus.collectors.CounterUsagesCollector
import com.intellij.openapi.project.Project
import com.jetbrains.python.sdk.installer.*
internal object PySdkToInstallCollector : CounterUsagesCollector() {
override fun getGroup(): EventLogGroup = GROUP
internal enum class OS(val os: com.intellij.util.system.OS) {
WIN(com.intellij.util.system.OS.Windows),
MAC(com.intellij.util.system.OS.macOS),
Linux(com.intellij.util.system.OS.Linux),
FreeBSD(com.intellij.util.system.OS.FreeBSD),
Other(com.intellij.util.system.OS.Other);
companion object {
val CURRENT = entries.first { it.os == com.intellij.util.system.OS.CURRENT }
}
}
enum class DownloadResult { EXCEPTION, SIZE, CHECKSUM, CANCELLED, OK }
enum class InstallationResult { EXCEPTION, EXIT_CODE, TIMEOUT, CANCELLED, OK }
enum class LookupResult { FOUND, NOT_FOUND }
internal fun logSdkLookup(project: Project?, version: String? = null, result: LookupResult) {
val args = mutableListOf<EventPair<*>>(lookupResultField.with(result), osField.with(OS.CURRENT))
version?.apply { args.add(versionField.with(this)) }
lookupEvent.log(project, *args.toTypedArray())
}
internal fun logSdkDownload(project: Project?, version: String, result: DownloadResult) {
downloadEventWin.log(project, result, version)
}
internal fun logSdkInstall(project: Project?, version: String? = null, result: InstallationResult) {
val args = mutableListOf<EventPair<*>>(installationResultField.with(result), osField.with(OS.CURRENT))
version?.apply { args.add(versionField.with(this)) }
installationEvent.log(project, *args.toTypedArray())
}
internal fun logInstallerException(project: Project?, release: Release, exception: BinaryInstallerException) {
when (exception) {
is PrepareException -> {
when (exception) {
is WrongSizePrepareException -> DownloadResult.SIZE
is WrongChecksumPrepareException -> DownloadResult.CHECKSUM
is CancelledPrepareException -> DownloadResult.CANCELLED
else -> DownloadResult.EXCEPTION
}.let { logSdkDownload(project, release.version, it) }
}
is ProcessException -> {
when (exception) {
is NonZeroExitCodeProcessException -> InstallationResult.EXIT_CODE
is TimeoutProcessException -> InstallationResult.TIMEOUT
is CancelledProcessException -> InstallationResult.CANCELLED
else -> InstallationResult.EXCEPTION
}.let { logSdkInstall(project, release.version, it) }
}
}
}
private val GROUP = EventLogGroup("python.sdk.install.events", 4)
private val versionField = EventFields.StringValidatedByRegexpReference("py_version", "version")
private val osField = EventFields.Enum("os", OS::class.java)
private val downloadEventWin = GROUP.registerEvent("install.download.win",
EventFields.Enum("download_result", DownloadResult::class.java),
versionField)
private val installationResultField = EventFields.Enum("installation_result", InstallationResult::class.java)
private val installationEvent = GROUP.registerVarargEvent("install.installation", installationResultField, osField, versionField)
private val lookupResultField = EventFields.Enum("lookup_result", LookupResult::class.java)
private val lookupEvent = GROUP.registerVarargEvent("install.lookup", lookupResultField, osField, versionField)
}

View File

@@ -4,19 +4,13 @@ package com.jetbrains.python.sdk
import com.intellij.execution.configurations.GeneralCommandLine
import com.intellij.execution.util.ExecUtil
import com.intellij.openapi.diagnostic.debug
import com.intellij.openapi.module.Module
import com.intellij.openapi.progress.ProgressIndicator
import com.intellij.openapi.progress.ProgressManager
import com.intellij.openapi.progress.Task
import com.intellij.openapi.project.Project
import com.intellij.openapi.ui.Messages
import com.intellij.openapi.util.Version
import com.intellij.util.concurrency.annotations.RequiresEdt
import com.jetbrains.python.PyBundle
import com.jetbrains.python.PySdkBundle
import com.jetbrains.python.psi.LanguageLevel
import com.jetbrains.python.sdk.flavors.PythonSdkFlavor
import com.jetbrains.python.sdk.installer.*
import com.jetbrains.python.sdk.installer.BinaryInstallation
import com.jetbrains.python.sdk.installer.BinaryInstallerUsagesCollector
import com.jetbrains.python.sdk.installer.ResourceTypeBinaryInstaller
import java.nio.file.Path
import kotlin.io.path.absolutePathString
@@ -50,62 +44,6 @@ object PySdkToInstallManager {
}.toMap()
}
fun install(binaryInstallation: BinaryInstallation, project: Project?, indicator: ProgressIndicator) {
val (release, binary, installer) = binaryInstallation
installer.install(binary, indicator) {
PySdkToInstallCollector.logSdkDownload(
project, release.version, PySdkToInstallCollector.DownloadResult.OK
)
}
PySdkToInstallCollector.logSdkInstall(
project, release.version, PySdkToInstallCollector.InstallationResult.OK
)
}
fun install(sdk: PySdkToInstall, project: Project?, indicator: ProgressIndicator) {
install(sdk.installation, project, indicator)
}
@RequiresEdt
fun install(sdk: PySdkToInstall, module: Module?, systemWideSdksDetector: () -> List<PyDetectedSdk>): PyDetectedSdk? {
val project = module?.project
try {
return ProgressManager.getInstance().run(
object : Task.WithResult<PyDetectedSdk?, Exception>(project, PyBundle.message("python.sdk.installing", sdk.name), true) {
override fun compute(indicator: ProgressIndicator): PyDetectedSdk? {
install(sdk, project, indicator)
return findInstalledSdk(
languageLevel = Version.parseVersion(sdk.installation.release.version).toLanguageLevel(),
project = project,
systemWideSdksDetector = systemWideSdksDetector
)
}
}
)
}
catch (ex: BinaryInstallerException) {
LOGGER.info(ex)
PySdkToInstallCollector.logInstallerException(project, sdk.installation.release, ex)
showErrorNotification(project, sdk.installation.release, ex)
}
return null
}
private fun showErrorNotification(project: Project?, release: Release, ex: BinaryInstallerException) {
val title = when (ex) {
is PrepareException -> PyBundle.message("python.sdk.download.failed.title", release.title)
else -> PyBundle.message("python.sdk.installation.failed.title", release.title)
}
val message = when (ex) {
is CancelledProcessException, is CancelledPrepareException -> PyBundle.message("python.sdk.installation.cancelled.message")
is PrepareException -> PyBundle.message("python.sdk.download.failed.message")
else -> PyBundle.message("python.sdk.try.to.install.python.manually")
}
Messages.showErrorDialog(project, message, title)
}
private fun getLanguageLevelInstallations(product: Product = Product.CPython): Map<LanguageLevel, List<BinaryInstallation>> {
return SdksKeeper.pythonReleasesByLanguageLevel().mapValues { (_, releases) ->
val releaseBinaries = releases
@@ -123,7 +61,7 @@ object PySdkToInstallManager {
}
private fun findInstalledSdk(languageLevel: LanguageLevel?,
fun findInstalledSdk(languageLevel: LanguageLevel?,
project: Project?,
systemWideSdksDetector: () -> List<PyDetectedSdk>): PyDetectedSdk? {
LOGGER.debug("Resetting system-wide sdks detectors")
@@ -140,12 +78,13 @@ object PySdkToInstallManager {
languageLevel?.equals(detectedLevel) ?: true
}
.also {
PySdkToInstallCollector.logSdkLookup(
BinaryInstallerUsagesCollector.logLookupEvent(
project,
Product.CPython,
languageLevel.toString(),
when (it.isNotEmpty()) {
true -> PySdkToInstallCollector.LookupResult.FOUND
false -> PySdkToInstallCollector.LookupResult.NOT_FOUND
true -> BinaryInstallerUsagesCollector.LookupResult.FOUND
false -> BinaryInstallerUsagesCollector.LookupResult.NOT_FOUND
}
)
}

View File

@@ -8,6 +8,7 @@ import com.intellij.openapi.progress.Task
import com.intellij.openapi.project.Project
import com.intellij.openapi.ui.Messages
import com.intellij.util.concurrency.annotations.RequiresEdt
import com.intellij.util.lateinitVal
import com.jetbrains.python.PyBundle
import com.jetbrains.python.sdk.*
@@ -59,25 +60,27 @@ fun Release.selectInstallations(installers: List<BinaryInstaller>): List<BinaryI
}
@RequiresEdt
fun installBinary(installation: BinaryInstallation, project: Project?) {
fun <T> installBinary(installation: BinaryInstallation, project: Project?, postInstall: () -> T? = { null }): T? {
val (release, binary, installer) = installation
try {
ProgressManager.getInstance().run(
object : Task.WithResult<Unit, Exception>(project, PyBundle.message("python.sdk.installing", release.title), true) {
override fun compute(indicator: ProgressIndicator) {
return ProgressManager.getInstance().run(
object : Task.WithResult<T, Exception>(project, PyBundle.message("python.sdk.installing", release.title), true) {
override fun compute(indicator: ProgressIndicator): T? {
installer.install(binary, indicator) {
BinaryInstallerUsagesCollector.logDownloadEvent(release, BinaryInstallerUsagesCollector.DownloadResult.OK)
BinaryInstallerUsagesCollector.logDownloadEvent(project, release, BinaryInstallerUsagesCollector.DownloadResult.OK)
}
BinaryInstallerUsagesCollector.logInstallationEvent(release, BinaryInstallerUsagesCollector.InstallationResult.OK)
BinaryInstallerUsagesCollector.logInstallationEvent(project, release, BinaryInstallerUsagesCollector.InstallationResult.OK)
return postInstall()
}
}
)
}
catch (ex: BinaryInstallerException) {
LOGGER.info(ex)
BinaryInstallerUsagesCollector.logInstallerException(installation.release, ex)
BinaryInstallerUsagesCollector.logInstallerException(project, installation.release, ex)
showErrorNotification(project, release, ex)
}
return null
}
private fun showErrorNotification(project: Project?, release: Release, ex: BinaryInstallerException) {

View File

@@ -6,8 +6,8 @@ import com.intellij.internal.statistic.eventLog.events.EventField
import com.intellij.internal.statistic.eventLog.events.EventFields
import com.intellij.internal.statistic.eventLog.events.EventPair
import com.intellij.internal.statistic.service.fus.collectors.CounterUsagesCollector
import com.intellij.openapi.project.Project
import com.intellij.util.system.CpuArch
import com.intellij.util.system.OS
import com.jetbrains.python.sdk.Product
import com.jetbrains.python.sdk.Release
@@ -17,16 +17,22 @@ internal object BinaryInstallerUsagesCollector : CounterUsagesCollector() {
enum class DownloadResult { EXCEPTION, SIZE, CHECKSUM, CANCELLED, OK }
enum class InstallationResult { EXCEPTION, EXIT_CODE, TIMEOUT, CANCELLED, OK }
enum class LookupResult { FOUND, NOT_FOUND }
fun logDownloadEvent(release: Release, downloadResult: DownloadResult) {
downloadEvent.log(DownloadEventFields.getEventPairs(release, downloadResult))
fun logDownloadEvent(project: Project?, release: Release, downloadResult: DownloadResult) {
downloadEvent.log(project, DownloadEventFields.getEventPairs(release, downloadResult))
}
fun logInstallationEvent(release: Release, installationResult: InstallationResult) {
installationEvent.log(InstallationEventFields.getEventPairs(release, installationResult))
fun logInstallationEvent(project: Project?, release: Release, installationResult: InstallationResult) {
installationEvent.log(project, InstallationEventFields.getEventPairs(release, installationResult))
}
internal fun logInstallerException(release: Release, exception: BinaryInstallerException) {
fun logLookupEvent(project: Project?, product: Product, version: String?, lookupResult: LookupResult) {
lookupEvent.log(project, LookupEventFields.getEventPairs(product, version, lookupResult))
}
internal fun logInstallerException(project: Project?, release: Release, exception: BinaryInstallerException) {
when (exception) {
is PrepareException -> {
when (exception) {
@@ -34,7 +40,7 @@ internal object BinaryInstallerUsagesCollector : CounterUsagesCollector() {
is WrongChecksumPrepareException -> DownloadResult.CHECKSUM
is CancelledPrepareException -> DownloadResult.CANCELLED
else -> DownloadResult.EXCEPTION
}.let { logDownloadEvent(release, it) }
}.let { logDownloadEvent(project, release, it) }
}
is ProcessException -> {
when (exception) {
@@ -42,7 +48,7 @@ internal object BinaryInstallerUsagesCollector : CounterUsagesCollector() {
is TimeoutProcessException -> InstallationResult.TIMEOUT
is CancelledProcessException -> InstallationResult.CANCELLED
else -> InstallationResult.EXCEPTION
}.let { logInstallationEvent(release, it) }
}.let { logInstallationEvent(project, release, it) }
}
}
}
@@ -58,21 +64,24 @@ internal object BinaryInstallerUsagesCollector : CounterUsagesCollector() {
*/
private val version = EventFields.StringValidatedByInlineRegexp("version", """^[\d\-.]+$""")
private val os = EventFields.Enum("os", OS::class.java)
private val cpuArch = EventFields.Enum("cpu_arch", CpuArch::class.java)
fun getEventPairs(release: Release): List<EventPair<*>> {
return listOf(
product.with(release.product),
version.with(release.version),
os.with(OS.CURRENT),
cpuArch.with(CpuArch.CURRENT),
)
return getEventPairs(release.product, release.version)
}
fun getEventPairs(product: Product, version: String?): List<EventPair<*>> {
return buildList {
add(this@ContextFields.product.with(product))
version?.let {
add(this@ContextFields.version.with(it))
}
add(cpuArch.with(CpuArch.CURRENT))
}
}
fun getFields(): MutableList<EventField<*>> {
return mutableListOf(product, version, os, cpuArch)
return mutableListOf(product, version, cpuArch)
}
}
@@ -98,7 +107,18 @@ internal object BinaryInstallerUsagesCollector : CounterUsagesCollector() {
}
}
private val GROUP = EventLogGroup("python.sdk.installer.events", 1)
object LookupEventFields {
private val lookupResult = EventFields.Enum("lookup_result", LookupResult::class.java)
fun getEventPairs(product: Product, version: String?, result: LookupResult): List<EventPair<*>> {
return ContextFields.getEventPairs(product, version) + listOf(lookupResult.with(result))
}
fun getFields(): List<EventField<*>> {
return ContextFields.getFields() + listOf(lookupResult)
}
}
private val GROUP = EventLogGroup("python.sdk.installer.events", 2)
private val downloadEvent = GROUP.registerVarargEvent(
eventId = "download.finished", fields = DownloadEventFields.getFields().toTypedArray()
@@ -107,4 +127,8 @@ internal object BinaryInstallerUsagesCollector : CounterUsagesCollector() {
private val installationEvent = GROUP.registerVarargEvent(
eventId = "installation.finished", fields = InstallationEventFields.getFields().toTypedArray()
)
private val lookupEvent = GROUP.registerVarargEvent(
eventId = "lookup.finished", fields = LookupEventFields.getFields().toTypedArray()
)
}

View File

@@ -454,7 +454,6 @@
<statistics.projectUsagesCollector implementation="com.jetbrains.python.statistics.PyInterpreterUsagesCollector"/>
<statistics.projectUsagesCollector implementation="com.jetbrains.python.statistics.PyPackageVersionUsagesCollector"/>
<statistics.projectUsagesCollector implementation="com.jetbrains.python.statistics.PyPackageInEditorUsageCollector"/>
<statistics.counterUsagesCollector implementationClass="com.jetbrains.python.sdk.PySdkToInstallCollector"/>
<statistics.counterUsagesCollector implementationClass="com.jetbrains.python.namespacePackages.PyNamespacePackagesStatisticsCollector"/>
<statistics.counterUsagesCollector implementationClass="com.jetbrains.python.codeInsight.codeVision.PyCodeVisionUsageCollector"/>
<statistics.counterUsagesCollector implementationClass="com.jetbrains.python.newProject.collector.PythonNewProjectWizardCollector"/>