meta_package_manager.managers.pwsh_gallery module¶
- class meta_package_manager.managers.pwsh_gallery.PWSH_Gallery[source]¶
Bases:
PackageManagerPowerShell Gallery client, driven through the modern Microsoft.PowerShell.PSResourceGet module.
Note
Only
pwsh(PowerShell 7+) is supported. Legacy Windows PowerShell 5.1 is intentionally excluded: it shipsPowerShellGetv2, which depends on the NuGet provider and prompts to trustPSGalleryon first install.PSResourceGetships bundled withpwsh7.4+ and supersedes the v2 cmdlets with cleaner, JSON-friendly objects.Caution
All install and search operations target
-Scope CurrentUserso thatmpmdoes not require elevation.upgradeandremoveare scope- agnostic and operate on whichever scope holds each module.Caution
Install-PSResourceis invoked with-TrustRepositoryso the confirmation prompt on the defaultPSGalleryrepository is bypassed. Only the default repository is consulted: third-partyPSRepositoryregistrations are out of scope.Initialize
cli_errorslist.- name: str = 'PowerShell Gallery'¶
The metaclass derives
id = "pwsh-gallery"from the class name (PWSH_Gallery: lowercased, underscore→dash).namehere is the official product name shown to users.
- homepage_url: str | None = 'https://www.powershellgallery.com'¶
Home page of the project, only used in documentation for reference.
Left unset when the home page is the project’s repository, which
repository_urlnames on its own, and when it is the project’s manual, whichdocumentation_urlnames. Never inherited, like the other links.
- documentation_url: str | None = 'https://learn.microsoft.com/powershell/module/microsoft.powershell.psresourceget'¶
Entry point of the project’s own documentation, or
Nonewhen it has none.The manual, the documentation site, or the man page of the CLI
mpmdrives: whichever page a user reads to learn the commands this manager wraps. Listed betweenhomepage_urlandrepository_urlin the links of the manager’s page, so a reader reaching for the tool’s reference finds it in the box of facts rather than in the prose below it.Left unset where a link would state a fact twice or invent one: a tool documenting itself in its repository alone, whose README
repository_urlalready reaches. A page about the ecosystem rather than the tool does not qualify either.Where a project’s only site is its manual, that address belongs here and
homepage_urlstays unset: the slot names what the page is, and a reader reaching for the reference looks under the documentation link.Never inherited, like every other link: the AUR helpers extending
pacmaneach document themselves.
- repository_url: str | None = 'https://github.com/PowerShell/PSResourceGet'¶
Repository holding the project’s code, or
Nonewhen it has no public one.Linked from the manager’s documentation page. Also what the weekly metrics sample reads:
docs/docs_update.pywrites it into the[tool.repomatic.metrics] subjectsofpyproject.tomlwhen its forge answers the sampler, through a mirror for a forge that does not.Never inherited, for the same reason as
wikipedia_url: the AUR helpers extendingpacmaneach live in a repository of their own.
- keywords: tuple[str, ...] = ('powershell', 'powershell gallery', 'psgallery', 'psresourceget')¶
Well-known names for this manager that its
iddoes not already carry.Merged into the PyPI keywords of
pyproject.tomlbyupdate_keywords()ofdocs/docs_update.py, alongside every manager ID and the globally curatedKEYWORDS_EXTRAS. Declare an alias here rather than in that tuple whenever it names this manager: an alias living beside the class it describes cannot outlive it, where a central entry silently rots once the manager is renamed or dropped.Reserve
KEYWORDS_EXTRASfor terms belonging to no manager in particular, likecyclonedxorpackage manager. Documentation-only: no CLI output reads it.Each keyword also becomes a content rule of the issue labeller, so its precision bar applies here: see
generate_content_rules(). A subclass inherits the terms of its parent without claiming them, sincetest_manager_keywords_have_one_ownerreads what a class declares itself.
- platforms: frozenset[Platform] | Group | Platform | Iterable[Platform | Group] = frozenset({Platform(id='almalinux', name='AlmaLinux'), Platform(id='alpine', name='Alpine Linux'), Platform(id='altlinux', name='ALT Linux'), Platform(id='amzn', name='Amazon Linux'), Platform(id='android', name='Android'), Platform(id='arch', name='Arch Linux'), Platform(id='buildroot', name='Buildroot'), Platform(id='cachyos', name='CachyOS'), Platform(id='centos', name='CentOS'), Platform(id='chromeos', name='ChromeOS'), Platform(id='clearlinux', name='Clear Linux OS'), Platform(id='cloudlinux', name='CloudLinux OS'), Platform(id='crux', name='CRUX'), Platform(id='debian', name='Debian'), Platform(id='endeavouros', name='EndeavourOS'), Platform(id='exherbo', name='Exherbo Linux'), Platform(id='fedora', name='Fedora'), Platform(id='generic_linux', name='Generic Linux'), Platform(id='gentoo', name='Gentoo Linux'), Platform(id='guix', name='Guix System'), Platform(id='ibm_powerkvm', name='IBM PowerKVM'), Platform(id='kali', name='Kali Linux'), Platform(id='kvmibm', name='KVM for IBM z Systems'), Platform(id='linuxmint', name='Linux Mint'), Platform(id='macos', name='macOS'), Platform(id='mageia', name='Mageia'), Platform(id='mandriva', name='Mandriva Linux'), Platform(id='manjaro', name='Manjaro Linux'), Platform(id='nixos', name='NixOS'), Platform(id='nobara', name='Nobara'), Platform(id='nutyx', name='NuTyX'), Platform(id='opensuse', name='openSUSE'), Platform(id='openwrt', name='OpenWrt'), Platform(id='oracle', name='Oracle Linux'), Platform(id='parallels', name='Parallels'), Platform(id='pidora', name='Pidora'), Platform(id='pikaos', name='PikaOS'), Platform(id='raspbian', name='Raspbian'), Platform(id='rhel', name='RedHat Enterprise Linux'), Platform(id='rocky', name='Rocky Linux'), Platform(id='scientific', name='Scientific Linux'), Platform(id='slackware', name='Slackware'), Platform(id='sles', name='SUSE Linux Enterprise Server'), Platform(id='slitaz', name='SliTaz GNU/Linux'), Platform(id='solus', name='Solus'), Platform(id='sourcemage', name='Source Mage GNU/Linux'), Platform(id='tuxedo', name='Tuxedo OS'), Platform(id='ubuntu', name='Ubuntu'), Platform(id='ultramarine', name='Ultramarine'), Platform(id='void', name='Void Linux'), Platform(id='windows', name='Windows'), Platform(id='wsl1', name='Windows Subsystem for Linux v1'), Platform(id='wsl2', name='Windows Subsystem for Linux v2'), Platform(id='xenserver', name='XenServer')})¶
List of platforms supported by the manager.
Allows for a mishmash of platforms and groups of platforms. Will be normalized into a
frozensetofPlatforminstances at instantiation.
- requirement: str | None = '>=7.4.0'¶
PSResourceGetis bundled with PowerShell 7.4+, which is the floor where every operation below runs without installing extra modules.
- cli_names: tuple[str, ...] = ('pwsh',)¶
List of CLI names the package manager is known as.
This list of recognized CLI names is ordered by priority. That way we can influence the search of the right binary.
- ..hint::
This was helpful in the case of the Python transition from 2.x to 3.x, where multiple versions of the same executable were named
pythonorpython3.
By default, this property’s value is derived from the manager’s ID (see the
MetaPackageManager.__init__method above).
- pre_args: tuple[str, ...] = ('-NoProfile', '-NonInteractive', '-Command')¶
Always invoke
pwshnon-interactively, with no user profile, and run a single-Commandexpression. Each operation passes one PowerShell expression as the final argument; subprocess receives a clean argv list so no shell quoting is required between Python andpwsh.Note
Version detection (
pwsh --version) skipspre_argsbecauseversioncallsrun_cliwithauto_pre_args=False.
- version_regexes: tuple[str, ...] = ('PowerShell\\s+(?P<version>\\S+)',)¶
$ pwsh --version PowerShell 7.4.6
- property installed: Iterator[Package]¶
Fetch installed PowerShell resources.
Get-InstalledPSResourceenumerates every module, script and DSC resource in every installed scope. TheVersionproperty is aNuGetVersionobject:ConvertTo-Jsonwould otherwise serialise it as a structured{Major, Minor, ...}mapping, so it is projected to a string up-front.ConvertTo-Json -AsArrayforces a JSON array even when zero or one resource is returned (single results would otherwise be serialised as a bare object).$ pwsh -NoProfile -NonInteractive -Command \ "Get-InstalledPSResource | \ Select-Object Name, @{n='Version';e={$_.Version.ToString()}} | \ ConvertTo-Json -AsArray -Depth 2 -Compress" [{"Name":"PSReadLine","Version":"2.3.6"}, {"Name":"Pester","Version":"5.5.0"}]
- property outdated: Iterator[Package]¶
Fetch resources with a newer release on the gallery.
PSResourceGethas no built-inoutdatedcmdlet. The comparison is done server-side in a singlepwshinvocation: each installed resource is looked up viaFind-PSResourceand only emitted when the gallery version is strictly greater. Running the loop insidepwshavoids the N+1 round trips that a Python-side comparison would cause.$ pwsh -NoProfile -NonInteractive -Command \ "Get-InstalledPSResource | ForEach-Object { \ $i = $_; \ $l = Find-PSResource -Name $i.Name -ErrorAction SilentlyContinue \ | Select-Object -First 1; \ if ($l -and $l.Version -gt $i.Version) { \ [PSCustomObject]@{ \ Name = $i.Name; \ Installed = $i.Version.ToString(); \ Latest = $l.Version.ToString() \ } } \ } | ConvertTo-Json -AsArray -Depth 2 -Compress" [{"Name":"PSReadLine","Installed":"2.3.4","Latest":"2.3.6"}]
- search(query, extended, exact)[source]¶
Search the gallery.
Find-PSResource -Nameaccepts a wildcard pattern. Wildcards are added aroundqueryfor fuzzy search and dropped for exact match.extendedsearch (matching against description) is not supported byFind-PSResource: results are refiltered in Python by the framework whenextended=True.$ pwsh -NoProfile -NonInteractive -Command \ "Find-PSResource -Name '*readline*' | \ Select-Object Name, @{n='Version';e={$_.Version.ToString()}}, Description | \ ConvertTo-Json -AsArray -Depth 2 -Compress" [{"Name":"PSReadLine","Version":"2.3.6", "Description":"Great command line editing..."}]
- install(package_id, version=None)[source]¶
Install one resource into the current-user scope.
-TrustRepositorybypasses theUntrusted repositoryprompt thatPSGalleryemits on first install.-AcceptLicensesilently accepts any module-bundled license.-Reinstallis not passed: re-runninginstallon an already-installed resource is a no-op, matchingpip installbehaviour.$ pwsh -NoProfile -NonInteractive -Command \ "Install-PSResource -Name 'PSReadLine' -Scope CurrentUser \ -TrustRepository -AcceptLicense"
- Return type:
- id: str = 'pwsh-gallery'¶
Package manager’s ID.
Derived by defaults from the lower-cased class name in which underscores
_are replaced by dashes-.This ID must be unique among all package manager definitions and lower-case, as they’re used as feature flags for the mpm CLI.
- upgrade_all_cli()[source]¶
Upgrade every installed resource to its latest gallery version.
Scope is intentionally not constrained: any installed resource is eligible, regardless of which scope it lives in.
$ pwsh -NoProfile -NonInteractive -Command \ "Update-PSResource -TrustRepository -AcceptLicense"
- virtual: bool = False¶
Should we expose the package manager to the user?
Virtual package manager are just skeleton classes used to factorize code among managers of the same family.
- wikipedia_url: str | None = None¶
English Wikipedia article about the project, or
Nonewhen it has none.Listed last in the links of the manager’s documentation page. The article covers the project that home page names, or is a redirect Wikipedia keeps under the project’s name, landing on the part of a broader article that describes it:
Cargo_(software)opens the Cargo section of the Rust article. An article that merely mentions the project does not count, nor does one about a related subject:lazyis a Neovim plugin manager, and the Neovim article is not about it.Never inherited: the metaclass resets it to
Noneon any class not declaring its own. A subclass often wraps a distinct project, like the six AUR helpers extendingpacman, and would otherwise present pacman’s article as its own. Documentation-only, likehomepage_url.