diff --git a/extensions/terminal-suggest/scripts/update-specs.js b/extensions/terminal-suggest/scripts/update-specs.js index 775c5dd3264..50465e6a282 100644 --- a/extensions/terminal-suggest/scripts/update-specs.js +++ b/extensions/terminal-suggest/scripts/update-specs.js @@ -20,6 +20,18 @@ const indentSearch = [20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, const indentReplaceValue = [20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1].map(e => '\t'.repeat(e)); const specSpecificReplaceStrings = new Map([ + ['docker', [ + [ + 'console.error(error);', + 'console.error(error); return null!;' + ] + ]], + ['dotnet', [ + [ + '.match(argRegex)', + '.match(argRegex)!' + ] + ]], ['git', [ [ 'import { ai } from "@fig/autocomplete-generators";', diff --git a/extensions/terminal-suggest/src/completions/upstream/adb.ts b/extensions/terminal-suggest/src/completions/upstream/adb.ts new file mode 100644 index 00000000000..2811fd43efb --- /dev/null +++ b/extensions/terminal-suggest/src/completions/upstream/adb.ts @@ -0,0 +1,769 @@ +const installOptions: Fig.Option[] = [ + { + name: "-l", + description: "Forward-lock the app", + }, + { + name: "-r", + description: "Replace existing application", + }, + { + name: "-t", + description: "Allow test packages", + }, + { + name: "-d", + description: "Allow version code downgrade (debuggable packages only)", + }, + { + name: "-s", + description: "Install on SD card instead of internal storage", + }, + { + name: "-g", + description: "Grant all runtime permissions", + }, + { + description: "Override platform's default ABI", + name: "--abi", + args: { + name: "ABI", + }, + }, + { + description: "Cause the app to be installed as an ephemeral install app", + name: "--instant", + }, + { + description: + "Always push APK to device and invoke Package Manager as separate steps", + name: "--no-streaming", + }, + { + description: "Force streaming APK directly into Package Manager", + name: "--streaming", + }, + { + description: "Use fast deploy", + name: "--fastdeploy", + }, + { + description: "Prevent use of fast deploy", + name: "--no-fastdeploy", + }, + { + description: "Force update of deployment agent when using fast deploy", + name: "--force-agent", + }, + { + description: + "Update deployment agent when local version is newer and using fast deploy", + name: "--date-check-agent", + }, + { + description: + "Update deployment agent when local version has different version code and using fast deploy", + name: "--version-check-agent", + }, + { + description: + "Locate agent files from local source build (instead of SDK location)", + name: "--local-agent", + }, +]; + +const compressionOptions: Fig.Option[] = [ + { + description: + "Enable compression with a specified algorithm (any, none, brotli)", + name: "-z", + args: { + name: "ALGORITHM", + suggestions: [ + { + name: "any", + }, + { + name: "none", + }, + { + name: "brotli", + }, + ], + }, + }, + { + description: "Disable compression", + name: "-Z", + }, +]; + +const forwardConnectionSuggestions: Fig.Suggestion[] = [ + { + name: "tcp", + insertValue: "tcp:", + }, + { + name: "localabstract", + insertValue: "localabstract:", + }, + { + name: "localreserved", + insertValue: "localreserved:", + }, + { + name: "localfilesystem", + insertValue: "localfilesystem:", + }, + { + name: "dev", + insertValue: "dev:", + }, + { + name: "jdwp", + insertValue: "jdwp:", + }, + { + name: "acceptfd", + insertValue: "acceptfd:", + }, +]; + +const reverseConnectionSuggestions: Fig.Suggestion[] = [ + { + name: "tcp", + insertValue: "tcp:", + }, + { + name: "localabstract", + insertValue: "localabstract:", + }, + { + name: "localreserved", + insertValue: "localreserved:", + }, + { + name: "localfilesystem", + insertValue: "localfilesystem:", + }, +]; + +const completionSpec: Fig.Spec = { + name: "adb", + description: "Android Debug Bridge", + subcommands: [ + { + name: "devices", + description: "List connected devices", + options: [ + { + name: "-l", + description: "Long output", + }, + ], + }, + { + name: "help", + description: "Show this help message", + }, + { + name: "get-state", + description: "Print offline | bootloader | device", + }, + { + name: "get-serialno", + description: "Print ", + }, + { + name: "get-devpath", + description: "Print ", + }, + { + name: "remount", + options: [ + { + name: "-R", + description: "Reboot device", + }, + ], + description: + "Remount partitions read-write. if a reboot is required, -R will automatically reboot the device", + }, + { + name: "jdwp", + description: "List pids of processes hosting a JDWP transport", + }, + { + name: "root", + description: "Restart adbd with root permissions", + }, + { + name: "unroot", + description: "Restart adbd without root permissions", + }, + { + name: "usb", + description: "Restart adbd listening on USB", + }, + { + name: "sideload", + description: "Sideload the given full OTA package", + args: { + name: "OTAPACKAGE", + }, + }, + { + description: "Ensure that there is a server running", + name: "start-server", + }, + { + description: "Kill the server if it is running", + name: "kill-server", + }, + { + description: "Kick connection from host side to force reconnect", + name: "reconnect", + subcommands: [ + { + description: "Kick connection from device side to force reconnect", + name: "device", + }, + { + description: "Reset offline/unauthorized devices to force reconnect`", + name: "offline", + }, + ], + }, + { + name: "tcpip", + description: "Restart adbd listening on TCP on PORT", + args: { + name: "PORT", + }, + }, + { + name: "reboot", + args: { + isOptional: true, + name: "type", + suggestions: [ + { + name: "bootloader", + }, + { + name: "recovery", + }, + { + name: "sideload", + }, + { + name: "sideload-auto-reboot", + }, + ], + }, + description: + "Reboot the device; defaults to booting system image but supports bootloader and recovery too. sideload reboots into recovery and automatically starts sideload mode, sideload-auto-reboot is the same but reboots after sideloading", + }, + { + name: "disable-verity", + description: "Disable dm-verity checking on userdebug builds", + }, + { + name: "enable-verity", + description: "Re-enable dm-verity checking on userdebug builds", + }, + { + name: "wait-for-device", + description: "Wait for state=device", + }, + { + name: "wait-for-recovery", + description: "Wait for state=recovery", + }, + { + name: "wait-for-rescue", + description: "Wait for state=rescue", + }, + { + name: "wait-for-sideload", + description: "Wait for state=sideload", + }, + { + name: "wait-for-bootloader", + description: "Wait for state=bootloader", + }, + { + name: "wait-for-disconnect", + description: "Wait for state=disconnect", + }, + { + name: "wait-for-usb-device", + description: "Wait for usb in state=device", + }, + { + name: "wait-for-usb-recovery", + description: "Wait for usb in state=recovery", + }, + { + name: "wait-for-usb-rescue", + description: "Wait for usb in state=rescue", + }, + { + name: "wait-for-usb-sideload", + description: "Wait for usb in state=sideload", + }, + { + name: "wait-for-usb-bootloader", + description: "Wait for usb in state=bootloader", + }, + { + name: "wait-for-usb-disconnect", + description: "Wait for usb in state=disconnect", + }, + { + name: "wait-for-local-device", + description: "Wait for local in state=device", + }, + { + name: "wait-for-local-recovery", + description: "Wait for local in state=recovery", + }, + { + name: "wait-for-local-rescue", + description: "Wait for local in state=rescue", + }, + { + name: "wait-for-local-sideload", + description: "Wait for local in state=sideload", + }, + { + name: "wait-for-local-bootloader", + description: "Wait for local in state=bootloader", + }, + { + name: "wait-for-local-disconnect", + description: "Wait for local in state=disconnect", + }, + { + name: "wait-for-any-device", + description: "Wait for any in state=device", + }, + { + name: "wait-for-any-recovery", + description: "Wait for any in state=recovery", + }, + { + name: "wait-for-any-rescue", + description: "Wait for any in state=rescue", + }, + { + name: "wait-for-any-sideload", + description: "Wait for any in state=sideload", + }, + { + name: "wait-for-any-bootloader", + description: "Wait for any in state=bootloader", + }, + { + name: "wait-for-any-disconnect", + description: "Wait for any in state=disconnect", + }, + { + name: "keygen", + description: + "Generate adb public/private key; private key stored in FILE", + args: { + name: "FILE", + template: "filepaths", + }, + }, + { + name: "logcat", + description: "Show device log (logcat --help for more)", + }, + { + name: "version", + description: "Show version num", + }, + { + name: "connect", + description: "Connect to a device via TCP/IP [default port=5555]", + args: { + name: "HOST[:PORT]", + }, + }, + { + name: "disconnect", + description: + "Disconnect from given TCP/IP device [default port=5555], or all", + args: { + name: "HOST[:PORT]", + isOptional: true, + }, + }, + { + name: "uninstall", + description: "Remove this app package from the device", + options: [ + { + name: "-k", + description: "Keep the data and cache directories", + }, + ], + }, + { + name: "bugreport", + description: "Write bugreport to given PATH [default=bugreport.zip];", + args: { + name: "PATH", + isOptional: true, + }, + }, + { + name: "pair", + description: "Pair with a device for secure TCP/IP communication", + args: [ + { + name: "HOST[:PORT]", + }, + { + name: "[PAIRING CODE]", + isOptional: true, + }, + ], + }, + { + name: "ppp", + description: "Run PPP over USB", + args: [ + { + name: "TTY", + }, + { + name: "[PARAMETER...]", + isVariadic: true, + isOptional: true, + }, + ], + }, + { + name: "emu", + description: "Run emulator console command", + args: { + name: "COMMAND", + }, + }, + { + name: "install", + description: "Push a single package to the device and install it", + args: { + name: "PACKAGE", + template: "filepaths", + }, + options: installOptions, + }, + { + name: "install-multiple", + description: + "Push multiple APKs to the device for a single package and install them", + args: { + name: "PACKAGE", + template: "filepaths", + isVariadic: true, + }, + options: [ + { + name: "-p", + description: "Partial application install (install-multiple only)", + }, + ...installOptions, + ], + }, + { + name: "install-multi-package", + description: + "Push one or more packages to the device and install them atomically", + args: { + name: "PACKAGE", + template: "filepaths", + isVariadic: true, + }, + options: [ + { + name: "-p", + description: "Partial application install (install-multiple only)", + }, + ...installOptions, + ], + }, + { + name: "shell", + description: + "Run remote shell command (interactive shell if no command given)", + options: [ + { + name: "-e", + description: "Choose escape character, or `none` default '~'", + }, + { + name: "-n", + description: "Don't read from stdin", + }, + { + name: "-T", + description: "Disable pty allocation", + }, + { + name: "-t", + description: "Allocate a pty if on a tty", + }, + { + name: "-tt", + description: "-tt: force pty allocation", + }, + { + name: "-x", + description: "Disable remote exit codes and stdout/stderr separation", + }, + ], + args: { + isOptional: true, + name: "COMMANDS ...", + isVariadic: true, + }, + }, + { + name: "mdns", + description: "Mdns utils", + subcommands: [ + { + name: "check", + description: "Check if mdns discovery is available", + }, + { + name: "services", + description: "List all discovered services", + }, + ], + }, + { + name: "push", + description: "Copy local files/directories to device", + options: [ + { + description: + "Only push files that are newer on the host than the device", + name: "--sync", + }, + { + description: + "Dry run: push files to device without storing to the filesystem", + name: "-n", + }, + ...compressionOptions, + ], + args: [ + { + name: "LOCAL", + isVariadic: true, + template: "filepaths", + }, + { + name: "REMOTE", + }, + ], + }, + { + name: "sync", + description: + "Sync a local build from $ANDROID_PRODUCT_OUT to the device (default all)", + options: [ + { + description: + "Dry run: push files to device without storing to the filesystem", + name: "-n", + }, + { + description: "List files that would be copied, but don't copy them", + name: "-l", + }, + ...compressionOptions, + ], + args: { + isOptional: true, + suggestions: [ + { + name: "all", + }, + { + name: "data", + }, + { + name: "odm", + }, + { + name: "oem", + }, + { + name: "product", + }, + { + name: "system", + }, + { + name: "system_ext", + }, + { + name: "vendor", + }, + ], + }, + }, + { + name: "pull", + description: "Copy files/dirs from device", + options: [ + { + description: "Preserve file timestamp and mode", + name: "-a", + }, + ...compressionOptions, + ], + args: [ + { + name: "REMOTE", + isVariadic: true, + template: "filepaths", + }, + { + name: "LOCAL", + }, + ], + }, + { + name: "forward", + description: "Forward connection", + options: [ + { + name: "--list", + description: "List all forward socket connections", + }, + { + name: "--remove", + description: "Remove specific forward socket connection", + args: { + name: "LOCAL", + }, + }, + { + name: "--remove-all", + description: "Remove all forward socket connections", + }, + { + name: "--no-rebind", + description: + "Reversal fails if the specified socket is already bound through a previous reverse command", + }, + ], + args: [ + { + name: "LOCAL -> port|domain|device|pid", + suggestions: forwardConnectionSuggestions, + }, + { + name: "REMOTE -> port|domain|device|pid", + suggestions: forwardConnectionSuggestions, + }, + ], + }, + { + name: "reverse", + description: "Reverse connection", + options: [ + { + name: "--list", + description: "List all reverse socket connections from device", + }, + { + name: "--remove", + description: "Remove specific reverse socket connection", + args: { + name: "REMOTE", + }, + }, + { + name: "--remove-all", + description: "Remove all reverse socket connections from device", + }, + { + name: "--no-rebind", + description: + "Reversal fails if the specified socket is already bound through a previous reverse command", + }, + ], + args: [ + { + name: "REMOTE -> port|domain|device|pid", + suggestions: reverseConnectionSuggestions, + }, + { + name: "LOCAL -> port|domain|device|pid", + suggestions: reverseConnectionSuggestions, + }, + ], + }, + ], + options: [ + { + description: "Listen on all network interfaces, not just localhost", + name: "-a", + }, + { + description: "Use USB device (error if multiple devices connected)", + name: "-d", + }, + { + description: + "Use TCP/IP device (error if multiple TCP/IP devices available)", + name: "-e", + }, + { + description: "Use device with given serial (overrides $ANDROID_SERIAL)", + name: "-s", + args: { + name: "SERIAL", + }, + }, + { + description: "Use device with given transport id", + name: "-t", + args: { + name: "ID", + }, + }, + { + description: "Name of adb server host [default=localhost]", + name: "-H", + args: { + name: "host name", + }, + }, + { + description: "Port of adb server [default=5037]", + name: "-P", + args: { + name: "port", + }, + }, + { + description: + "Listen on given socket for adb server [default=tcp:localhost:5037]", + name: "-L", + args: { + name: "socket", + }, + }, + ], +}; + +export default completionSpec; diff --git a/extensions/terminal-suggest/src/completions/upstream/bundle.ts b/extensions/terminal-suggest/src/completions/upstream/bundle.ts new file mode 100644 index 00000000000..6a88d7c5460 --- /dev/null +++ b/extensions/terminal-suggest/src/completions/upstream/bundle.ts @@ -0,0 +1,548 @@ +const gemfileGemsGenerator: Fig.Generator = { + script: ["bundle", "list", "--name-only"], + postProcess: (out) => { + return out.split("\n").map((gem) => { + return { + name: gem, + icon: "📦", + description: "Gem", + }; + }); + }, +}; + +const completionSpec: Fig.Spec = { + name: "bundle", + description: "Ruby Dependency Management", + subcommands: [ + // Primary Commands + { + name: "install", + description: "Install the gems specified by the Gemfile or Gemfile.lock", + options: [ + { + name: "--binstubs", + args: { template: "folders" }, + description: "Create binstubs in dir", + }, + { name: "--clean", description: "Remove unused gems after install" }, + { name: "--deployment", description: "For Production and CI use" }, + { + name: ["--force", "--redownload"], + description: "Redownload all gems", + }, + { name: "--frozen", description: "Do not allow lock file to update" }, + { name: "--full-index", description: "Cache the full index locally" }, + { + name: "--gemfile", + args: { template: "filepaths" }, + description: "The gemfile to use", + }, + { + name: "--jobs", + args: {}, + description: "Maximum number of parallel installs", + }, + { + name: "--local", + description: "Use only gems already downloaded or cached", + }, + { name: "--no-cache", description: "Do not use vendor/cache" }, + { name: "--no-prune", description: "Do not remove stale gems" }, + { + name: "--path", + args: { template: "folders" }, + description: "Path the install gems too", + }, + { name: "--quiet", description: "Do not print to stdout" }, + { + name: "--retry", + args: {}, + description: "Retry failed network requests N times", + }, + { + name: "--shebang", + args: {}, + description: "Uses the specified ruby executable for binstubs", + }, + { + name: "--standalone", + args: {}, + description: + "Makes a bundle that can work without depending on Rubygems or Bundler at runtime", + }, + { name: "--system", description: "Use system Rubygems location" }, + { + name: "--trust-policy", + args: {}, + description: "Apply the Rubygems security policy", + }, + { name: "--with", args: {}, description: "Groups to install" }, + { name: "--without", args: {}, description: "Groups to NOT install" }, + ], + }, + { + name: "update", + description: "Update dependencies to their latest versions", + args: { + name: "gem", + generators: gemfileGemsGenerator, + isOptional: true, + }, + options: [ + { + name: "--all", + description: "Update all gems specified in Gemfile", + }, + { + name: ["--group", "-g"], + description: "Only update the gems in the specified group", + args: {}, + }, + { + name: "--source", + description: "The name of a :git or :path source used in the Gemfile", + args: {}, + }, + { + name: "--local", + description: "Use only gems already downloaded or cached", + }, + { + name: "--ruby", + description: + "Update the locked version of Ruby to the current version of Ruby", + }, + { + name: "--bundler", + description: + "Update the locked version of bundler to the invoked bundler version", + }, + { + name: "--full-index", + description: "Fall back to using the single-file index of all gems", + }, + { + name: ["--jobs", "-j"], + description: + "Specify the number of jobs to run in parallel. The default is 1", + args: {}, + }, + { + name: "--retry", + description: "Retry failed network or git requests for number times", + args: {}, + }, + { name: "--quiet", description: "Only output warnings and errors" }, + { + name: ["--force", "--redownload"], + description: "Force downloading every gem", + }, + { + name: "--patch", + description: "Prefer updating only to next patch version", + }, + { + name: "--minor", + description: "Prefer updating only to next minor version", + }, + { + name: "--major", + description: "Prefer updating to next major version (default)", + }, + { + name: "--strict", + description: + "Do not allow any gem to be updated past latest --patch | --minor | --major", + }, + { + name: "--conservative", + description: "Do not allow shared dependencies to be updated", + }, + ], + }, + { + name: "package", + description: + "Package the .gem files required by your application into the vendor/cache directory", + }, + { + name: "exec", + description: "Execute a command in the context of the bundle", + options: [ + { + name: "--keep-file-descriptors", + description: "Pass all file descriptors to the new process", + }, + ], + args: { isCommand: true }, + }, + { name: "config", args: {} }, + { name: "help" }, + + // Utility Commands + { + name: "add", + description: "Add gem to the Gemfile and run bundle install", + args: {}, + options: [ + { + name: ["--version", "-v"], + description: "Specify version requirements", + }, + { + name: ["--group", "-g"], + description: "Specify the group(s) for the added gem", + }, + { + name: ["--source", "-s"], + description: "Specify the source", + }, + { + name: "--skip-install", + description: "Adds the gem to the Gemfile but does not install it", + }, + { + name: "--optimistic", + description: "Adds optimistic declaration of version", + }, + { + name: "--strict", + description: "Adds strict declaration of version", + }, + ], + }, + { + name: "binstubs", + description: "Install the binstubs of the listed gems", + args: {}, + options: [ + { + name: "--force", + description: "Overwrite existing binstubs", + }, + { + name: "--path", + description: "The location to install the specified binstubs to", + }, + { + name: "--standalone", + description: + "Makes binstubs that can work without depending on Rubygems or Bundler at runtime", + }, + { + name: "--shebang", + description: + "Specify a different shebang executable name than the default", + }, + ], + }, + { + name: "check", + description: + "Determine whether the requirements for your application are installed and available to Bundler", + options: [ + { + name: "--dry-run", + description: "Locks the Gemfile before running the command", + }, + { + name: "--gemfile", + description: "Use the specified gemfile instead of the Gemfile", + }, + { + name: "--path", + description: "Specify a different path than the system default", + }, + ], + }, + { + name: "show", + description: "Show the source location of a particular gem in the bundle", + args: { + name: "gem", + generators: gemfileGemsGenerator, + isOptional: true, + }, + options: [ + { + name: "--paths", + description: + "List the paths of all gems that are required by your Gemfile", + }, + ], + }, + { + name: "outdated", + description: "Show all of the outdated gems in the current bundle", + options: [ + { + name: "--local", + description: + "Do not attempt to fetch gems remotely and use the gem cache instead", + }, + { name: "--pre", description: "Check for newer pre-release gems" }, + { name: "--source", description: "Check against a specific source" }, + { + name: "--strict", + description: + "Only list newer versions allowed by your Gemfile requirements", + }, + { + name: ["--parseable", "--porcelain"], + description: "Use minimal formatting for more parseable output", + }, + { name: "--group", description: "List gems from a specific group" }, + { name: "--groups", description: "List gems organized by groups" }, + { + name: "--update-strict", + description: + "Strict conservative resolution, do not allow any gem to be updated past latest --patch | --minor| --major", + }, + { + name: "--minor", + description: "Prefer updating only to next minor version", + }, + { + name: "--major", + description: "Prefer updating to next major version (default)", + }, + { + name: "--patch", + description: "Prefer updating only to next patch version", + }, + { + name: "--filter-major", + description: "Only list major newer versions", + }, + { + name: "--filter-minor", + description: "Only list minor newer versions", + }, + { + name: "--filter-patch", + description: "Only list patch newer versions", + }, + { + name: "--only-explicit", + description: + "Only list gems specified in your Gemfile, not their dependencies", + }, + ], + }, + { + name: "console", + description: "Start an IRB session in the current bundle", + }, + { + name: "open", + description: "Open an installed gem in the editor", + args: { + name: "gem", + generators: gemfileGemsGenerator, + }, + }, + { + name: "lock", + description: "Generate a lockfile for your dependencies", + options: [ + { + name: "--update", + description: "Ignores the existing lockfile", + args: {}, + }, + { + name: "--local", + description: "Do not attempt to connect to rubygems.org", + }, + { + name: "--print", + description: + "Prints the lockfile to STDOUT instead of writing to the file\n system", + }, + { + name: "--lockfile", + description: "The path where the lockfile should be written to", + args: { name: "path" }, + }, + { + name: "--full-index", + description: "Fall back to using the single-file index of all gems", + }, + { + name: "--add-platform", + description: + "Add a new platform to the lockfile, re-resolving for the addi-\n tion of that platform", + }, + { + name: "--remove-platform", + description: "Remove a platform from the lockfile", + }, + { + name: "--patch", + description: + "If updating, prefer updating only to next patch version", + }, + { + name: "--minor", + description: + "If updating, prefer updating only to next minor version", + }, + { + name: "--major", + description: + "If updating, prefer updating to next major version (default)", + }, + { + name: "--strict", + description: + "If updating, do not allow any gem to be updated past latest --patch | --minor | --major", + }, + { + name: "--conservative", + description: + "If updating, use bundle install conservative update behavior and do not allow shared dependencies to be updated", + }, + ], + }, + { + name: "viz", + description: "Generate a visual representation of your dependencies", + options: [ + { + name: ["--file", "-f"], + description: + "The name to use for the generated file. See --format option", + }, + { + name: ["--format", "-F"], + description: "This is output format option", + }, + { + name: ["--requirements", "-R"], + description: "Set to show the version of each required dependency", + }, + { + name: ["--version", "-v"], + description: "Set to show each gem version", + }, + { + name: ["--without", "-W"], + description: + "Exclude gems that are part of the specified named group", + }, + ], + }, + { + name: "init", + description: "Generate a simple Gemfile, placed in the current directory", + options: [ + { + name: "--gemspec", + description: "Use the specified .gemspec to create the Gemfile", + }, + ], + }, + { + name: "gem", + description: "Create a simple gem, suitable for development with Bundler", + options: [ + { + name: ["--exe", "-b", "--bin"], + description: "Specify that Bundler should create a binary executable", + }, + { + name: "--no-exe", + description: "Do not create a binary", + }, + { + name: "--coc", + description: + "Add a CODE_OF_CONDUCT.md file to the root of the generated project", + }, + { + name: "--no-coc", + description: "Do not create a CODE_OF_CONDUCT.md", + }, + { + name: "--ext", + description: + "Add boilerplate for C extension code to the generated project", + }, + { + name: "--no-ext", + description: "Do not add C extension code", + }, + { + name: "--mit", + description: "Add an MIT license", + }, + { + name: "--no-mit", + description: "Do not create a LICENSE.txt", + }, + { + name: ["-t", "--test"], + description: "Specify the test framework that Bundler should use", + args: {}, + }, + { + name: ["-e", "--edit"], + description: "Open the resulting gemspec in EDITOR", + args: {}, + }, + ], + }, + { + name: "platform", + description: "Display platform compatibility information", + options: [ + { + name: "--ruby", + description: + "It will display the ruby directive information so you don't have to parse it from the Gemfile", + }, + ], + }, + { + name: "clean", + description: "Clean up unused gems in your Bundler directory", + options: [ + { + name: "--dry-run", + description: "Print the changes, but do not clean the unused gems", + }, + { + name: "--force", + description: "Force a clean even if --path is not set", + }, + ], + }, + { + name: "doctor", + description: "Display warnings about common problems", + options: [ + { name: "--quiet", description: "Only output warnings and errors" }, + { + name: "--gemfile", + description: "The location of the Gemfile which Bundler should use", + args: {}, + }, + ], + }, + ], + options: [ + { name: "--no-color", description: "Print all output without color" }, + { + name: ["--retry", "-r"], + description: + "Specify the number of times you wish to attempt network commands", + }, + { + name: ["--verbose", "-V"], + description: "Print out additional logging information", + }, + ], +}; + +export default completionSpec; diff --git a/extensions/terminal-suggest/src/completions/upstream/docker-compose.ts b/extensions/terminal-suggest/src/completions/upstream/docker-compose.ts new file mode 100644 index 00000000000..17d8f6ad02a --- /dev/null +++ b/extensions/terminal-suggest/src/completions/upstream/docker-compose.ts @@ -0,0 +1,1059 @@ +const getComposeCommand = (tokens: string[]) => + tokens[0] === "docker" ? ["docker", "compose"] : ["docker-compose"]; + +const extractFileArgs = (tokens: string[]): string[] => { + const files: string[] = []; + for (let i = 0; i < tokens.length - 1; i++) { + if (tokens[i] === "-f") { + files.push(tokens[i + 1]); + i += 1; + } + } + return files.flatMap((f) => ["-f", f]); +}; + +const servicesGenerator: Fig.Generator = { + script: (tokens) => { + const compose = getComposeCommand(tokens); + const fileArgs = extractFileArgs(tokens); + return [...compose, ...fileArgs, "config", "--services"]; + }, + splitOn: "\n", +}; + +const profilesGenerator: Fig.Generator = { + script: (tokens) => { + const compose = getComposeCommand(tokens); + const fileArgs = extractFileArgs(tokens); + return [...compose, ...fileArgs, "config", "--profiles"]; + }, + splitOn: "\n", +}; + +const completionSpec: Fig.Spec = { + name: "docker-compose", + description: "Define and run multi-container applications with Docker", + subcommands: [ + { + name: "build", + description: "Build or rebuild services", + args: { + name: "services", + isVariadic: true, + isOptional: true, + generators: servicesGenerator, + }, + options: [ + { + name: "--build-arg", + description: "Set build-time variables for services", + isRepeatable: true, + args: { + name: "key=value", + generators: servicesGenerator, + }, + }, + { + name: "--compress", + description: "Compress the build context using gzip. DEPRECATED", + hidden: true, + deprecated: true, + }, + { + name: "--force-rm", + description: "Always remove intermediate containers. DEPRECATED", + hidden: true, + deprecated: true, + }, + { + name: ["--memory", "-m"], + description: + "Set memory limit for the build container. Not supported on buildkit yet", + hidden: true, + args: { + name: "memory", + }, + }, + { + name: "--no-cache", + description: "Do not use cache when building the image", + }, + { + name: "--no-rm", + description: + "Do not remove intermediate containers after a successful build. DEPRECATED", + hidden: true, + deprecated: true, + }, + { + name: "--parallel", + description: "Build images in parallel. DEPRECATED", + deprecated: true, + hidden: true, + }, + { + name: "--progress", + description: "Set type of progress output (auto, tty, plain, quiet)", + args: { + name: "progress", + default: "auto", + suggestions: ["auto", "tty", "plain", "quiet"], + }, + }, + { + name: "--pull", + description: "Always attempt to pull a newer version of the image", + }, + { + name: ["--quiet", "-q"], + description: "Don't print anything to STDOUT", + }, + { + name: "--ssh", + description: + "Set SSH authentications used when building service images. (use 'default' for using your default SSH Agent)", + args: { + name: "ssh", + }, + }, + ], + }, + { + name: ["config", "convert"], + description: "Converts the compose file to platform's canonical format", + args: { + name: "services", + isVariadic: true, + generators: servicesGenerator, + }, + options: [ + { + name: "--format", + description: "Format the output. Values: [yaml | json]", + args: { + name: "format", + default: "yaml", + suggestions: ["yaml", "json"], + }, + }, + { + name: "--hash", + description: "Print the service config hash, one per line", + args: { + name: "hash", + }, + }, + { + name: "--images", + description: "Print the image names, one per line", + }, + { + name: "--no-interpolate", + description: "Don't interpolate environment variables", + }, + { + name: "--no-normalize", + description: "Don't normalize compose model", + }, + { + name: ["--output", "-o"], + description: "Save to file (default to stdout)", + args: { + name: "output", + template: "filepaths", + suggestCurrentToken: true, + }, + }, + { + name: "--profiles", + description: "Print the profile names, one per line", + }, + { + name: ["--quiet", "-q"], + description: "Only validate the configuration, don't print anything", + }, + { + name: "--resolve-image-digests", + description: "Pin image tags to digests", + }, + { + name: "--services", + description: "Print the service names, one per line", + }, + { + name: "--volumes", + description: "Print the volume names, one per line", + }, + ], + }, + { + name: "cp", + description: + "Copy files/folders between a service container and the local filesystem", + args: [{ name: "source path" }, { name: "dest path" }], + options: [ + { + name: "--all", + description: "Copy to all the containers of the service", + hidden: true, + }, + { + name: ["--archive", "-a"], + description: "Archive mode (copy all uid/gid information)", + }, + { + name: ["--follow-link", "-L"], + description: "Always follow symbol link in SRC_PATH", + }, + { + name: "--index", + description: + "Index of the container if there are multiple instances of a service", + args: { + name: "index", + default: "0", + }, + }, + ], + }, + { + name: "create", + description: "Creates containers for a service", + args: { + name: "service", + isVariadic: true, + isOptional: true, + generators: servicesGenerator, + }, + options: [ + { + name: "--build", + description: "Build images before starting containers", + }, + { + name: "--force-recreate", + description: + "Recreate containers even if their configuration and image haven't changed", + }, + { + name: "--no-build", + description: "Don't build an image, even if it's missing", + }, + { + name: "--no-recreate", + description: + "If containers already exist, don't recreate them. Incompatible with --force-recreate", + }, + ], + }, + { + name: "down", + description: "Stop and remove containers, networks", + options: [ + { + name: "--remove-orphans", + description: + "Remove containers for services not defined in the Compose file", + }, + { + name: "--rmi", + description: + 'Remove images used by services. "local" remove only images that don\'t have a custom tag ("local"|"all")', + args: { + name: "rmi", + }, + }, + { + name: ["--timeout", "-t"], + description: "Specify a shutdown timeout in seconds", + args: { + name: "timeout", + default: "10", + }, + }, + { + name: ["--volumes", "-v"], + description: + "Remove named volumes declared in the `volumes` section of the Compose file and anonymous volumes attached to containers", + }, + ], + }, + { + name: "events", + description: "Receive real time events from containers", + args: { + name: "service", + isVariadic: true, + isOptional: true, + generators: servicesGenerator, + }, + options: [ + { + name: "--json", + description: "Output events as a stream of json objects", + }, + ], + }, + { + name: "exec", + description: "Execute a command in a running container", + args: [ + { name: "service", generators: servicesGenerator }, + { name: "command", isCommand: true, isVariadic: true }, + ], + options: [ + { + name: ["--detach", "-d"], + description: "Detached mode: Run command in the background", + }, + { + name: ["--env", "-e"], + description: "Set environment variables", + isRepeatable: true, + args: { + name: "key=value", + }, + }, + { + name: "--index", + description: + "Index of the container if there are multiple instances of a service [default: 1]", + args: { + name: "index", + default: "1", + }, + }, + { + name: ["--interactive", "-i"], + description: "Keep STDIN open even if not attached", + hidden: true, + }, + { + name: ["--no-TTY", "-T"], + description: + "Disable pseudo-TTY allocation. By default `docker compose exec` allocates a TTY", + }, + { + name: "--privileged", + description: "Give extended privileges to the process", + }, + { + name: ["--tty", "-t"], + description: "Allocate a pseudo-TTY", + hidden: true, + }, + { + name: ["--user", "-u"], + description: "Run the command as this user", + args: { + name: "user", + }, + }, + { + name: ["--workdir", "-w"], + description: "Path to workdir directory for this command", + args: { + name: "workdir", + template: "folders", + }, + }, + ], + }, + { + name: "images", + description: "List images used by the created containers", + args: { + name: "service", + isVariadic: true, + isOptional: true, + generators: servicesGenerator, + }, + options: [ + { + name: ["--quiet", "-q"], + description: "Only display IDs", + }, + ], + }, + { + name: "kill", + description: "Force stop service containers", + args: { + name: "service", + isVariadic: true, + isOptional: true, + generators: servicesGenerator, + }, + options: [ + { + name: ["--signal", "-s"], + description: "SIGNAL to send to the container", + args: { + name: "signal", + default: "SIGKILL", + }, + }, + ], + }, + { + name: "logs", + description: "View output from containers", + args: { + name: "service", + isVariadic: true, + isOptional: true, + generators: servicesGenerator, + }, + options: [ + { + name: ["--follow", "-f"], + description: "Follow log output", + }, + { + name: "--no-color", + description: "Produce monochrome output", + }, + { + name: "--no-log-prefix", + description: "Don't print prefix in logs", + }, + { + name: "--since", + description: + "Show logs since timestamp (e.g. 2013-01-02T13:23:37Z) or relative (e.g. 42m for 42 minutes)", + args: { + name: "since", + }, + }, + { + name: "--tail", + description: + "Number of lines to show from the end of the logs for each container", + args: { + name: "lines", + suggestions: ["all"], + default: "all", + }, + }, + { + name: ["--timestamps", "-t"], + description: "Show timestamps", + }, + { + name: "--until", + description: + "Show logs before a timestamp (e.g. 2013-01-02T13:23:37Z) or relative (e.g. 42m for 42 minutes)", + args: { + name: "timestamp", + }, + }, + ], + }, + { + name: "ls", + description: "List running compose projects", + options: [ + { + name: ["--all", "-a"], + description: "Show all stopped Compose projects", + }, + { + name: "--filter", + description: "Filter output based on conditions provided", + args: { + name: "filter", + }, + }, + { + name: "--format", + description: "Format the output. Values: [pretty | json]", + args: { + name: "format", + default: "pretty", + suggestions: ["pretty", "json"], + }, + }, + { + name: ["--quiet", "-q"], + description: "Only display IDs", + }, + ], + }, + { + name: "pause", + description: "Pause services", + args: { + name: "service", + isVariadic: true, + isOptional: true, + generators: servicesGenerator, + }, + }, + { + name: "port", + description: "Print the public port for a port binding", + args: [ + { name: "service", generators: servicesGenerator }, + { name: "private_port" }, + ], + options: [ + { + name: "--index", + description: + "Index of the container if service has multiple replicas", + args: { + name: "index", + default: "1", + }, + }, + { + name: "--protocol", + description: "Tcp or udp", + args: { + name: "protocol", + default: "tcp", + suggestions: ["tcp", "udp"], + }, + }, + ], + }, + { + name: "ps", + description: "List containers", + args: { + name: "service", + isVariadic: true, + isOptional: true, + generators: servicesGenerator, + }, + options: [ + { + name: ["--all", "-a"], + description: + "Show all stopped containers (including those created by the run command)", + }, + { + name: "--filter", + description: + "Filter services by a property (supported filters: status)", + args: { + name: "filter", + }, + }, + { + name: "--format", + description: "Format the output. Values: [pretty | json]", + args: { + name: "format", + default: "pretty", + suggestions: ["pretty", "json"], + }, + }, + { + name: ["--quiet", "-q"], + description: "Only display IDs", + }, + { + name: "--services", + description: "Display services", + }, + { + name: "--status", + description: + "Filter services by status. Values: [paused | restarting | removing | running | dead | created | exited]", + isRepeatable: true, + args: { + name: "status", + suggestions: [ + "paused", + "restarting", + "removing", + "running", + "dead", + "created", + "exited", + ], + }, + }, + ], + }, + { + name: "pull", + description: "Pull service images", + args: { + name: "service", + isVariadic: true, + isOptional: true, + generators: servicesGenerator, + }, + options: [ + { + name: "--ignore-pull-failures", + description: "Pull what it can and ignores images with pull failures", + }, + { + name: "--include-deps", + description: "Also pull services declared as dependencies", + }, + { + name: "--no-parallel", + description: "DEPRECATED disable parallel pulling", + deprecated: true, + hidden: true, + }, + { + name: "--parallel", + description: "DEPRECATED pull multiple images in parallel", + deprecated: true, + hidden: true, + }, + { + name: ["--quiet", "-q"], + description: "Pull without printing progress information", + }, + ], + }, + { + name: "push", + description: "Push service images", + args: { + name: "service", + isVariadic: true, + isOptional: true, + generators: servicesGenerator, + }, + options: [ + { + name: "--ignore-push-failures", + description: "Push what it can and ignores images with push failures", + }, + ], + }, + { + name: "restart", + description: "Restart containers", + options: [ + { + name: ["--timeout", "-t"], + description: "Specify a shutdown timeout in seconds", + args: { + name: "timeout", + default: "10", + }, + }, + ], + args: { + name: "service", + isVariadic: true, + isOptional: true, + generators: servicesGenerator, + }, + }, + { + name: "rm", + description: "Removes stopped service containers", + args: { + name: "service", + isVariadic: true, + isOptional: true, + generators: servicesGenerator, + }, + options: [ + { + name: ["--all", "-a"], + description: "Deprecated - no effect", + hidden: true, + }, + { + name: ["--force", "-f"], + description: "Don't ask to confirm removal", + }, + { + name: ["--stop", "-s"], + description: "Stop the containers, if required, before removing", + }, + { + name: ["--volumes", "-v"], + description: "Remove any anonymous volumes attached to containers", + }, + ], + }, + { + name: "run", + description: "Run a one-off command on a service", + args: [ + { name: "service", generators: servicesGenerator }, + { name: "command", isCommand: true }, + ], + options: [ + { + name: ["--detach", "-d"], + description: "Run container in background and print container ID", + }, + { + name: "--entrypoint", + description: "Override the entrypoint of the image", + args: { + name: "entrypoint", + }, + }, + { + name: ["--env", "-e"], + description: "Set environment variables", + isRepeatable: true, + args: { + name: "env", + }, + }, + { + name: ["--interactive", "-i"], + description: "Keep STDIN open even if not attached", + }, + { + name: ["--label", "-l"], + description: "Add or override a label", + isRepeatable: true, + args: { + name: "label", + }, + }, + { + name: "--name", + description: "Assign a name to the container", + args: { + name: "name", + }, + }, + { + name: ["--no-TTY", "-T"], + description: "Disable pseudo-TTY allocation (default: auto-detected)", + }, + { + name: "--no-deps", + description: "Don't start linked services", + }, + { + name: ["--publish", "-p"], + description: "Publish a container's port(s) to the host", + isRepeatable: true, + args: { + name: "publish", + }, + }, + { + name: "--quiet-pull", + description: "Pull without printing progress information", + }, + { + name: "--rm", + description: "Automatically remove the container when it exits", + }, + { + name: "--service-ports", + description: + "Run command with the service's ports enabled and mapped to the host", + }, + { + name: ["--tty", "-t"], + description: "Allocate a pseudo-TTY", + hidden: true, + }, + { + name: "--use-aliases", + description: + "Use the service's network useAliases in the network(s) the container connects to", + }, + { + name: ["--user", "-u"], + description: "Run as specified username or uid", + args: { + name: "user", + }, + }, + { + name: ["--volume", "-v"], + description: "Bind mount a volume", + isRepeatable: true, + args: { + name: "volume", + }, + }, + { + name: ["--workdir", "-w"], + description: "Working directory inside the container", + args: { + name: "workdir", + template: "folders", + }, + }, + ], + }, + { + name: "start", + description: "Start services", + args: { + name: "service", + isVariadic: true, + isOptional: true, + generators: servicesGenerator, + }, + }, + { + name: "stop", + description: "Stop services", + args: { + name: "service", + isVariadic: true, + isOptional: true, + generators: servicesGenerator, + }, + options: [ + { + name: ["--timeout", "-t"], + description: "Specify a shutdown timeout in seconds", + args: { + name: "timeout", + default: "10", + }, + }, + ], + }, + { + name: "top", + description: "Display the running processes", + args: { + name: "service", + isOptional: true, + isVariadic: true, + generators: servicesGenerator, + }, + }, + { + name: "unpause", + description: "Unpause services", + args: { + name: "service", + isOptional: true, + isVariadic: true, + generators: servicesGenerator, + }, + }, + { + name: "up", + description: "Create and start containers", + args: { + name: "service", + isVariadic: true, + isOptional: true, + generators: servicesGenerator, + }, + options: [ + { + name: "--abort-on-container-exit", + description: + "Stops all containers if any container was stopped. Incompatible with -d", + }, + { + name: "--always-recreate-deps", + description: + "Recreate dependent containers. Incompatible with --no-recreate", + }, + { + name: "--attach", + description: "Attach to service output", + isRepeatable: true, + args: { + name: "attach", + }, + }, + { + name: "--attach-dependencies", + description: "Attach to dependent containers", + }, + { + name: "--build", + description: "Build images before starting containers", + }, + { + name: ["--detach", "-d"], + description: "Detached mode: Run containers in the background", + }, + { + name: "--exit-code-from", + description: + "Return the exit code of the selected service container. Implies --abort-on-container-exit", + args: { + name: "exit-code-from", + }, + }, + { + name: "--force-recreate", + description: + "Recreate containers even if their configuration and image haven't changed", + }, + { + name: "--no-build", + description: "Don't build an image, even if it's missing", + }, + { + name: "--no-color", + description: "Produce monochrome output", + }, + { + name: "--no-deps", + description: "Don't start linked services", + }, + { + name: "--no-log-prefix", + description: "Don't print prefix in logs", + }, + { + name: "--no-recreate", + description: + "If containers already exist, don't recreate them. Incompatible with --force-recreate", + }, + { + name: "--no-start", + description: "Don't start the services after creating them", + }, + { + name: "--quiet-pull", + description: "Pull without printing progress information", + }, + { + name: "--remove-orphans", + description: + "Remove containers for services not defined in the Compose file", + }, + { + name: ["--renew-anon-volumes", "-V"], + description: + "Recreate anonymous volumes instead of retrieving data from the previous containers", + }, + { + name: "--scale", + description: + "Scale SERVICE to NUM instances. Overrides the `scale` setting in the Compose file if present", + isRepeatable: true, + args: { + name: "scale", + }, + }, + { + name: ["--timeout", "-t"], + description: + "Use this timeout in seconds for container shutdown when attached or when containers are already running", + args: { + name: "timeout", + default: "10", + }, + }, + { + name: "--wait", + description: + "Wait for services to be running|healthy. Implies detached mode", + }, + ], + }, + { + name: "version", + description: "Show the Docker Compose version information", + options: [ + { + name: ["--format", "-f"], + description: + "Format the output. Values: [pretty | json]. (Default: pretty)", + args: { + name: "format", + suggestions: ["pretty", "json"], + }, + }, + { + name: "--short", + description: "Shows only Compose's version number", + }, + ], + }, + ], + options: [ + { + name: "--ansi", + description: + 'Control when to print ANSI control characters ("never"|"always"|"auto")', + args: { + name: "ansi", + default: "auto", + suggestions: ["never", "always", "auto"], + }, + }, + { + name: "--compatibility", + description: "Run compose in backward compatibility mode", + }, + { + name: "--env-file", + description: "Specify an alternate environment file", + args: { + name: "env-file", + template: "filepaths", + }, + }, + { + name: ["--file", "-f"], + description: "Compose configuration files", + isRepeatable: true, + args: { + name: "file", + template: "filepaths", + }, + }, + { + name: "--no-ansi", + description: "Do not print ANSI control characters (DEPRECATED)", + deprecated: true, + hidden: true, + }, + { + name: "--profile", + description: "Specify a profile to enable", + isRepeatable: true, + args: { + name: "profile", + generators: profilesGenerator, + }, + }, + { + name: "--project-directory", + description: + "Specify an alternate working directory (default: the path of the, first specified, Compose file)", + args: { + name: "project-directory", + template: "folders", + }, + }, + { + name: ["--project-name", "-p"], + description: "Project name", + args: { + name: "project-name", + }, + }, + { + name: "--verbose", + description: "Show more output", + hidden: true, + }, + { + name: "--workdir", + description: + "DEPRECATED! USE --project-directory INSTEAD. Specify an alternate working directory (default: the path of the, first specified, Compose file)", + deprecated: true, + hidden: true, + args: { + name: "workdir", + }, + }, + ], +}; + +export default completionSpec; diff --git a/extensions/terminal-suggest/src/completions/upstream/docker.ts b/extensions/terminal-suggest/src/completions/upstream/docker.ts new file mode 100644 index 00000000000..e5f225fea19 --- /dev/null +++ b/extensions/terminal-suggest/src/completions/upstream/docker.ts @@ -0,0 +1,6853 @@ +const postProcessDockerPs: Fig.Generator["postProcess"] = (out) => { + return out.split("\n").map((i) => { + try { + const parsedJSON: Record = JSON.parse(i); + return { + name: parsedJSON.Names, + displayName: `${parsedJSON.Names} (${parsedJSON.Image})`, + icon: "fig://icon?type=docker", + }; + } catch (error) { + console.error(error); return null!; + } + }); +}; + +const sharedPostProcess: Fig.Generator["postProcess"] = (out) => { + return out + .split("\n") + .map((line) => JSON.parse(line)) + .map((i) => ({ + name: i.Name, + description: i.ID, + icon: "fig://icon?type=docker", + })); +}; + +const dockerGenerators: Record = { + runningDockerContainers: { + script: ["docker", "ps", "--format", "{{ json . }}"], + postProcess: postProcessDockerPs, + }, + allDockerContainers: { + script: ["docker", "ps", "-a", "--format", "{{ json . }}"], + postProcess: postProcessDockerPs, + }, + pausedDockerContainers: { + script: [ + "docker", + "ps", + "--filter", + "status=paused", + "--format", + "{{ json . }}", + ], + postProcess: postProcessDockerPs, + }, + allLocalImages: { + script: ["docker", "image", "ls", "--format", "{{ json . }}"], + postProcess: function (out) { + return out + .split("\n") + .map((line) => JSON.parse(line)) + .map((i) => ({ + name: `${i.ID}`, + displayName: `${i.Repository} - ${i.ID}`, + icon: "fig://icon?type=docker", + })); + }, + }, + allLocalImagesWithRepository: { + script: ["docker", "image", "ls", "--format", "{{ json . }}"], + postProcess: function (out) { + return out + .split("\n") + .map((line) => JSON.parse(line)) + .map((i) => ({ + name: i.Repository, + displayName: `${i.Repository} - ${i.ID}`, + icon: "fig://icon?type=docker", + })); + }, + }, + dockerHubSearch: { + script: function (context) { + if (context[context.length - 1] === "") return undefined; + const searchTerm = context[context.length - 1]; + return ["docker", "search", searchTerm, "--format", "{{ json . }}"]; + }, + postProcess: function (out) { + return out + .split("\n") + .map((line) => JSON.parse(line)) + .map((i) => ({ + name: `${i.Name}`, + icon: "fig://icon?type=docker", + })); + }, + trigger: function () { + return true; + }, + }, + allDockerContexts: { + script: ["docker", "context", "list", "--format", "{{ json . }}"], + postProcess: function (out) { + return out + .split("\n") + .map((line) => JSON.parse(line)) + .map((i) => ({ + name: i.Name, + description: i.Description, + icon: "fig://icon?type=docker", + })); + }, + }, + listDockerNetworks: { + script: ["docker", "network", "list", "--format", "{{ json . }}"], + postProcess: sharedPostProcess, + }, + listDockerSwarmNodes: { + script: ["docker", "node", "list", "--format", "{{ json . }}"], + postProcess: function (out) { + return out + .split("\n") + .map((line) => JSON.parse(line)) + .map((i) => ({ + name: i.ID, + displayName: `${i.ID} - ${i.Hostname}`, + description: i.Status, + icon: "fig://icon?type=docker", + })); + }, + }, + listDockerPlugins: { + script: ["docker", "plugin", "list", "--format", "{{ json . }}"], + postProcess: sharedPostProcess, + }, + listDockerSecrets: { + script: ["docker", "secret", "list", "--format", "{{ json . }}"], + postProcess: sharedPostProcess, + }, + listDockerServices: { + script: ["docker", "service", "list", "--format", "{{ json . }}"], + postProcess: function (out) { + return out + .split("\n") + .map((line) => JSON.parse(line)) + .map((i) => ({ + name: i.Name, + description: i.Image, + icon: "fig://icon?type=docker", + })); + }, + }, + listDockerServicesReplicas: { + script: ["docker", "service", "list", "--format", "{{ json . }}"], + postProcess: function (out) { + return out + .split("\n") + .map((line) => JSON.parse(line)) + .map((i) => ({ + name: `${i.Name}=`, + description: i.Image, + icon: "fig://icon?type=docker", + })); + }, + }, + listDockerStacks: { + script: ["docker", "stack", "list", "--format", "{{ json . }}"], + postProcess: function (out) { + return out + .split("\n") + .map((line) => JSON.parse(line)) + .map((i) => ({ + name: i.Name, + icon: "fig://icon?type=docker", + })); + }, + }, + listDockerVolumes: { + script: ["docker", "volume", "list", "--format", "{{ json . }}"], + postProcess: function (out) { + return out + .split("\n") + .map((line) => JSON.parse(line)) + .map((i) => ({ + name: i.Name, + icon: "fig://icon?type=docker", + })); + }, + }, +}; + +const containersArg = { + name: "container", + generators: dockerGenerators.runningDockerContainers, +}; + +const imagesArg = { + name: "image", + generators: dockerGenerators.allLocalImages, +}; + +const containerAndCommandArgs = [ + containersArg, + { + name: "command", + isCommand: true, + }, +]; + +const contextsArg = { + name: "CONTEXT", + generators: dockerGenerators.allDockerContexts, +}; + +const sharedCommands: Record = { + build: { + name: "build", + description: "Build an image from a Dockerfile", + args: { + name: "path", + generators: { + template: "folders", + }, + }, + options: [ + { + name: "--add-host", + args: { + name: "list", + description: "Add a custom host-to-IP mapping (host:ip)", + }, + }, + { + name: "--build-arg", + args: { + name: "list", + description: "Set build-time variables", + }, + }, + { + name: "--cache-from", + args: { + name: "strings", + description: "Images to consider as cache sources", + }, + }, + { + name: "--disable-content-trust", + description: "Skip image verification (default true)", + }, + { + name: ["-f", "--file"], + description: "Name of the Dockerfile (Default is 'PATH/Dockerfile')", + args: { + name: "string", + generators: { + template: "filepaths", + }, + }, + }, + { + name: "--iidfile", + description: "Write the image ID to the file", + args: { + name: "string", + }, + }, + { + name: "--isolation", + description: "Container isolation technology", + args: { + name: "string", + }, + }, + { + name: "--label", + description: "Set metadata for an image", + args: { + name: "list", + }, + }, + { + name: "--network", + description: + 'Set the networking mode for the RUN instructions during build (default "default")', + args: { + name: "string", + }, + }, + { + name: "--no-cache", + description: "Do not use cache when building the image", + }, + { + name: ["-o", "--output"], + description: "Output destination (format: type=local,dest=path)", + args: { + name: "stringArray", + }, + }, + { + name: "--platform", + description: "Set platform if server is multi-platform capable", + args: { + name: "string", + }, + }, + { + name: "--progress", + description: + "Set type of progress output (auto, plain, tty). Use plain to show container output", + args: { + name: "string", + suggestions: ["auto", "plain", "tty"].map((i) => ({ name: i })), + }, + }, + { + name: "--pull", + description: "Always attempt to pull a newer version of the image", + }, + { + name: ["-q", "--quiet"], + description: "Suppress the build output and print image ID on success", + }, + { + name: "--secret", + description: `Secret file to expose to the build (only if BuildKit enabled): id=mysecret,src=/local/secret`, + args: { + name: "stringArray", + }, + }, + { + name: "--squash", + description: "Squash newly built layers into a single new layer", + }, + { + name: "--ssh", + description: `SSH agent socket or keys to expose to the build (only if BuildKit enabled) (format: default|[=|[,]])`, + args: { + name: "stringArray", + }, + }, + { + name: ["-t", "--tag"], + description: "Name and optionally a tag in the 'name:tag' format", + }, + { + name: "--target", + description: "Set the target build stage to build", + args: { + name: "target build stage", + generators: { + trigger: function () { + return true; + }, + script: function (context) { + let fileFlagIndex, dockerfilePath; + if (context.includes("-f")) { + fileFlagIndex = context.indexOf("-f"); + dockerfilePath = context[fileFlagIndex + 1]; + } else if (context.includes("--file")) { + fileFlagIndex = context.indexOf("--file"); + dockerfilePath = context[fileFlagIndex + 1]; + } else { + dockerfilePath = "Dockerfile"; + } + + return ["grep", "-iE", "FROM.*AS", dockerfilePath]; + }, + postProcess: function (out) { + // This just searches the Dockerfile for the alias name after AS, + // and due to the grep above, will only match lines where FROM and AS + // are on the same line. This could certainly be made more robust + // down the line. + const imageNameRegexp = /(?:[aA][sS]\s+)([\w:.-]+)/; + return out + .split("\n") + .map((i) => { + const result = imageNameRegexp.exec(i); + if (result) { + return { + name: result[1], + }; + } + }) + .filter((i) => i !== undefined); + }, + }, + }, + }, + ], + }, + create: { + name: "create", + description: "Create a new container", + args: [ + { + name: "container", + generators: dockerGenerators.allLocalImages, + }, + { + name: "command", + isCommand: true, + }, + ], + options: [ + { + args: { + name: "list", + }, + description: "Add a custom host-to-IP mapping (host:ip)", + name: "--add-host", + }, + { + args: { + name: "list", + }, + description: "Attach to STDIN, STDOUT or STDERR", + name: ["-a", "--attach"], + }, + { + args: { + name: "uint16", + }, + description: + "Block IO (relative weight), between 10 and 1000, or 0 to disable (default 0)", + name: "--blkio-weight", + }, + { + args: { + name: "list", + }, + description: "Block IO weight (relative device weight) (default [])", + name: "--blkio-weight-device", + }, + { + args: { + name: "list", + }, + description: "Add Linux capabilities", + name: "--cap-add", + }, + { + args: { + name: "list", + }, + description: "Drop Linux capabilities", + name: "--cap-drop", + }, + { + args: { + name: "string", + }, + description: "Optional parent cgroup for the container", + name: "--cgroup-parent", + }, + { + args: { + name: "string", + }, + description: "Cgroup namespace to use (host|private)", + name: "--cgroupns", + }, + { + args: { + name: "string", + }, + description: "Write the container ID to the file", + name: "--cidfile", + }, + { + args: { + name: "int", + }, + description: "Limit CPU CFS (Completely Fair Scheduler) period", + name: "--cpu-period", + }, + { + args: { + name: "int", + }, + description: "Limit CPU CFS (Completely Fair Scheduler) quota", + name: "--cpu-quota", + }, + { + args: { + name: "int", + }, + description: "Limit CPU real-time period in microseconds", + name: "--cpu-rt-period", + }, + { + args: { + name: "int", + }, + description: "Limit CPU real-time runtime in microseconds", + name: "--cpu-rt-runtime", + }, + { + args: { + name: "int", + }, + description: "CPU shares (relative weight)", + name: ["-c", "--cpu-shares"], + }, + { + args: { + name: "decimal", + }, + description: "Number of CPUs", + name: "--cpus", + }, + { + args: { + name: "string", + }, + description: "CPUs in which to allow execution (0-3, 0,1)", + name: "--cpuset-cpus", + }, + { + args: { + name: "string", + }, + description: "MEMs in which to allow execution (0-3, 0,1)", + name: "--cpuset-mems", + }, + { + args: { + name: "list", + }, + description: "Add a host device to the container", + name: "--device", + }, + { + args: { + name: "list", + }, + description: "Add a rule to the cgroup allowed devices list", + name: "--device-cgroup-rule", + }, + { + args: { + name: "list", + }, + description: + "Limit read rate (bytes per second) from a device (default [])", + name: "--device-read-bps", + }, + { + args: { + name: "list", + }, + description: + "Limit read rate (IO per second) from a device (default [])", + name: "--device-read-iops", + }, + { + args: { + name: "list", + }, + description: + "Limit write rate (bytes per second) to a device (default [])", + name: "--device-write-bps", + }, + { + args: { + name: "list", + }, + description: + "Limit write rate (IO per second) to a device (default [])", + name: "--device-write-iops", + }, + { + description: "Skip image verification (default true)", + name: "--disable-content-trust", + }, + { + args: { + name: "list", + }, + description: "Set custom DNS servers", + name: "--dns", + }, + { + args: { + name: "list", + }, + description: "Set DNS options", + name: "--dns-option", + }, + { + args: { + name: "list", + }, + description: "Set custom DNS search domains", + name: "--dns-search", + }, + { + args: { + name: "string", + }, + description: "Container NIS domain name", + name: "--domainname", + }, + { + args: { + name: "string", + }, + description: "Overwrite the default ENTRYPOINT of the image", + name: "--entrypoint", + }, + { + args: { + name: "list", + }, + description: "Set environment variables", + name: ["-e", "--env"], + }, + { + args: { + name: "list", + }, + description: "Read in a file of environment variables", + name: "--env-file", + }, + { + args: { + name: "list", + }, + description: "Expose a port or a range of ports", + name: "--expose", + }, + { + args: { + name: "gpu-request", + }, + description: + "GPU devices to add to the container ('all' to pass all GPUs)", + name: "--gpus", + }, + { + args: { + name: "list", + }, + description: "Add additional groups to join", + name: "--group-add", + }, + { + args: { + name: "string", + }, + description: "Command to run to check health", + name: "--health-cmd", + }, + { + args: { + name: "duration", + }, + description: "Time between running the check (ms|s|m|h) (default 0s)", + name: "--health-interval", + }, + { + args: { + name: "int", + }, + description: "Consecutive failures needed to report unhealthy", + name: "--health-retries", + }, + { + args: { + name: "duration", + }, + description: + "Start period for the container to initialize before starting health-retries countdown (ms|s|m|h) (default 0s)", + name: "--health-start-period", + }, + { + args: { + name: "duration", + }, + description: + "Maximum time to allow one check to run (ms|s|m|h) (default 0s)", + name: "--health-timeout", + }, + { + description: "Print usage", + name: "--help", + }, + { + args: { + name: "string", + }, + description: "Container host name", + name: ["-h", "--hostname"], + }, + { + description: + "Run an init inside the container that forwards signals and reaps processes", + name: "--init", + }, + { + description: "Keep STDIN open even if not attached", + name: ["-i", "--interactive"], + }, + { + args: { + name: "string", + }, + description: "IPv4 address (e.g., 172.30.100.104)", + name: "--ip", + }, + { + args: { + name: "string", + }, + description: "IPv6 address (e.g., 2001:db8::33)", + name: "--ip6", + }, + { + args: { + name: "string", + }, + description: "IPC mode to use", + name: "--ipc", + }, + { + args: { + name: "string", + }, + description: "Container isolation technology", + name: "--isolation", + }, + { + args: { + name: "bytes", + }, + description: "Kernel memory limit", + name: "--kernel-memory", + }, + { + args: { + name: "list", + }, + description: "Set meta data on a container", + name: ["-l", "--label"], + }, + { + args: { + name: "list", + }, + description: "Read in a line delimited file of labels", + name: "--label-file", + }, + { + args: { + name: "list", + }, + description: "Add link to another container", + name: "--link", + }, + { + args: { + name: "list", + }, + description: "Container IPv4/IPv6 link-local addresses", + name: "--link-local-ip", + }, + { + args: { + name: "string", + }, + description: "Logging driver for the container", + name: "--log-driver", + }, + { + args: { + name: "list", + }, + description: "Log driver options", + name: "--log-opt", + }, + { + args: { + name: "string", + }, + description: "Container MAC address (e.g., 92:d0:c6:0a:29:33)", + name: "--mac-address", + }, + { + args: { + name: "bytes", + }, + description: "Memory limit", + name: ["-m", "--memory"], + }, + { + args: { + name: "bytes", + }, + description: "Memory soft limit", + name: "--memory-reservation", + }, + { + args: { + name: "bytes", + }, + description: + "Swap limit equal to memory plus swap: '-1' to enable unlimited swap", + name: "--memory-swap", + }, + { + args: { + name: "int", + }, + description: "Tune container memory swappiness (0 to 100) (default -1)", + name: "--memory-swappiness", + }, + { + args: { + name: "mount", + }, + description: "Attach a filesystem mount to the container", + name: "--mount", + }, + { + args: { + name: "string", + }, + description: "Assign a name to the container", + name: "--name", + }, + { + args: { + name: "network", + }, + description: "Connect a container to a network", + name: "--network", + }, + { + args: { + name: "list", + }, + description: "Add network-scoped alias for the container", + name: "--network-alias", + }, + { + description: "Disable any container-specified HEALTHCHECK", + name: "--no-healthcheck", + }, + { + description: "Disable OOM Killer", + name: "--oom-kill-disable", + }, + { + args: { + name: "int", + }, + description: "Tune host's OOM preferences (-1000 to 1000)", + name: "--oom-score-adj", + }, + { + args: { + name: "string", + }, + description: "PID namespace to use", + name: "--pid", + }, + { + args: { + name: "int", + }, + description: "Tune container pids limit (set -1 for unlimited)", + name: "--pids-limit", + }, + { + args: { + name: "string", + }, + description: "Set platform if server is multi-platform capable", + name: "--platform", + }, + { + description: "Give extended privileges to this container", + name: "--privileged", + }, + { + args: { + name: "list", + }, + description: "Publish a container's port(s) to the host", + name: ["-p", "--publish"], + }, + { + description: "Publish all exposed ports to random ports", + name: ["-P", "--publish-all"], + }, + { + args: { + name: "string", + }, + description: + 'Pull image before creating ("always"|"missing"|"never") (default "missing")', + name: "--pull", + }, + { + description: "Mount the container's root filesystem as read only", + name: "--read-only", + }, + { + args: { + name: "string", + }, + description: + 'Restart policy to apply when a container exits (default "no")', + name: "--restart", + }, + { + description: "Automatically remove the container when it exits", + name: "--rm", + }, + { + args: { + name: "string", + }, + description: "Runtime to use for this container", + name: "--runtime", + }, + { + args: { + name: "list", + }, + description: "Security Options", + name: "--security-opt", + }, + { + args: { + name: "bytes", + }, + description: "Size of /dev/shm", + name: "--shm-size", + }, + { + args: { + name: "string", + }, + description: 'Signal to stop a container (default "SIGTERM")', + name: "--stop-signal", + }, + { + args: { + name: "int", + }, + description: "Timeout (in seconds) to stop a container", + name: "--stop-timeout", + }, + { + args: { + name: "list", + }, + description: "Storage driver options for the container", + name: "--storage-opt", + }, + { + args: { + name: "map", + }, + description: "Sysctl options (default map[])", + name: "--sysctl", + }, + { + args: { + name: "list", + }, + description: "Mount a tmpfs directory", + name: "--tmpfs", + }, + { + description: "Allocate a pseudo-TTY", + name: ["-t", "--tty"], + }, + { + args: { + name: "ulimit", + }, + description: "Ulimit options (default [])", + name: "--ulimit", + }, + { + args: { + name: "string", + }, + description: "Username or UID (format: [:])", + name: ["-u", "--user"], + }, + { + args: { + name: "string", + }, + description: "User namespace to use", + name: "--userns", + }, + { + args: { + name: "string", + }, + description: "UTS namespace to use", + name: "--uts", + }, + { + args: { + name: "list", + }, + description: "Bind mount a volume", + name: ["-v", "--volume"], + }, + { + args: { + name: "string", + }, + description: "Optional volume driver for the container", + name: "--volume-driver", + }, + { + args: { + name: "list", + }, + description: "Mount volumes from the specified container(s)", + name: "--volumes-from", + }, + { + args: { + name: "string", + }, + description: "Working directory inside the container", + name: ["-w", "--workdir"], + }, + ], + }, + attach: { + name: "attach", + description: + "Attach local standard input, output, and error streams to a running container,", + options: [ + { + name: "--detach-keys", + description: "Override the key sequence for detaching a container", + args: { + name: "string", + }, + }, + { + name: "--no-stdin", + description: "Do not attach STDIN", + }, + { + name: "--sig-proxy", + description: "Proxy all received signals to the process (default true)", + }, + ], + }, + commit: { + name: "commit", + description: "Create a new image from a container's changes", + args: [ + containersArg, + { + name: "[REPOSITORY[:TAG]]", + }, + ], + options: [ + { + args: { + name: "string", + }, + description: + 'Author (e.g., "John Hannibal Smith ")', + name: ["-a", "--author"], + }, + { + args: { + name: "list", + }, + description: "Apply Dockerfile instruction to the created image", + name: ["-c", "--change"], + }, + { + args: { + name: "string", + }, + description: "Commit message", + name: ["-m", "--message"], + }, + { + description: "Pause container during commit (default true)", + name: ["-p", "--pause"], + }, + ], + }, + cp: { + name: "cp", + description: + "Copy files/folders between a container and the local filesystem", + args: { + name: "CONTAINER:SRC_PATH DEST_PATH|- OR SRC_PATH|- CONTAINER:DEST_PATH", + }, + options: [ + { + description: "Archive mode (copy all uid/gid information)", + name: ["-a", "--archive"], + }, + { + description: "Always follow symbol link in SRC_PATH", + name: ["-L", "--follow-link"], + }, + ], + }, + diff: { + name: "diff", + description: + "Inspect changes to files or directories on a container's filesystem", + args: containersArg, + }, + exec: { + name: "exec", + description: "Run a command in a running container", + options: [ + { + name: "-it", + description: "Launch an interactive session", + icon: "fig://icon?type=commandkey", + }, + { + description: "Detached mode: run command in the background", + name: ["-d", "--detach"], + }, + { + args: { + name: "string", + }, + description: "Override the key sequence for detaching a container", + name: "--detach-keys", + }, + { + args: { + name: "list", + }, + description: "Set environment variables", + name: ["-e", "--env"], + }, + { + args: { + name: "list", + }, + description: "Read in a file of environment variables", + name: "--env-file", + }, + { + description: "Keep STDIN open even if not attached", + name: ["-i", "--interactive"], + }, + { + description: "Give extended privileges to the command", + name: "--privileged", + }, + { + description: "Allocate a pseudo-TTY", + name: ["-t", "--tty"], + }, + { + args: { + name: "string", + }, + description: "Username or UID (format: [:])", + name: ["-u", "--user"], + }, + { + args: { + name: "string", + }, + description: "Working directory inside the container", + name: ["-w", "--workdir"], + }, + ], + args: containerAndCommandArgs, + }, + export: { + name: "export", + description: "Export a container's filesystem as a tar archive", + args: containersArg, + options: [ + { + description: "Write to a file, instead of STDOUT", + name: ["-o", "--output"], + args: { + name: "string", + }, + }, + ], + }, + kill: { + name: "kill", + description: "Kill one or more running containers", + args: { ...containersArg, isVariadic: true }, + options: [ + { + description: 'Signal to send to the container (default "KILL")', + name: ["-s", "--signal"], + args: { + name: "string", + }, + }, + ], + }, + logs: { + name: "logs", + description: "Fetch the logs of a container", + args: containersArg, + options: [ + { + description: "Show extra details provided to logs", + name: "--details", + }, + { + description: "Follow log output", + name: ["-f", "--follow"], + }, + { + description: + "Show logs since timestamp (e.g. 2013-01-02T13:23:37Z) or relative (e.g. 42m for 42 minutes)", + name: "--since", + args: { + name: "string", + }, + }, + { + description: + 'Number of lines to show from the end of the logs (default "all")', + name: ["-n", "--tail"], + args: { + name: "string", + }, + }, + { + description: "Show timestamps", + name: ["-t", "--timestamps"], + }, + { + description: + "Show logs before a timestamp (e.g. 2013-01-02T13:23:37Z) or relative (e.g. 42m for 42 minutes)", + name: "--until", + args: { + name: "string", + }, + }, + ], + }, + pause: { + name: "pause", + description: "Pause all processes within one or more containers", + args: containersArg, + }, + port: { + name: "port", + description: "List port mappings or a specific mapping for the container", + args: [ + containersArg, + { + name: "[PRIVATE_PORT[/PROTO]]", + }, + ], + }, + rename: { + name: "rename", + description: "Rename a container", + args: [ + containersArg, + { + name: "NEW_NAME", + }, + ], + }, + restart: { + name: "restart", + description: "Restart one or more containers", + args: containersArg, + options: [ + { + description: + "Seconds to wait for stop before killing the container (default 10)", + name: ["-t", "--time"], + args: { + name: "int", + }, + }, + ], + }, + rm: { + name: "rm", + description: "Remove one or more containers", + args: { + isVariadic: true, + name: "containers", + generators: dockerGenerators.allDockerContainers, + }, + options: [ + { + name: ["-f", "--force"], + description: "Force the removal of a running container (uses SIGKILL)", + }, + { + name: ["-l", "--link"], + description: "Remove the specified link", + }, + { + name: ["-v", "--volumes"], + description: + "Remove the anonymous volumes associated with the container", + }, + ], + }, + run: { + name: "run", + description: "Run a command in a new container", + options: [ + { + name: "-it", + description: "Launch an interactive session", + icon: "fig://icon?type=commandkey", + }, + { + name: "--add-host", + description: "Add a custom host-to-IP mapping (host:ip)", + args: { + name: "list", + }, + }, + { + name: ["-a", "--attach"], + description: "Attach to STDIN, STDOUT or STDERR", + args: { + name: "list", + }, + }, + { + name: "--blkio-weight", + description: + "Block IO (relative weight), between 10 and 1000, or 0 to disable (default 0)", + args: { + name: "uint16", + }, + }, + { + name: "--blkio-weight-device", + description: "Block IO weight (relative device weight) (default [])", + args: { + name: "list", + }, + }, + { + name: "--cap-add", + description: "Add Linux capabilities", + args: { + name: "list", + }, + }, + { + name: "--cap-drop", + description: "Drop Linux capabilities", + args: { + name: "list", + }, + }, + { + name: "--cgroup-parent", + description: "Optional parent cgroup for the container", + args: { + name: "string", + }, + }, + { + name: "--cgroupns", + description: `Cgroup namespace to use (host|private) +'host': Run the container in the Docker host's cgroup namespace +'private': Run the container in its own private cgroup namespace +'': Use the cgroup namespace as configured by the +default-cgroupns-mode option on the daemon (default)`, + args: { + name: "string", + }, + }, + { + name: "--cidfile", + description: "Write the container ID to the file", + args: { + name: "string", + }, + }, + { + name: "--cpu-period", + description: "Limit CPU CFS (Completely Fair Scheduler) period", + args: { + name: "int", + }, + }, + { + name: "--cpu-quota", + description: "Limit CPU CFS (Completely Fair Scheduler) quota", + args: { + name: "int", + }, + }, + { + name: "--cpu-rt-period", + description: "Limit CPU real-time period in microseconds", + args: { + name: "int", + }, + }, + { + name: "--cpu-rt-runtime", + description: "Limit CPU real-time runtime in microseconds", + args: { + name: "int", + }, + }, + { + name: ["-c", "--cpu-shares"], + description: "CPU shares (relative weight)", + args: { + name: "int", + }, + }, + { + name: "--cpus", + description: "Number of CPUs", + args: { + name: "decimal", + }, + }, + { + name: "--cpuset-cpus", + description: "CPUs in which to allow execution (0-3, 0,1)", + args: { + name: "string", + }, + }, + { + name: "--cpuset-mems", + description: "MEMs in which to allow execution (0-3, 0,1)", + args: { + name: "string", + }, + }, + { + name: ["-d", "--detach"], + description: "Run container in background and print container ID", + }, + { + name: "--detach-keys", + description: "Override the key sequence for detaching a container", + args: { + name: "string", + }, + }, + { + name: "--device", + description: "Add a host device to the container", + args: { + name: "list", + }, + }, + { + name: "--device-cgroup-rule", + description: "Add a rule to the cgroup allowed devices list", + args: { + name: "list", + }, + }, + { + name: "--device-read-bps", + description: + "Limit read rate (bytes per second) from a device (default [])", + args: { + name: "list", + }, + }, + { + name: "--device-read-iops", + description: + "Limit read rate (IO per second) from a device (default [])", + args: { + name: "list", + }, + }, + { + name: "--device-write-bps", + description: + "Limit write rate (bytes per second) to a device (default [])", + args: { + name: "list", + }, + }, + { + name: "--device-write-iops", + description: + "Limit write rate (IO per second) to a device (default [])", + args: { + name: "list", + }, + }, + { + name: "--disable-content-trust", + description: "Skip image verification (default true)", + }, + { + name: "--dns", + description: "Set custom DNS servers", + args: { + name: "list", + }, + }, + { + name: "--dns-option", + description: "Set DNS options", + args: { + name: "list", + }, + }, + { + name: "--dns-search", + description: "Set custom DNS search domains", + args: { + name: "list", + }, + }, + { + name: "--domainname", + description: "Container NIS domain name", + args: { + name: "string", + }, + }, + { + name: "--entrypoint", + description: "Overwrite the default ENTRYPOINT of the image", + args: { + name: "string", + }, + }, + { + name: ["-e", "--env"], + description: "Set environment variables", + args: { + name: "list", + }, + }, + { + name: "--env-file", + description: "Read in a file of environment variables", + args: { + name: "list", + }, + }, + { + name: "--expose", + description: "Expose a port or a range of ports", + args: { + name: "list", + }, + }, + { + name: "--gpus", + description: + "GPU devices to add to the container ('all' to pass all GPUs)", + args: { + name: "gpu-request", + }, + }, + { + name: "--group-add", + description: "Add additional groups to join", + args: { + name: "list", + }, + }, + { + name: "--health-cmd", + description: "Command to run to check health", + args: { + name: "string", + }, + }, + { + name: "--health-interval", + description: "Time between running the check (ms|s|m|h) (default 0s)", + args: { + name: "duration", + }, + }, + { + name: "--health-retries", + description: "Consecutive failures needed to report unhealthy", + args: { + name: "int", + }, + }, + { + name: "--health-start-period", + description: + "Start period for the container to initialize before starting health-retries countdown (ms|s|m|h) (default 0s)", + args: { + name: "duration", + }, + }, + { + name: "--health-timeout", + description: + "Maximum time to allow one check to run (ms|s|m|h) (default 0s)", + args: { + name: "duration", + }, + }, + { + name: "--help", + description: "Print usage", + }, + { + name: ["-h", "--hostname"], + description: "Container host name", + args: { + name: "string", + }, + }, + { + name: "--init", + description: + "Run an init inside the container that forwards signals and reaps processes", + }, + { + name: ["-i", "--interactive"], + description: "Keep STDIN open even if not attached", + }, + { + name: "--ip", + description: "IPv4 address (e.g., 172.30.100.104)", + args: { + name: "string", + }, + }, + { + name: "--ip6", + description: "IPv6 address (e.g., 2001:db8::33)", + args: { + name: "string", + }, + }, + { + name: "--ipc", + description: "IPC mode to use", + args: { + name: "string", + }, + }, + { + name: "--isolation", + description: "Container isolation technology", + args: { + name: "string", + }, + }, + { + name: "--kernel-memory", + description: "Kernel memory limit", + args: { + name: "bytes", + }, + }, + { + name: ["-l", "--label"], + description: "Set meta data on a container", + args: { + name: "list", + }, + }, + { + name: "--label-file", + description: "Read in a line delimited file of labels", + args: { + name: "list", + }, + }, + { + name: "--link", + description: "Add link to another container", + args: { + name: "list", + }, + }, + { + name: "--link-local-ip", + description: "Container IPv4/IPv6 link-local addresses", + args: { + name: "list", + }, + }, + { + name: "--log-driver", + description: "Logging driver for the container", + args: { + name: "string", + suggestions: [ + "json-file", + "syslog", + "journald", + "gelf", + "fluentd", + "awslogs", + "splunk", + "etwlogs", + "gcplogs", + "none", + ], + }, + }, + { + name: "--log-opt", + description: "Log driver options", + args: { + name: "list", + }, + }, + { + name: "--mac-address", + description: "Container MAC address (e.g., 92:d0:c6:0a:29:33)", + args: { + name: "string", + }, + }, + { + name: ["-m", "--memory"], + description: "Memory limit", + args: { + name: "bytes", + }, + }, + { + name: "--memory-reservation", + description: "Memory soft limit", + args: { + name: "bytes", + }, + }, + { + name: "--memory-swap", + description: + "Swap limit equal to memory plus swap: '-1' to enable unlimited swap", + args: { + name: "bytes", + }, + }, + { + name: "--memory-swappiness", + description: "Tune container memory swappiness (0 to 100) (default -1)", + args: { + name: "int", + }, + }, + { + name: "--mount", + description: "Attach a filesystem mount to the container", + args: { + name: "mount", + }, + }, + { + name: "--name", + description: "Assign a name to the container", + args: { + name: "string", + }, + }, + { + name: "--network", + description: "Connect a container to a network", + args: { + name: "network", + }, + }, + { + name: "--network-alias", + description: "Add network-scoped alias for the container", + args: { + name: "list", + }, + }, + { + name: "--no-healthcheck", + description: "Disable any container-specified HEALTHCHECK", + }, + { + name: "--oom-kill-disable", + description: "Disable OOM Killer", + }, + { + name: "--oom-score-adj", + description: "Tune host's OOM preferences (-1000 to 1000)", + args: { + name: "int", + }, + }, + { + name: "--pid", + description: "PID namespace to use", + args: { + name: "string", + }, + }, + { + name: "--pids-limit", + description: "Tune container pids limit (set -1 for unlimited)", + args: { + name: "int", + }, + }, + { + name: "--platform", + description: "Set platform if server is multi-platform capable", + args: { + name: "string", + }, + }, + { + name: "--privileged", + description: "Give extended privileges to this container", + }, + { + name: ["-p", "--publish"], + description: "Publish a container's port(s) to the host", + args: { + name: "list", + }, + }, + { + name: ["-P", "--publish-all"], + description: "Publish all exposed ports to random ports", + }, + { + name: "--pull", + description: + "Pull image before running ('always'|'missing'|'never') (default 'missing')", + args: { + name: "string", + }, + }, + { + name: "--read-only", + description: "Mount the container's root filesystem as read only", + }, + { + name: "--restart", + description: + "Restart policy to apply when a container exits (default 'no')", + args: { + name: "string", + }, + }, + { + name: "--rm", + description: "Automatically remove the container when it exits", + }, + { + name: "--runtime", + description: "Runtime to use for this container", + args: { + name: "string", + }, + }, + { + name: "--security-opt", + description: "Security Options", + args: { + name: "list", + }, + }, + { + name: "--shm-size", + description: "Size of /dev/shm", + args: { + name: "bytes", + }, + }, + { + name: "--sig-proxy", + description: "Proxy received signals to the process (default true)", + }, + { + name: "--stop-signal", + description: "Signal to stop a container (default 'SIGTERM')", + args: { + name: "string", + }, + }, + { + name: "--stop-timeout", + description: "Timeout (in seconds) to stop a container", + args: { + name: "int", + }, + }, + { + name: "--storage-opt", + description: "Storage driver options for the container", + args: { + name: "list", + }, + }, + { + name: "--sysctl", + description: "Sysctl options (default map[])", + args: { + name: "map", + }, + }, + { + name: "--tmpfs", + description: "Mount a tmpfs directory", + args: { + name: "list", + }, + }, + { + name: ["-t", "--tty"], + description: "Allocate a pseudo-TTY", + }, + { + name: "--ulimit", + description: "Ulimit options (default [])", + args: { + name: "ulimit", + }, + }, + { + name: ["-u", "--user"], + description: "Username or UID (format: [:])", + args: { + name: "string", + }, + }, + { + name: "--userns", + description: "User namespace to use", + args: { + name: "string", + }, + }, + { + name: "--uts", + description: "UTS namespace to use", + args: { + name: "string", + }, + }, + { + name: ["-v", "--volume"], + description: "Bind mount a volume", + args: { + name: "list", + }, + }, + { + name: "--volume-driver", + description: "Optional volume driver for the container", + args: { + name: "string", + }, + }, + { + name: "--volumes-from", + description: "Mount volumes from the specified container(s)", + args: { + name: "list", + }, + }, + { + name: ["-w", "--workdir"], + description: "Working directory inside the container", + args: { + name: "string", + }, + }, + ], + args: [ + { + name: "image", + description: "The Docker image to use", + generators: { + script: [ + "docker", + "images", + "--format", + "{{.Repository}} {{.Size}} {{.Tag}} {{.ID}}", + ], + postProcess: function (out) { + return out.split("\n").map((image) => { + const [repo, size, tag, id] = image.split(" "); + return { + name: repo, + description: `${id}@${tag} - ${size}`, + icon: "fig://icon?type=docker", + }; + }); + }, + }, + }, + { + name: "command", + // description: "The command to run in the container" + }, + ], + }, + sbom: { + name: "sbom", + description: + "View the packaged-based Software Bill Of Materials (SBOM) for an image", + args: { + name: "image", + generators: dockerGenerators.allLocalImagesWithRepository, + }, + options: [ + { + description: "Show debug logging", + name: ["-D", "--debug"], + }, + { + description: "Exclude paths from being scanned using a glob expression", + name: "--exclude", + args: { + name: "paths", + }, + }, + { + description: "Report output format", + name: "--format", + args: { + name: "fromat", + suggestions: [ + "syft-json", + "cyclonedx-xml", + "cyclonedx-json", + "github-0-json", + "spdx-tag-value", + "spdx-json", + "table", + "text", + ], + default: "table", + }, + }, + { + description: "[experimental] selection of layers to catalog", + name: "--layers", + args: { + name: "layers", + suggestions: ["squashed", "all"], + default: "squashed", + }, + }, + { + name: ["-o", "--output"], + description: + "File to write the default report output to (default is STDOUT)", + args: { + name: "file", + template: ["filepaths"], + suggestCurrentToken: true, + }, + }, + { + name: "--platform", + description: + "An optional platform specifier for container image sources (e.g. 'linux/arm64', 'linux/arm64/v8', 'arm64', 'linux')", + args: { + name: "platform", + }, + }, + { + name: "--quiet", + description: "Suppress all non-report output", + }, + { + name: ["-v", "--version"], + description: "Version for sbom", + }, + ], + }, + start: { + name: "start", + description: "Start one or more stopped containers", + args: { + name: "container", + generators: dockerGenerators.allDockerContainers, + }, + options: [ + { + description: "Attach STDOUT/STDERR and forward signals", + name: ["-a", "--attach"], + }, + { + description: "Override the key sequence for detaching a container", + name: "--detach-keys", + args: { + name: "string", + }, + }, + { + description: "Attach container's STDIN", + name: ["-i", "--interactive"], + }, + ], + }, + stats: { + name: "stats", + description: + "Display a live stream of container(s) resource usage statistics", + args: containersArg, + options: [ + { + description: "Show all containers (default shows just running)", + name: ["-a", "--all"], + }, + { + description: "Pretty-print images using a Go template", + name: "--format", + args: { + name: "string", + }, + }, + { + description: "Disable streaming stats and only pull the first result", + name: "--no-stream", + }, + { + description: "Do not truncate output", + name: "--no-trunc", + }, + ], + }, + stop: { + name: "stop", + description: "Stop one or more running containers", + args: containersArg, + options: [ + { + name: ["-t", "--t"], + description: "Seconds to wait for stop before killing it (default 10)", + args: { + name: "int", + }, + }, + ], + }, + top: { + name: "top", + description: "Display the running processes of a container", + // TODO: You can pass in psOptions? + args: containersArg, + }, + unpause: { + name: "unpause", + description: "Unpause all processes within one or more containers", + args: { + name: "container", + generators: dockerGenerators.pausedDockerContainers, + }, + }, + update: { + name: "update", + description: "Update configuration of one or more containers", + // INFO: You can do this on any container, even if it's not running - Is that useful though? + // INFO: For now, only displaying running containers + args: containersArg, + options: [ + { + args: { + name: "uint16", + }, + description: + "Block IO (relative weight), between 10 and 1000, or 0 to disable (default 0)", + name: "--blkio-weight", + }, + { + args: { + name: "int", + }, + description: "Limit CPU CFS (Completely Fair Scheduler) period", + name: "--cpu-period", + }, + { + args: { + name: "int", + }, + description: "Limit CPU CFS (Completely Fair Scheduler) quota", + name: "--cpu-quota", + }, + { + args: { + name: "int", + }, + description: "Limit the CPU real-time period in microseconds", + name: "--cpu-rt-period", + }, + { + args: { + name: "int", + }, + description: "Limit the CPU real-time runtime in microseconds", + name: "--cpu-rt-runtime", + }, + { + args: { + name: "int", + }, + description: "CPU shares (relative weight)", + name: ["-c", "--cpu-shares"], + }, + { + args: { + name: "decimal", + }, + description: "Number of CPUs", + name: "--cpus", + }, + { + args: { + name: "string", + }, + description: "CPUs in which to allow execution (0-3, 0,1)", + name: "--cpuset-cpus", + }, + { + args: { + name: "string", + }, + description: "MEMs in which to allow execution (0-3, 0,1)", + name: "--cpuset-mems", + }, + { + args: { + name: "bytes", + }, + description: "Kernel memory limit", + name: "--kernel-memory", + }, + { + args: { + name: "bytes", + }, + description: "Memory limit", + name: ["-m", "--memory"], + }, + { + args: { + name: "bytes", + }, + description: "Memory soft limit", + name: "--memory-reservation", + }, + { + args: { + name: "bytes", + }, + description: + "Swap limit equal to memory plus swap: '-1' to enable unlimited swap", + name: "--memory-swap", + }, + { + args: { + name: "int", + }, + description: "Tune container pids limit (set -1 for unlimited)", + name: "--pids-limit", + }, + { + args: { + name: "string", + }, + description: "Restart policy to apply when a container exits", + name: "--restart", + }, + ], + }, + wait: { + name: "wait", + description: + "Block until one or more containers stop, then print their exit codes", + args: containersArg, + }, + ps: { + name: "ps", + description: "List containers", + options: [ + { + description: "Show all containers (default shows just running)", + name: ["-a", "--all"], + }, + { + args: { + name: "filter", + }, + description: "Filter output based on conditions provided", + name: ["-f", "--filter"], + }, + { + args: { + name: "string", + }, + description: "Pretty-print containers using a Go template", + name: "--format", + }, + { + args: { + name: "int", + }, + description: + "Show n last created containers (includes all states) (default -1)", + name: ["-n", "--last"], + }, + { + description: "Show the latest created container (includes all states)", + name: ["-l", "--latest"], + }, + { + description: "Don't truncate output", + name: "--no-trunc", + }, + { + description: "Only display container IDs", + name: ["-q", "--quiet"], + }, + { + description: "Display total file sizes", + name: ["-s", "--size"], + }, + ], + }, + history: { + name: "history", + description: "Show the history of an image", + args: imagesArg, + options: [ + { + description: "Pretty-print images using a Go template", + name: "--format", + args: { + name: "string", + }, + }, + { + description: + "Print sizes and dates in human readable format (default true)", + name: ["-H", "--human"], + }, + { + description: "Don't truncate output", + name: "--no-trunc", + }, + { + description: "Only show image IDs", + name: ["-q", "--quiet"], + }, + ], + }, + imageImport: { + name: "import", + description: + "Import the contents from a tarball to create a filesystem image", + args: { + name: "file|URL|- [REPOSITORY[:TAG]]", + }, + options: [ + { + args: { + name: "list", + }, + description: "Apply Dockerfile instruction to the created image", + name: ["-c", "--change"], + }, + { + args: { + name: "string", + }, + description: "Set commit message for imported image", + name: ["-m", "--message"], + }, + { + args: { + name: "string", + }, + description: "Set platform if server is multi-platform capable", + name: "--platform", + }, + ], + }, + imageList: { + name: "images", + description: "List images", + args: { + name: "[REPOSITORY[:TAG]]", + }, + options: [ + { + name: ["-a", "--all"], + description: "Show all images (default hides intermediate images)", + }, + { + name: "--digests", + description: "Show digests", + }, + { + name: ["-f", "--filter"], + description: "Filter output based on conditions provided", + args: { + name: "filter", + }, + }, + { + name: "--format", + description: "Pretty-print images using a Go template", + args: { + name: "string", + }, + }, + { + name: "--no-trunc", + description: "Don't truncate output", + }, + { + name: ["-q", "--quiet"], + description: "Only show image IDs", + }, + ], + }, + load: { + name: "load", + description: "Load an image from a tar archive or STDIN", + options: [ + { + name: "-i", + description: "Read from tar archive file, instead of STDIN", + args: { + name: "string", + }, + }, + { + name: ["-q", "--quiet"], + description: "Suppress the load output", + }, + ], + }, + pull: { + name: "pull", + description: "Pull an image or a repository from a registry", + args: { + name: "NAME[:TAG|@DIGEST]", + generators: dockerGenerators.dockerHubSearch, + debounce: true, + }, + options: [ + { + description: "Download all tagged images in the repository", + name: ["-a", "--all-tags"], + }, + { + description: "Skip image verification (default true)", + name: "--disable-content-trust", + }, + { + description: "Set platform if server is multi-platform capable", + name: "--platform", + args: { + name: "string", + }, + }, + { + description: "Suppress verbose output", + name: ["-q", "--quiet"], + }, + ], + }, + push: { + name: "push", + description: "Push an image or a repository to a registry", + // TODO: Autocomplete images + args: { + name: "NAME[:TAG]", + }, + options: [ + { + description: "Push all tagged images in the repository", + name: ["-a", "--all-tags"], + }, + { + description: "Skip image signing (default true)", + name: "--disable-content-trust", + }, + { + description: "Suppress verbose output", + name: ["-q", "--quiet"], + }, + ], + }, + tag: { + name: "tag", + description: "Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE", + args: { + name: "SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]", + }, + }, + imageSave: { + name: "save", + description: + "Save one or more images to a tar archive (streamed to STDOUT by default)", + args: imagesArg, + options: [ + { + description: "Write to a file, instead of STDOUT", + name: ["-o", "--output"], + args: { + name: "string", + }, + }, + ], + }, + removeImage: { + name: "rmi", + description: "Remove one or more images", + args: { ...imagesArg, isVariadic: true }, + options: [ + { + name: ["-f", "--force"], + description: "Force removal of the image", + }, + { + name: "--no-prune", + description: "Do not delete untagged parents", + }, + ], + }, +}; + +const completionSpec: Fig.Spec = { + name: "docker", + description: "A self-sufficient runtime for containers", + subcommands: [ + sharedCommands.attach, + sharedCommands.build, + sharedCommands.commit, + sharedCommands.cp, + sharedCommands.create, + sharedCommands.diff, + { + name: "events", + description: "Get real time events from the server", + options: [ + { + args: { + name: "filter", + }, + description: "Filter output based on conditions provided", + name: ["-f", "--filter"], + }, + { + args: { + name: "string", + }, + description: "Format the output using the given Go template", + name: "--format", + }, + { + args: { + name: "string", + }, + description: "Show all events created since timestamp", + name: "--since", + }, + { + args: { + name: "string", + }, + description: "Stream events until this timestamp", + name: "--until", + }, + ], + }, + sharedCommands.exec, + sharedCommands.export, + sharedCommands.history, + sharedCommands.imageList, + sharedCommands.imageImport, + { + name: "info", + description: "Display system-wide information", + options: [ + { + args: { + name: "string", + }, + description: "Format the output using the given Go template", + name: ["-f", "--format"], + }, + ], + }, + { + name: "inspect", + description: "Return low-level information on Docker objects", + args: { + // TODO: There are more types of docker objects beyond running containers + // that can be inspected + name: "Name or ID", + generators: [ + { + script: ["docker", "ps", "-a", "--format", "{{ json . }}"], + postProcess: function (out) { + const allLines = out.split("\n").map((line) => JSON.parse(line)); + return allLines.map((i) => ({ + name: i.ID, + displayName: `[con] ${i.ID} (${i.Image})`, + })); + }, + }, + { + script: ["docker", "images", "-a", "--format", "{{ json . }}"], + postProcess: function (out) { + const allLines = out.split("\n").map((line) => JSON.parse(line)); + return allLines.map((i) => { + let displayName; + if (i.Repository === "\u003cnone\u003e") { + displayName = i.ID; + } else { + displayName = i.Repository; + if (i.Tag !== "\u003cnone\u003e") { + displayName += `:${i.Tag}`; + } + } + + return { + name: i.ID, + displayName: `[img] ${displayName}`, + }; + }); + }, + }, + { + script: ["docker", "volume", "ls", "--format", "{{ json . }}"], + postProcess: function (out) { + const allLines = out.split("\n").map((line) => JSON.parse(line)); + return allLines.map((i) => ({ + name: i.Name, + displayName: `[vol] ${i.Name}`, + })); + }, + }, + ], + }, + options: [ + { + name: ["-f", "--format"], + description: "Format the output using the given Go template", + args: { + name: "string", + }, + }, + { + name: ["-s", "--size"], + description: "Display total file sizes if the type is container", + }, + { + name: "--type", + description: "Return JSON for specified type", + args: { + name: "string", + }, + }, + ], + }, + sharedCommands.kill, + sharedCommands.load, + { + name: "login", + description: "Log in to a Docker registry", + args: { + name: "server", + }, + options: [ + { + description: "Password", + name: ["-p", "--password"], + args: { + name: "string", + }, + }, + { + description: "Take the password from stdin", + name: "--password-stdin", + }, + { + description: "Username", + name: ["-u", "--username"], + args: { + name: "string", + }, + }, + ], + }, + { + name: "logout", + description: "Log out from a Docker registry", + args: { + name: "server", + }, + }, + sharedCommands.logs, + sharedCommands.pause, + sharedCommands.port, + sharedCommands.ps, + sharedCommands.pull, + sharedCommands.push, + sharedCommands.rename, + sharedCommands.restart, + sharedCommands.rm, + sharedCommands.removeImage, + sharedCommands.run, + sharedCommands.imageSave, + { + name: "search", + description: "Search the Docker Hub for images", + args: { + name: "TERM", + description: "Search term", + }, + options: [ + { + args: { + name: "filter", + }, + description: "Filter output based on conditions provided", + name: ["-f", "--filter"], + }, + { + args: { + name: "string", + }, + description: "Pretty-print search using a Go template", + name: "--format", + }, + { + args: { + name: "int", + }, + description: "Max number of search results (default 25)", + name: "--limit", + }, + { + description: "Don't truncate output", + name: "--no-trunc", + }, + ], + }, + sharedCommands.sbom, + sharedCommands.start, + sharedCommands.stats, + sharedCommands.stop, + sharedCommands.tag, + sharedCommands.top, + sharedCommands.unpause, + sharedCommands.update, + { + name: "version", + description: "Show the Docker version information", + options: [ + { + description: + "Format the output. Values: [pretty | json]. (Default: pretty)", + name: ["-f", "--format"], + args: { + name: "string", + suggestions: ["pretty", "json"], + }, + }, + { + description: "Kubernetes config file", + name: "--kubeconfig", + args: { + name: "string", + }, + }, + ], + }, + sharedCommands.wait, + { + name: "builder", + description: "Manage builds", + subcommands: [ + sharedCommands.build, + { + name: "prune", + description: "Amount of disk space to keep for cache", + options: [ + { + name: ["-a", "--all"], + description: + "Remove all unused build cache, not just dangling ones", + }, + { + name: "--filter", + description: "Provide filter values (e.g. 'until=24h')", + args: { + name: "filter", + }, + }, + { + name: ["-f", "--force"], + description: "Do not prompt for confirmation", + }, + { + name: "--keep-storage", + description: "Amount of disk space to keep for cache", + args: { + name: "bytes", + }, + }, + ], + }, + ], + }, + { + name: "config", + description: "Manage Docker configs", + subcommands: [ + { + name: "create", + description: "Create a config from a file or STDIN", + args: { + name: "file", + template: "filepaths", + }, + options: [ + { + name: "-l", + description: "Config labels", + args: { + name: "list", + }, + }, + { + name: "--template-driver", + description: "Template driver", + args: { + name: "string", + }, + }, + ], + }, + { + name: "inspect", + description: "Display detailed information on one or more configs", + args: { + name: "CONFIG", + isVariadic: true, + }, + options: [ + { + name: "-f", + description: "Format the output using the given Go template", + args: { + name: "string", + }, + }, + { + name: "--pretty", + description: "Print the information in a human friendly format", + }, + ], + }, + { + name: "ls", + description: "List configs", + options: [ + { + name: "-f", + description: "Filter output based on conditions provided", + args: { + name: "filter", + }, + }, + { + name: "--format", + description: "Pretty-print configs using a Go template", + args: { + name: "string", + }, + }, + { + name: ["-q", "--quiet"], + description: "Only display IDs", + }, + ], + }, + { + name: "rm", + description: "Remove one or more configs", + args: { + name: "CONFIG", + isVariadic: true, + }, + }, + ], + }, + { + name: "container", + description: "Manage containers", + subcommands: [ + sharedCommands.attach, + sharedCommands.cp, + sharedCommands.create, + sharedCommands.diff, + sharedCommands.exec, + sharedCommands.export, + { + name: "inspect", + description: "Return low-level information on Docker objects", + args: containersArg, + options: [ + { + name: ["-f", "--format"], + description: "Format the output using the given Go template", + args: { + name: "string", + }, + }, + { + name: ["-s", "--size"], + description: "Display total file sizes if the type is container", + }, + ], + }, + sharedCommands.kill, + sharedCommands.logs, + { ...sharedCommands.ps, name: "ls" }, + sharedCommands.pause, + sharedCommands.port, + { + name: "prune", + description: "Remove all stopped containers", + options: [ + { + name: "--filter", + description: "Provide filter values (e.g. 'until=')", + args: { + name: "filter", + }, + }, + { + name: ["-f", "--force"], + description: "Do not prompt for confirmation", + }, + ], + }, + sharedCommands.rename, + sharedCommands.restart, + sharedCommands.rm, + sharedCommands.run, + sharedCommands.start, + sharedCommands.stats, + sharedCommands.stop, + sharedCommands.top, + sharedCommands.unpause, + sharedCommands.update, + sharedCommands.wait, + ], + }, + { + name: "context", + description: "Manage contexts", + subcommands: [ + { + name: "create", + description: "Create new context", + subcommands: [ + { + name: "aci", + description: "Create a context for Azure Container Instances", + args: { + name: "CONTEXT", + }, + options: [ + { + name: "--description", + description: "Description of the context", + args: { + name: "string", + }, + }, + { + name: ["-h", "--help"], + description: "Help for aci", + }, + { + name: "--location", + description: 'Location (default "eastus")', + args: { + name: "string", + }, + }, + { + name: "--resource-group", + description: "Resource group", + args: { + name: "string", + }, + }, + { + name: "--subscription-id", + description: "Location", + args: { + name: "string", + }, + }, + ], + }, + { + name: "ecs", + description: "Create a context for Amazon ECS", + args: { + name: "CONTEXT", + }, + options: [ + { + name: "--access-keys", + description: "Use AWS access keys from file", + args: { + name: "string", + }, + }, + { + name: "--description", + description: "Description of the context", + args: { + name: "string", + }, + }, + { + name: "--from-env", + description: + "Use AWS environment variables for profile, or credentials and region", + }, + { + name: ["-h", "--help"], + description: "Help for ecs", + }, + { + name: "--local-simulation", + description: + "Create context for ECS local simulation endpoints", + }, + { + name: "--profile", + description: "Use an existing AWS profile", + args: { + name: "string", + }, + }, + ], + }, + ], + options: [ + { + name: "--default-stack-orchestrator", + description: + "Default orchestrator for stack operations to use with this context (swarm|kubernetes|all)", + args: { + name: "string", + suggestions: ["swarm", "kubernetes", "all"], + }, + }, + { + name: "--description", + description: "Description of the context", + args: { + name: "string", + }, + }, + { + name: "--docker", + description: "Set the docker endpoint (default [])", + args: { + name: "stringToString", + }, + }, + { + name: "--from", + description: "Create context from a named context", + args: { + name: "string", + }, + }, + { + name: ["-h", "--help"], + description: "Help for create", + }, + { + name: "--kubernetes", + description: "Set the kubernetes endpoint (default [])", + args: { + name: "stringToString", + }, + }, + ], + }, + { + name: "export", + description: "Export a context to a tar or kubeconfig file", + args: [ + contextsArg, + { + name: "FILE", + template: "filepaths", + }, + ], + options: [ + { + name: ["-h", "--help"], + description: "Help for export", + }, + { + name: "--kubeconfig", + description: "Export as a kubeconfig file", + }, + ], + }, + { + name: "import", + description: "Import a context from a tar or zip file", + args: [ + { + name: "CONTEXT", + }, + { + name: "FILE", + template: "filepaths", + }, + ], + options: [ + { + name: ["-h", "--help"], + description: "Help for export", + }, + ], + }, + { + name: "inspect", + description: "Display detailed information on one or more contexts", + args: { ...contextsArg, isVariadic: true }, + options: [ + { + name: "-f", + description: "Format the output using the given Go template", + args: { + name: "string", + }, + }, + { + name: ["-h", "--help"], + description: "Help for inspect", + }, + ], + }, + { + name: "list", + description: "List available contexts", + options: [ + { + name: "--format", + description: + "Format the output. Values: [pretty | json]. (Default: pretty)", + args: { + name: "string", + suggestions: ["pretty", "json"], + }, + }, + { + name: ["-h", "--help"], + description: "Help for list", + }, + { + name: ["-q", "--quiet"], + description: "Only show context names", + }, + ], + }, + { + name: "rm", + description: "Remove one or more contexts", + args: { ...contextsArg, isVariadic: true }, + options: [ + { + name: ["-f", "--force"], + description: "Force removing current context", + }, + { + name: ["-h", "--help"], + description: "Help for rm", + }, + ], + }, + { + name: "show", + description: "Print the current context", + options: [ + { + name: ["-h", "--help"], + description: "Help for show", + }, + ], + }, + { + name: "update", + description: "Update a context", + args: contextsArg, + options: [ + { + name: "--default-stack-orchestrator", + description: + "Default orchestrator for stack operations to use with this context (swarm|kubernetes|all)", + args: { + name: "string", + suggestions: ["swarm", "kubernetes", "all"], + }, + }, + { + name: "--description", + description: "Description of the context", + args: { + name: "string", + }, + }, + { + name: "--docker", + description: "Set the docker endpoint (default [])", + args: { + name: "stringToString", + }, + }, + { + name: ["-h", "--help"], + description: "Help for update", + }, + { + name: "--kubernetes", + description: "Set the kubernetes endpoint (default [])", + args: { + name: "stringToString", + }, + }, + ], + }, + { + name: "use", + description: "Set the default context", + args: contextsArg, + options: [ + { + name: ["-h", "--help"], + description: "Help for use", + }, + ], + }, + ], + options: [ + { + name: ["-h", "--help"], + description: "Help for context", + }, + ], + }, + { + name: "image", + description: "Manage images", + subcommands: [ + sharedCommands.build, + sharedCommands.history, + sharedCommands.imageImport, + { + name: "inspect", + description: "Display detailed information on one or more images", + args: { ...imagesArg, isVariadic: true }, + options: [ + { + name: "-f", + description: "Format the output using the given Go template", + args: { + name: "string", + }, + }, + ], + }, + sharedCommands.load, + { ...sharedCommands.imageList, name: "ls" }, + { + name: "prune", + description: "Remove unused images", + options: [ + { + name: ["-a", "--all"], + description: "Remove all unused images, not just dangling ones", + }, + { + name: "--filter", + description: "Provide filter values (e.g. 'until=')", + args: { + name: "filter", + }, + }, + { + name: ["-f", "--force"], + description: "Do not prompt for confirmation", + }, + ], + }, + sharedCommands.pull, + sharedCommands.push, + { ...sharedCommands.removeImage, name: "rm" }, + sharedCommands.imageSave, + sharedCommands.tag, + ], + }, + { + name: "network", + description: "Manage networks", + subcommands: [ + { + name: "connect", + description: "Connect a container to a network", + args: [ + { + name: "NETWORK", + generators: dockerGenerators.listDockerNetworks, + }, + containersArg, + ], + options: [ + { + name: "--alias", + description: "Add network-scoped alias for the container", + args: { + name: "strings", + }, + }, + { + name: "--driver-opt", + description: "Driver options for the network", + args: { + name: "strings", + }, + }, + { + name: "--ip", + description: "IPv4 address (e.g., 172.30.100.104)", + args: { + name: "string", + }, + }, + { + name: "--ip6", + description: "IPv6 address (e.g., 2001:db8::33)", + args: { + name: "string", + }, + }, + { + name: "--link", + description: "Add link to another container", + args: { + name: "list", + }, + }, + { + name: "--link-local-ip", + description: "Add a link-local address for the container", + args: { + name: "strings", + }, + }, + ], + }, + { + name: "create", + description: "Create a network", + args: { + name: "NETWORK", + }, + options: [ + { + name: "--attachable", + description: "Enable manual container attachment", + }, + { + name: "--aux-address", + description: + "Auxiliary IPv4 or IPv6 addresses used by Network driver (default map[])", + args: { + name: "map", + }, + }, + { + name: "--config-from", + description: "The network from which to copy the configuration", + args: { + name: "string", + }, + }, + { + name: "--config-only", + description: "Create a configuration only network", + }, + { + name: ["-d", "--driver"], + description: 'Driver to manage the Network (default "bridge")', + args: { + name: "string", + }, + }, + { + name: "--gateway", + description: "IPv4 or IPv6 Gateway for the master subnet", + args: { + name: "strings", + }, + }, + { + name: "--ingress", + description: "Create swarm routing-mesh network", + }, + { + name: "--internal", + description: "Restrict external access to the network", + }, + { + name: "--ip-range", + description: "Allocate container ip from a sub-range", + args: { + name: "strings", + }, + }, + { + name: "--ipam-driver", + description: 'IP Address Management Driver (default "default")', + args: { + name: "string", + }, + }, + { + name: "--ipam-opt", + description: "Set IPAM driver specific options (default map[])", + args: { + name: "map", + }, + }, + { + name: "--ipv6", + description: "Enable IPv6 networking", + }, + { + name: "--label", + description: "Set metadata on a network", + args: { + name: "list", + }, + }, + { + name: ["-o", "--opt"], + description: "Set driver specific options (default map[])", + args: { + name: "map", + }, + }, + { + name: "--scope", + description: "Control the network's scope", + args: { + name: "string", + }, + }, + { + name: "--subnet", + description: + "Subnet in CIDR format that represents a network segment", + args: { + name: "strings", + }, + }, + ], + }, + { + name: "disconnect", + description: "Disconnect a container from a network", + args: [ + { + name: "NETWORK", + generators: dockerGenerators.listDockerNetworks, + }, + containersArg, + ], + options: [ + { + name: ["-f", "--force"], + description: "Force the container to disconnect from a network", + }, + ], + }, + { + name: "inspect", + description: "Display detailed information on one or more networks", + args: { + name: "NETWORK", + generators: dockerGenerators.listDockerNetworks, + isVariadic: true, + }, + options: [ + { + name: ["-f", "--format"], + description: "Format the output using the given Go template", + args: { + name: "string", + }, + }, + { + name: ["-v", "--verbose"], + description: "Verbose output for diagnostics", + }, + ], + }, + { + name: "ls", + description: "List networks", + options: [ + { + name: ["-f", "--filter"], + description: "Provide filter values (e.g. 'driver=bridge')", + args: { + name: "filter", + }, + }, + { + name: "--format", + description: "Pretty-print networks using a Go template", + args: { + name: "string", + }, + }, + { + name: "--no-trunc", + description: "Do not truncate the output", + }, + { + name: ["-q", "--quiet"], + description: "Only display network IDs", + }, + ], + }, + { + name: "prune", + description: "Remove all unused networks", + options: [ + { + name: "--filter", + description: "Provide filter values (e.g. 'until=')", + args: { + name: "filter", + }, + }, + { + name: ["-f", "--force"], + description: "Do not prompt for confirmation", + }, + ], + }, + { + name: "rm", + description: "Remove one or more networks", + args: { + name: "NETWORK", + generators: dockerGenerators.listDockerNetworks, + isVariadic: true, + }, + }, + ], + }, + { + name: "node", + description: "Manage Swarm nodes", + subcommands: [ + { + name: "demote", + description: "Demote one or more nodes from manager in the swarm", + args: { + name: "NODE", + generators: dockerGenerators.listDockerSwarmNodes, + isVariadic: true, + }, + }, + { + name: "inspect", + description: "Display detailed information on one or more nodes", + args: { + name: "NODE", + generators: dockerGenerators.listDockerSwarmNodes, + isVariadic: true, + }, + options: [ + { + name: ["-f", "--format"], + description: "Format the output using the given Go template", + args: { + name: "string", + }, + }, + { + name: "--pretty", + description: "Print the information in a human friendly format", + }, + ], + }, + { + name: "ls", + description: "List nodes in the swarm", + options: [ + { + name: ["-f", "--filter"], + description: "Filter output based on conditions provided", + args: { + name: "filter", + }, + }, + { + name: "--format", + description: "Pretty-print nodes using a Go template", + args: { + name: "string", + }, + }, + { + name: ["-q", "--quiet"], + description: "Only display IDs", + }, + ], + }, + { + name: "promote", + description: "Promote one or more nodes to manager in the swarm", + args: { + name: "NODE", + generators: dockerGenerators.listDockerSwarmNodes, + isVariadic: true, + }, + }, + { + name: "ps", + description: + "List tasks running on one or more nodes, defaults to current node", + args: { + name: "NODE", + generators: dockerGenerators.listDockerSwarmNodes, + isVariadic: true, + }, + options: [ + { + name: ["-f", "--filter"], + description: "Filter output based on conditions provided", + args: { + name: "filter", + }, + }, + { + name: "--format", + description: "Pretty-print tasks using a Go template", + args: { + name: "string", + }, + }, + { + name: "--no-resolve", + description: "Do not map IDs to Names", + }, + { + name: "--no-trunc", + description: "Do not truncate output", + }, + { + name: ["-q", "--quiet"], + description: "Only display task IDs", + }, + ], + }, + { + name: "rm", + description: "Remove one or more nodes from the swarm", + args: { + name: "NODE", + generators: dockerGenerators.listDockerSwarmNodes, + isVariadic: true, + }, + options: [ + { + name: ["-f", "--force"], + description: "Force remove a node from the swarm", + }, + ], + }, + { + name: "update", + description: "Update a node", + args: { + name: "NODE", + generators: dockerGenerators.listDockerSwarmNodes, + isVariadic: true, + }, + options: [ + { + name: "--availability", + description: + 'Availability of the node ("active"|"pause"|"drain")', + args: { + name: "string", + }, + }, + { + name: "--label-add", + description: "Add or update a node label (key=value)", + args: { + name: "list", + }, + }, + { + name: "--label-rm", + description: "Remove a node label if exists", + args: { + name: "list", + }, + }, + { + name: "--role", + description: 'Role of the node ("worker"|"manager")', + args: { + name: "string", + }, + }, + ], + }, + ], + }, + { + name: "buildx", + description: "Extended build capabilities with BuildKit", + subcommands: [ + { + name: "bake", + description: + "Bake is a high-level build command. Each specified target will run in parallel as part of the build", + args: { + name: "string", + }, + options: [ + { + name: ["-f", "--file"], + description: "Build definition file", + args: { + name: "string", + isVariadic: true, + }, + }, + { + name: "--load", + description: "Shorthand for --set=*.output=type=docker", + args: { + name: "string", + }, + }, + { + name: "--metadata-file", + description: "Write build result metadata to the file", + args: { + name: "string", + }, + }, + { + name: "--no-cache", + description: "Do not use cache when building the image", + args: { + name: "string", + }, + }, + { + name: "--print", + description: "Print the options without building", + args: { + name: "string", + }, + }, + { + name: "--progress", + description: + "Set type of progress output (auto, plain, tty). Use plain to show container output", + args: { + name: "progress", + default: "auto", + suggestions: ["auto", "plain", "tty"], + }, + }, + { + name: "--pull", + description: "Always attempt to pull all referenced images", + args: { + name: "string", + }, + }, + { + name: "--push", + description: "Shorthand for --set=*.output=type=registry", + args: { + name: "string", + }, + }, + { + name: "--set", + description: + "Override target value (e.g., targetpattern.key=value)", + args: { + name: "string", + }, + }, + ], + }, + { + name: "build", + description: + "The buildx build command starts a build using BuildKit. This command is similar to the UI of docker build command and takes the same flags and arguments", + args: { + name: "string", + }, + options: [ + { + name: "--add-host", + description: "Add a custom host-to-IP mapping", + args: { + name: "string", + }, + }, + { + name: "--allow", + description: "Allow extra privileged entitlement", + args: { + name: "string", + }, + }, + { + name: "--build-arg", + description: "Set build-time variables", + args: { + name: "string", + }, + }, + { + name: "--build-context", + description: "Additional build contexts", + args: { + name: "string", + }, + }, + { + name: "--cache-from", + description: "External cache sources", + args: { + name: "string", + }, + }, + { + name: "--cache-to", + description: "Cache export destinations", + args: { + name: "string", + }, + }, + { + name: "--cgroup-parent", + description: "Optional parent cgroup for the container", + args: { + name: "string", + }, + }, + { + name: "--compress", + description: "Compress the build context using gzip", + args: { + name: "string", + }, + }, + { + name: "--cpu-period", + description: + "Limit the CPU CFS (Completely Fair Scheduler) period", + args: { + name: "string", + }, + }, + { + name: "--cpu-quota", + description: + "Limit the CPU CFS (Completely Fair Scheduler) quota", + args: { + name: "string", + }, + }, + { + name: ["--cpu-shares", "-c"], + description: "CPU shares (relative weight)", + args: { + name: "string", + }, + }, + { + name: "--cpuset-cpus", + description: "CPUs in which to allow execution (0-3, 0,1)", + args: { + name: "string", + }, + }, + { + name: "--cpuset-mems", + description: "MEMs in which to allow execution (0-3, 0,1)", + args: { + name: "string", + }, + }, + { + name: ["--file", "-f"], + description: "Name of the Dockerfile", + args: { + name: "string", + }, + }, + { + name: "--force-rm", + description: "Always remove intermediate containers", + args: { + name: "string", + }, + }, + { + name: "--iidfile", + description: "Write the image ID to the file", + args: { + name: "string", + }, + }, + { + name: "--invoke", + description: "Invoke a command after the build [experimental]", + args: { + name: "string", + }, + }, + { + name: "--isolation", + description: "Container isolation technology", + args: { + name: "string", + }, + }, + { + name: "--label", + description: "Set metadata for an image", + args: { + name: "string", + }, + }, + { + name: "--load", + description: "Shorthand for --output=type=docker", + args: { + name: "string", + }, + }, + { + name: ["--memory", "-m"], + description: "Memory limit", + args: { + name: "string", + }, + }, + { + name: "--memory-swap", + description: + "Swap limit equal to memory plus swap: -1 to enable unlimited swap", + args: { + name: "string", + }, + }, + { + name: "--metadata-file", + description: "Write build result metadata to the file", + args: { + name: "string", + }, + }, + { + name: "--network", + description: + "Set the networking mode for the RUN instructions during build", + args: { + name: "string", + }, + }, + { + name: "--no-cache", + description: "Do not use cache when building the image", + args: { + name: "string", + }, + }, + { + name: "--no-cache-filter", + description: "Do not cache specified stages", + args: { + name: "string", + }, + }, + { + name: ["--output", "-o"], + description: "Output destination (format: type=local,dest=path)", + args: { + name: "string", + }, + }, + { + name: "--platform", + description: "Set target platform for build", + args: { + name: "string", + }, + }, + { + name: "--print", + description: + "Print result of information request (e.g., outline, targets) [experimental]", + args: { + name: "string", + }, + }, + { + name: "--progress", + description: + "Set type of progress output (auto, plain, tty). Use plain to show container output", + args: { + name: "progress", + default: "auto", + suggestions: ["auto", "plain", "tty"], + }, + }, + { + name: "--pull", + description: "Always attempt to pull all referenced images", + args: { + name: "string", + }, + }, + { + name: "--push", + description: "Shorthand for --output=type=registry", + args: { + name: "string", + }, + }, + { + name: ["--quiet", "-q"], + description: + "Suppress the build output and print image ID on success", + args: { + name: "string", + }, + }, + { + name: "--rm", + description: + "Remove intermediate containers after a successful build", + args: { + name: "container", + default: "true", + }, + }, + { + name: "--secret", + description: + "Secret to expose to the build (format: id=mysecret[,src=/local/secret])", + args: { + name: "string", + }, + }, + { + name: "--security-opt", + description: "Security options", + args: { + name: "string", + }, + }, + { + name: "--shm-size", + description: "Size of /dev/shm", + args: { + name: "string", + }, + }, + { + name: "--squash", + description: "Squash newly built layers into a single new layer", + args: { + name: "string", + }, + }, + { + name: "--ssh", + description: + "SSH agent socket or keys to expose to the build (format: default|<id>[=<socket>|<key>[,<key>]])", + args: { + name: "string", + }, + }, + { + name: ["--tag", "-t"], + description: "Name and optionally a tag (format: name:tag)", + args: { + name: "string", + }, + }, + { + name: "--target", + description: "Set the target build stage to build", + args: { + name: "string", + }, + }, + { + name: "--ulimit", + description: "Ulimit options", + args: { + name: "string", + }, + }, + ], + }, + { + name: "create", + description: "Create a new builder instance", + args: { + name: "string", + }, + options: [ + { + name: "--append", + description: "Append a node to builder instead of changing it", + args: { + name: "string", + }, + }, + { + name: "--bootstrap", + description: "Boot builder after creation", + args: { + name: "string", + }, + }, + { + name: "--buildkitd-flags", + description: "Flags for buildkitd daemon", + args: { + name: "string", + }, + }, + { + name: "--config", + description: "BuildKit config file", + args: { + name: "string", + }, + }, + { + name: "--driver", + description: + "Driver to use (available: docker-container, kubernetes, remote)", + args: { + name: "string", + }, + }, + { + name: "--driver-opt", + description: "Options for the driver", + args: { + name: "string", + }, + }, + { + name: "--leave", + description: "Remove a node from builder instead of changing it", + args: { + name: "string", + }, + }, + { + name: "--name", + description: "Builder instance name", + args: { + name: "string", + }, + }, + { + name: "--node", + description: "Create/modify node with given name", + args: { + name: "string", + }, + }, + { + name: "--platform", + description: "Fixed platforms for current node", + args: { + name: "string", + }, + }, + { + name: "--use", + description: "Set the current builder instance", + args: { + name: "string", + }, + }, + ], + }, + { + name: "du", + description: "Disk usage", + args: { + name: "string", + }, + options: [ + { name: "--filter", description: "Provide filter values" }, + { + name: "--verbose", + description: "Provide a more verbose output", + }, + ], + }, + { + name: "imagetools", + description: + "Imagetools contains commands for working with manifest lists in the registry. These commands are useful for inspecting multi-platform build results", + args: { + name: "string", + }, + subcommands: [ + { + name: "create", + description: "Create a new image based on source images", + args: { + name: "string", + }, + options: [ + { + name: "--append", + description: "Append to existing manifest", + args: { + name: "string", + }, + }, + { + name: "--dry-run", + description: "Show final image instead of pushing", + args: { + name: "string", + }, + }, + { + name: ["--file", "-f"], + description: "Read source descriptor from file", + args: { + name: "string", + }, + }, + { + name: "--progress", + description: + "Set type of progress output (auto, plain, tty). Use plain to show container output", + args: { + name: "progress", + default: "auto", + suggestions: ["auto", "plain", "tty"], + }, + }, + { + name: ["--tag", "-t"], + description: "Set reference for new image", + args: { + name: "string", + }, + }, + ], + }, + { + name: "inspect", + description: "Inspect current builder instance", + args: { + name: "string", + }, + options: [ + { + name: "--format", + description: "Format the output using the given Go template", + args: { + name: "sting", + default: "{{.Manifest}}", + }, + }, + { + name: "--raw", + description: "Show original, unformatted JSON manifest", + }, + ], + }, + ], + }, + { + name: "inspect", + description: "Inspect current builder instance", + args: { + name: "string", + }, + options: [ + { + name: "--bootstrap", + description: "Ensure builder has booted before inspecting", + args: { + name: "string", + }, + }, + ], + }, + { + name: "install", + description: "Install buildx as a ‘docker builder’ alias", + }, + { + name: "ls", + description: "List builder instances", + }, + { + name: "prune", + description: "Remove build cache", + args: { + name: "string", + }, + options: [ + { + name: ["--all", "-a"], + description: "Include internal/frontend images", + args: { + name: "string", + }, + }, + { + name: "--filter", + description: "Provide filter values (e.g., until=24h)", + args: { + name: "string", + }, + }, + { + name: ["--force", "-f"], + description: "Do not prompt for confirmation", + args: { + name: "string", + }, + }, + { + name: "--keep-storage", + description: "Amount of disk space to keep for cache", + args: { + name: "string", + }, + }, + { + name: "--verbose", + description: "Provide a more verbose output", + args: { + name: "string", + }, + }, + ], + }, + { + name: "rm", + description: "Remove a builder instance", + args: { + name: "string", + }, + options: [ + { + name: "--all-inactive", + description: "Remove all inactive builders", + args: { + name: "string", + }, + }, + { + name: ["--force", "-f"], + description: "Do not prompt for confirmation", + args: { + name: "string", + }, + }, + { + name: "--keep-daemon", + description: "Keep the buildkitd daemon running", + args: { + name: "string", + }, + }, + { + name: "--keep-state", + description: "Keep BuildKit state", + args: { + name: "string", + }, + }, + ], + }, + { + name: "stop", + description: "Stop builder instance", + args: { + name: "string", + }, + }, + { + name: "uninstall", + description: "Uninstall the ‘docker builder’ alias", + }, + { + name: "use", + description: "Set the current builder instance", + args: { + name: "string", + }, + options: [ + { + name: "--default", + description: "Set builder as default for current context", + args: { + name: "string", + }, + }, + { + name: "--global", + description: "Builder persists context changes", + args: { + name: "string", + }, + }, + ], + }, + { + name: "version", + description: "Show buildx version information", + }, + ], + options: [ + { + name: "--builder", + description: "Override the configured builder instance", + isPersistent: true, + args: { + name: "string", + }, + }, + ], + }, + { + name: "plugin", + description: "Manage plugins", + subcommands: [ + { + name: "create", + description: + "Create a plugin from a rootfs and configuration. Plugin data directory must contain config.json and rootfs directory", + args: [ + { name: "PLUGIN" }, + { name: "PLUGIN-DATA-DIR", template: "filepaths" }, + ], + options: [ + { + name: "--compress", + description: "Compress the context using gzip", + }, + ], + }, + { + name: "disable", + description: "Disable a plugin", + args: { + name: "PLUGIN", + generators: dockerGenerators.listDockerPlugins, + }, + options: [ + { + name: ["-f", "--force"], + description: "Force the disable of an active plugin", + }, + ], + }, + { + name: "enable", + description: "Enable a plugin", + args: { + name: "PLUGIN", + generators: dockerGenerators.listDockerPlugins, + }, + options: [ + { + name: "--timeout", + description: "HTTP client timeout (in seconds) (default 30)", + args: { + name: "int", + }, + }, + ], + }, + { + name: "inspect", + description: "Display detailed information on one or more plugins", + args: { + name: "PLUGIN", + generators: dockerGenerators.listDockerPlugins, + isVariadic: true, + }, + options: [ + { + name: ["-f", "--format"], + description: "Format the output using the given Go template", + args: { + name: "string", + }, + }, + ], + }, + { + name: "install", + description: "Install a plugin", + args: [{ name: "PLUGIN" }, { name: "KEY=VALUE", isVariadic: true }], + options: [ + { + name: "--alias", + description: "Local name for plugin", + args: { + name: "string", + }, + }, + { + name: "--disable", + description: "Do not enable the plugin on install", + }, + { + name: "--disable-content-trust", + description: "Skip image verification (default true)", + }, + { + name: "--grant-all-permissions", + description: "Grant all permissions necessary to run the plugin", + }, + ], + }, + { + name: "ls", + description: "List plugins", + options: [ + { + name: ["-f", "--filter"], + description: "Provide filter values (e.g. 'enabled=true')", + args: { + name: "filter", + }, + }, + { + name: "--format", + description: "Pretty-print plugins using a Go template", + args: { + name: "string", + }, + }, + { + name: "--no-trunc", + description: "Don't truncate output", + }, + { + name: ["-q", "--quiet"], + description: "Only display plugin IDs", + }, + ], + }, + { + name: "push", + description: "Push a plugin to a registry", + args: { name: "PLUGIN:[TAG]" }, + options: [ + { + name: "--disable-content-trust", + description: "Skip image signing (default true)", + }, + ], + }, + { + name: "rm", + description: "Remove one or more plugins", + args: { + name: "PLUGIN", + generators: dockerGenerators.listDockerPlugins, + isVariadic: true, + }, + options: [ + { + name: ["-f", "--force"], + description: "Force the removal of an active plugin", + }, + ], + }, + { + name: "set", + description: "Change settings for a plugin", + args: [ + { + name: "PLUGIN", + generators: dockerGenerators.listDockerPlugins, + }, + { name: "KEY=VALUE", isVariadic: true }, + ], + }, + { + name: "upgrade", + description: "Upgrade an existing plugin", + args: [ + { + name: "PLUGIN", + generators: dockerGenerators.listDockerPlugins, + }, + { name: "REMOTE" }, + ], + options: [ + { + name: "--disable-content-trust", + description: "Skip image verification (default true)", + }, + { + name: "--grant-all-permissions", + description: "Grant all permissions necessary to run the plugin", + }, + { + name: "--skip-remote-check", + description: + "Do not check if specified remote plugin matches existing plugin image", + }, + ], + }, + ], + }, + { + name: "secret", + description: "Manage Docker secrets", + subcommands: [ + { + name: "create", + description: "Create a secret from a file or STDIN as content", + args: [ + { + name: "SECRET NAME", + }, + { + name: "SECRET", + template: "filepaths", + }, + ], + options: [ + { + name: ["-d", "--driver"], + description: "Secret driver", + args: { + name: "string", + }, + }, + { + name: ["-l", "--label"], + description: "Secret labels", + args: { + name: "list", + }, + }, + { + name: "--template-driver", + description: "Template driver", + args: { + name: "string", + }, + }, + ], + }, + { + name: "inspect", + description: "Display detailed information on one or more secrets", + args: { + name: "SECRET", + generators: dockerGenerators.listDockerSecrets, + isVariadic: true, + }, + options: [ + { + name: ["-f", "--format"], + description: "Format the output using the given Go template", + args: { + name: "string", + }, + }, + { + name: "--pretty", + description: "Print the information in a human friendly format", + }, + ], + }, + { + name: "ls", + description: "List secrets", + options: [ + { + name: ["-f", "--filter"], + description: "Filter output based on conditions provided", + args: { + name: "filter", + }, + }, + { + name: "--format", + description: "Pretty-print secrets using a Go template", + args: { + name: "string", + }, + }, + { + name: ["-q", "--quiet"], + description: "Only display IDs", + }, + ], + }, + { + name: "rm", + description: "Remove one or more secrets", + args: { + name: "SECRET", + generators: dockerGenerators.listDockerSecrets, + isVariadic: true, + }, + }, + ], + }, + { + name: "service", + description: "Manage services", + subcommands: [ + { + name: "create", + description: "Create a new service", + args: [ + imagesArg, + { + name: "COMMAND", + isOptional: true, + isCommand: true, + }, + ], + options: [ + { + name: "--cap-add", + description: "Add Linux capabilities", + args: { + name: "list", + }, + }, + { + name: "--cap-drop", + description: "Drop Linux capabilities", + args: { + name: "list", + }, + }, + { + name: "--config", + description: "Specify configurations to expose to the service", + args: { + name: "config", + }, + }, + { + name: "--constraint", + description: "Placement constraints", + args: { + name: "list", + }, + }, + { + name: "--container-label", + description: "Container labels", + args: { + name: "list", + }, + }, + { + name: "--credential-spec", + description: + "Credential spec for managed service account (Windows only)", + args: { + name: "credential-spec", + }, + }, + { + name: ["-d", "--detach"], + description: + "Exit immediately instead of waiting for the service to converge", + }, + { + name: "--dns", + description: "Set custom DNS servers", + args: { + name: "list", + }, + }, + { + name: "--dns-option", + description: "Set DNS options", + args: { + name: "list", + }, + }, + { + name: "--dns-search", + description: "Set custom DNS search domains", + args: { + name: "list", + }, + }, + { + name: "--endpoint-mode", + description: 'Endpoint mode (vip or dnsrr) (default "vip")', + args: { + name: "string", + }, + }, + { + name: "--entrypoint", + description: "Overwrite the default ENTRYPOINT of the image", + args: { + name: "command", + }, + }, + { + name: ["-e", "--env"], + description: "Set environment variables", + args: { + name: "list", + }, + }, + { + name: "--env-file", + description: "Read in a file of environment variables", + args: { + name: "list", + }, + }, + { + name: "--generic-resource", + description: "User defined resources", + args: { + name: "list", + }, + }, + { + name: "--group", + description: + "Set one or more supplementary user groups for the container", + args: { + name: "list", + }, + }, + { + name: "--health-cmd", + description: "Command to run to check health", + args: { + name: "string", + }, + }, + { + name: "--health-interval", + description: "Time between running the check (ms|s|m|h)", + args: { + name: "duration", + }, + }, + { + name: "--health-retries", + description: "Consecutive failures needed to report unhealthy", + args: { + name: "int", + }, + }, + { + name: "--health-start-period", + description: + "Start period for the container to initialize before counting retries towards unstable (ms|s|m|h)", + args: { + name: "duration", + }, + }, + { + name: "--health-timeout", + description: "Maximum time to allow one check to run (ms|s|m|h)", + args: { + name: "duration", + }, + }, + { + name: "--host", + description: + "Set one or more custom host-to-IP mappings (host:ip)", + args: { + name: "list", + }, + }, + { + name: "--hostname", + description: "Container hostname", + args: { + name: "string", + }, + }, + { + name: "--init", + description: + "Use an init inside each service container to forward signals and reap processes", + }, + { + name: "--isolation", + description: "Service container isolation mode", + args: { + name: "string", + }, + }, + { + name: ["-l", "--label"], + description: "Service labels", + args: { + name: "list", + }, + }, + { + name: "--limit-cpu", + description: "Limit CPUs", + args: { + name: "decimal", + }, + }, + { + name: "--limit-memory", + description: "Limit Memory", + args: { + name: "bytes", + }, + }, + { + name: "--limit-pids", + description: + "Limit maximum number of processes (default 0 = unlimited)", + args: { + name: "int", + }, + }, + { + name: "--log-driver", + description: "Logging driver for service", + args: { + name: "string", + }, + }, + { + name: "--log-opt", + description: "Logging driver options", + args: { + name: "list", + }, + }, + { + name: "--max-concurrent", + description: + "Number of job tasks to run concurrently (default equal to --replicas)", + args: { + name: "uint", + }, + }, + { + name: "--mode", + description: + 'Service mode (replicated, global, replicated-job, or global-job) (default "replicated")', + args: { + name: "string", + suggestions: [ + "replicated", + "global", + "replicated-job", + "global-job", + ], + }, + }, + { + name: "--mount", + description: "Attach a filesystem mount to the service", + args: { + name: "mount", + }, + }, + { + name: "--name", + description: "Service name", + args: { + name: "string", + }, + }, + { + name: "--network", + description: "Network attachments", + args: { + name: "network", + }, + }, + { + name: "--no-healthcheck", + description: "Disable any container-specified HEALTHCHECK", + }, + { + name: "--no-resolve-image", + description: + "Do not query the registry to resolve image digest and supported platforms", + }, + { + name: "--placement-pref", + description: "Add a placement preference", + args: { + name: "pref", + }, + }, + { + name: ["-p", "--publish"], + description: "Publish a port as a node port", + args: { + name: "port", + }, + }, + { + name: ["-q", "--quiet"], + description: "Suppress progress output", + }, + { + name: "--read-only", + description: "Mount the container's root filesystem as read only", + }, + { + name: "--replicas", + description: "Number of tasks", + args: { + name: "uint", + }, + }, + { + name: "--replicas-max-per-node", + description: + "Maximum number of tasks per node (default 0 = unlimited)", + args: { + name: "uint", + }, + }, + { + name: "--reserve-cpu", + description: "Reserve CPUs", + args: { + name: "decimal", + }, + }, + { + name: "--reserve-memory", + description: "Reserve Memory", + args: { + name: "bytes", + }, + }, + { + name: "--restart-condition", + description: + 'Restart when condition is met ("none"|"on-failure"|"any") (default "any")', + args: { + name: "string", + }, + }, + { + name: "--restart-delay", + description: + "Delay between restart attempts (ns|us|ms|s|m|h) (default 5s)", + args: { + name: "duration", + }, + }, + { + name: "--restart-max-attempts", + description: "Maximum number of restarts before giving up", + args: { + name: "uint", + }, + }, + { + name: "--restart-window", + description: + "Window used to evaluate the restart policy (ns|us|ms|s|m|h)", + args: { + name: "duration", + }, + }, + { + name: "--rollback-delay", + description: + "Delay between task rollbacks (ns|us|ms|s|m|h) (default 0s)", + args: { + name: "duration", + }, + }, + { + name: "--rollback-failure-action", + description: + 'Action on rollback failure ("pause"|"continue") (default "pause")', + args: { + name: "string", + }, + }, + { + name: "--rollback-max-failure-ratio", + description: + "Failure rate to tolerate during a rollback (default 0)", + args: { + name: "float", + }, + }, + { + name: "--rollback-monitor", + description: + "Duration after each task rollback to monitor for failure (ns|us|ms|s|m|h) (default 5s)", + args: { + name: "duration", + }, + }, + { + name: "--rollback-order", + description: + 'Rollback order ("start-first"|"stop-first") (default "stop-first")', + args: { + name: "string", + }, + }, + { + name: "--rollback-parallelism", + description: + "Maximum number of tasks rolled back simultaneously (0 to roll back all at once) (default 1)", + args: { + name: "uint", + }, + }, + { + name: "--secret", + description: "Specify secrets to expose to the service", + args: { + name: "secret", + }, + }, + { + name: "--stop-grace-period", + description: + "Time to wait before force killing a container (ns|us|ms|s|m|h) (default 10s)", + args: { + name: "duration", + }, + }, + { + name: "--stop-signal", + description: "Signal to stop the container", + args: { + name: "string", + }, + }, + { + name: "--sysctl", + description: "Sysctl options", + args: { + name: "list", + }, + }, + { + name: ["-t", "--tty"], + description: "Allocate a pseudo-TTY", + }, + { + name: "--ulimit", + description: "Ulimit options (default [])", + args: { + name: "ulimit", + }, + }, + { + name: "--update-delay", + description: + "Delay between updates (ns|us|ms|s|m|h) (default 0s)", + args: { + name: "duration", + }, + }, + { + name: "--update-failure-action", + description: + 'Action on update failure ("pause"|"continue"|"rollback") (default "pause")', + args: { + name: "string", + }, + }, + { + name: "--update-max-failure-ratio", + description: + "Failure rate to tolerate during an update (default 0)", + args: { + name: "float", + }, + }, + { + name: "--update-monitor", + description: + "Duration after each task update to monitor for failure (ns|us|ms|s|m|h) (default 5s)", + args: { + name: "duration", + }, + }, + { + name: "--update-order", + description: + 'Update order ("start-first"|"stop-first") (default "stop-first")', + args: { + name: "string", + }, + }, + { + name: "--update-parallelism", + description: + "Maximum number of tasks updated simultaneously (0 to update all at once) (default 1)", + args: { + name: "uint", + }, + }, + { + name: ["-u", "--user"], + description: "Username or UID (format: [:])", + args: { + name: "string", + }, + }, + { + name: "--with-registry-auth", + description: + "Send registry authentication details to swarm agents", + }, + { + name: ["-w", "--workdir"], + description: "Working directory inside the container", + args: { + name: "string", + }, + }, + ], + }, + { + name: "inspect", + description: "Display detailed information on one or more services", + args: { + name: "SERVICE", + generators: dockerGenerators.listDockerServices, + isVariadic: true, + }, + options: [ + { + name: ["-f", "--format"], + description: "Format the output using the given Go template", + args: { + name: "string", + }, + }, + { + name: "--pretty", + description: "Print the information in a human friendly format", + }, + ], + }, + { + name: "logs", + description: "Fetch the logs of a service or task", + args: { + name: "SERVICE OR TASK", + generators: dockerGenerators.listDockerServices, + }, + options: [ + { + name: "--details", + description: "Show extra details provided to logs", + }, + { + name: ["-f", "--follow"], + description: "Follow log output", + }, + { + name: "--no-resolve", + description: "Do not map IDs to Names in output", + }, + { + name: "--no-task-ids", + description: "Do not include task IDs in output", + }, + { + name: "--no-trunc", + description: "Do not truncate output", + }, + { + name: "--raw", + description: "Do not neatly format logs", + }, + { + name: "--since", + description: + "Show logs since timestamp (e.g. 2013-01-02T13:23:37Z) or relative (e.g. 42m for 42 minutes)", + args: { + name: "string", + }, + }, + { + name: ["-n", "--tail"], + description: + 'Number of lines to show from the end of the logs (default "all")', + args: { + name: "string", + }, + }, + { + name: ["-t", "--timestamps"], + description: "Show timestamps", + }, + ], + }, + { + name: "ls", + description: "List services", + options: [ + { + name: ["-f", "--filter"], + description: "Filter output based on conditions provided", + args: { + name: "filter", + }, + }, + { + name: "--format", + description: "Pretty-print services using a Go template", + args: { + name: "string", + }, + }, + { + name: ["-q", "--quiet"], + description: "Only display IDs", + }, + ], + }, + { + name: "ps", + description: "List the tasks of one or more services", + args: { + name: "SERVICE", + generators: dockerGenerators.listDockerServices, + isVariadic: true, + }, + options: [ + { + name: ["-f", "--filter"], + description: "Filter output based on conditions provided", + args: { + name: "filter", + }, + }, + { + name: "--format", + description: "Pretty-print tasks using a Go template", + args: { + name: "string", + }, + }, + { + name: "--no-resolve", + description: "Do not map IDs to Names", + }, + { + name: "--no-trunc", + description: "Do not truncate output", + }, + { + name: ["-q", "--quiet"], + description: "Only display task IDs", + }, + ], + }, + { + name: "rm", + description: "Remove one or more services", + args: { + name: "SERVICE", + generators: dockerGenerators.listDockerServices, + isVariadic: true, + }, + }, + { + name: "rollback", + description: "Revert changes to a service's configuration", + args: { + name: "SERVICE", + generators: dockerGenerators.listDockerServices, + }, + options: [ + { + name: ["-d", "--detach"], + description: + "Exit immediately instead of waiting for the service to converge", + }, + { + name: ["-q", "--quiet"], + description: "Suppress progress output", + }, + ], + }, + { + name: "scale", + description: "Scale one or multiple replicated services", + args: { + name: "SERVICE=REPLICAS", + generators: dockerGenerators.listDockerServicesReplicas, + isVariadic: true, + }, + options: [ + { + name: ["-d", "--detach"], + description: + "Exit immediately instead of waiting for the service to converge", + }, + ], + }, + { + name: "update", + description: "Update a service", + args: { + name: "SERVICE", + generators: dockerGenerators.listDockerServices, + }, + options: [ + { + name: "--args", + description: "Service command args", + args: { + name: "command", + }, + }, + { + name: "--cap-add", + description: "Add Linux capabilities", + args: { + name: "list", + }, + }, + { + name: "--cap-drop", + description: "Drop Linux capabilities", + args: { + name: "list", + }, + }, + { + name: "--config-add", + description: "Add or update a config file on a service", + args: { + name: "config", + }, + }, + { + name: "--config-rm", + description: "Remove a configuration file", + args: { + name: "list", + }, + }, + { + name: "--constraint-add", + description: "Add or update a placement constraint", + args: { + name: "list", + }, + }, + { + name: "--constraint-rm", + description: "Remove a constraint", + args: { + name: "list", + }, + }, + { + name: "--container-label-add", + description: "Add or update a container label", + args: { + name: "list", + }, + }, + { + name: "--container-label-rm", + description: "Remove a container label by its key", + args: { + name: "list", + }, + }, + { + name: "--credential-spec", + description: + "Credential spec for managed service account (Windows only)", + args: { + name: "credential-spec", + }, + }, + { + name: ["-d", "--detach"], + description: + "Exit immediately instead of waiting for the service to converge", + }, + { + name: "--dns-add", + description: "Add or update a custom DNS server", + args: { + name: "list", + }, + }, + { + name: "--dns-option-add", + description: "Add or update a DNS option", + args: { + name: "list", + }, + }, + { + name: "--dns-option-rm", + description: "Remove a DNS option", + args: { + name: "list", + }, + }, + { + name: "--dns-rm", + description: "Remove a custom DNS server", + args: { + name: "list", + }, + }, + { + name: "--dns-search-add", + description: "Add or update a custom DNS search domain", + args: { + name: "list", + }, + }, + { + name: "--dns-search-rm", + description: "Remove a DNS search domain", + args: { + name: "list", + }, + }, + { + name: "--endpoint-mode", + description: "Endpoint mode (vip or dnsrr)", + args: { + name: "string", + }, + }, + { + name: "--entrypoint", + description: "Overwrite the default ENTRYPOINT of the image", + args: { + name: "command", + }, + }, + { + name: "--env-add", + description: "Add or update an environment variable", + args: { + name: "list", + }, + }, + { + name: "--env-rm", + description: "Remove an environment variable", + args: { + name: "list", + }, + }, + { + name: "--force", + description: "Force update even if no changes require it", + }, + { + name: "--generic-resource-add", + description: "Add a Generic resource", + args: { + name: "list", + }, + }, + { + name: "--generic-resource-rm", + description: "Remove a Generic resource", + args: { + name: "list", + }, + }, + { + name: "--group-add", + description: + "Add an additional supplementary user group to the container", + args: { + name: "list", + }, + }, + { + name: "--group-rm", + description: + "Remove a previously added supplementary user group from the container", + args: { + name: "list", + }, + }, + { + name: "--health-cmd", + description: "Command to run to check health", + args: { + name: "string", + }, + }, + { + name: "--health-interval", + description: "Time between running the check (ms|s|m|h)", + args: { + name: "duration", + }, + }, + { + name: "--health-retries", + description: "Consecutive failures needed to report unhealthy", + args: { + name: "int", + }, + }, + { + name: "--health-start-period", + description: + "Start period for the container to initialize before counting retries towards unstable (ms|s|m|h)", + args: { + name: "duration", + }, + }, + { + name: "--health-timeout", + description: "Maximum time to allow one check to run (ms|s|m|h)", + args: { + name: "duration", + }, + }, + { + name: "--host-add", + description: "Add a custom host-to-IP mapping (host:ip)", + args: { + name: "list", + }, + }, + { + name: "--host-rm", + description: "Remove a custom host-to-IP mapping (host:ip)", + args: { + name: "list", + }, + }, + { + name: "--hostname", + description: "Container hostname", + args: { + name: "string", + }, + }, + { + name: "--image", + description: "Service image tag", + args: { + name: "string", + }, + }, + { + name: "--init", + description: + "Use an init inside each service container to forward signals and reap processes", + }, + { + name: "--isolation", + description: "Service container isolation mode", + args: { + name: "string", + }, + }, + { + name: "--label-add", + description: "Add or update a service label", + args: { + name: "list", + }, + }, + { + name: "--label-rm", + description: "Remove a label by its key", + args: { + name: "list", + }, + }, + { + name: "--limit-cpu", + description: "Limit CPUs", + args: { + name: "decimal", + }, + }, + { + name: "--limit-memory", + description: "Limit Memory", + args: { + name: "bytes", + }, + }, + { + name: "--limit-pids", + description: + "Limit maximum number of processes (default 0 = unlimited)", + args: { + name: "int", + }, + }, + { + name: "--log-driver", + description: "Logging driver for service", + args: { + name: "string", + }, + }, + { + name: "--log-opt", + description: "Logging driver options", + args: { + name: "list", + }, + }, + { + name: "--max-concurrent", + description: + "Number of job tasks to run concurrently (default equal to --replicas)", + args: { + name: "uint", + }, + }, + { + name: "--mount-add", + description: "Add or update a mount on a service", + args: { + name: "mount", + }, + }, + { + name: "--mount-rm", + description: "Remove a mount by its target path", + args: { + name: "list", + }, + }, + { + name: "--network-add", + description: "Add a network", + args: { + name: "network", + }, + }, + { + name: "--network-rm", + description: "Remove a network", + args: { + name: "list", + }, + }, + { + name: "--no-healthcheck", + description: "Disable any container-specified HEALTHCHECK", + }, + { + name: "--no-resolve-image", + description: + "Do not query the registry to resolve image digest and supported platforms", + }, + { + name: "--placement-pref-add", + description: "Add a placement preference", + args: { + name: "pref", + }, + }, + { + name: "--placement-pref-rm", + description: "Remove a placement preference", + args: { + name: "pref", + }, + }, + { + name: "--publish-add", + description: "Add or update a published port", + args: { + name: "port", + }, + }, + { + name: "--publish-rm", + description: "Remove a published port by its target port", + args: { + name: "port", + }, + }, + { + name: ["-q", "--quiet"], + description: "Suppress progress output", + }, + { + name: "--read-only", + description: "Mount the container's root filesystem as read only", + }, + { + name: "--replicas", + description: "Number of tasks", + args: { + name: "uint", + }, + }, + { + name: "--replicas-max-per-node", + description: + "Maximum number of tasks per node (default 0 = unlimited)", + args: { + name: "uint", + }, + }, + { + name: "--reserve-cpu", + description: "Reserve CPUs", + args: { + name: "decimal", + }, + }, + { + name: "--reserve-memory", + description: "Reserve Memory", + args: { + name: "bytes", + }, + }, + { + name: "--restart-condition", + description: + 'Restart when condition is met ("none"|"on-failure"|"any")', + args: { + name: "string", + }, + }, + { + name: "--restart-delay", + description: "Delay between restart attempts (ns|us|ms|s|m|h)", + args: { + name: "duration", + }, + }, + { + name: "--restart-max-attempts", + description: "Maximum number of restarts before giving up", + args: { + name: "uint", + }, + }, + { + name: "--restart-window", + description: + "Window used to evaluate the restart policy (ns|us|ms|s|m|h)", + args: { + name: "duration", + }, + }, + { + name: "--rollback", + description: "Rollback to previous specification", + }, + { + name: "--rollback-delay", + description: "Delay between task rollbacks (ns|us|ms|s|m|h)", + args: { + name: "duration", + }, + }, + { + name: "--rollback-failure-action", + description: 'Action on rollback failure ("pause"|"continue")', + args: { + name: "string", + }, + }, + { + name: "--rollback-max-failure-ratio", + description: "Failure rate to tolerate during a rollback", + args: { + name: "float", + }, + }, + { + name: "--rollback-monitor", + description: + "Duration after each task rollback to monitor for failure (ns|us|ms|s|m|h)", + args: { + name: "duration", + }, + }, + { + name: "--rollback-order", + description: 'Rollback order ("start-first"|"stop-first")', + args: { + name: "string", + }, + }, + { + name: "--rollback-parallelism", + description: + "Maximum number of tasks rolled back simultaneously (0 to roll back all at once)", + args: { + name: "uint", + }, + }, + { + name: "--secret-add", + description: "Add or update a secret on a service", + args: { + name: "secret", + }, + }, + { + name: "--secret-rm", + description: "Remove a secret", + args: { + name: "list", + }, + }, + { + name: "--stop-grace-period", + description: + "Time to wait before force killing a container (ns|us|ms|s|m|h)", + args: { + name: "duration", + }, + }, + { + name: "--stop-signal", + description: "Signal to stop the container", + args: { + name: "string", + }, + }, + { + name: "--sysctl-add", + description: "Add or update a Sysctl option", + args: { + name: "list", + }, + }, + { + name: "--sysctl-rm", + description: "Remove a Sysctl option", + args: { + name: "list", + }, + }, + { + name: ["-t", "--tty"], + description: "Allocate a pseudo-TTY", + }, + { + name: "--ulimit-add", + description: "Add or update a ulimit option (default [])", + args: { + name: "ulimit", + }, + }, + { + name: "--ulimit-rm", + description: "Remove a ulimit option", + args: { + name: "list", + }, + }, + { + name: "--update-delay", + description: "Delay between updates (ns|us|ms|s|m|h)", + args: { + name: "duration", + }, + }, + { + name: "--update-failure-action", + description: + 'Action on update failure ("pause"|"continue"|"rollback")', + args: { + name: "string", + }, + }, + { + name: "--update-max-failure-ratio", + description: "Failure rate to tolerate during an update", + args: { + name: "float", + }, + }, + { + name: "--update-monitor", + description: + "Duration after each task update to monitor for failure (ns|us|ms|s|m|h)", + args: { + name: "duration", + }, + }, + { + name: "--update-order", + description: 'Update order ("start-first"|"stop-first")', + args: { + name: "string", + }, + }, + { + name: "--update-parallelism", + description: + "Maximum number of tasks updated simultaneously (0 to update all at once)", + args: { + name: "uint", + }, + }, + { + name: ["-u", "--user"], + description: "Username or UID (format: [:])", + args: { + name: "string", + }, + }, + { + name: "--with-registry-auth", + description: + "Send registry authentication details to swarm agents", + }, + { + name: ["-w", "--workdir"], + description: "Working directory inside the container", + args: { + name: "string", + }, + }, + ], + }, + ], + }, + { + name: "stack", + description: "Manage Docker stacks", + subcommands: [ + { + name: "deploy", + description: "Deploy a new stack or update an existing stack", + args: { + name: "STACK", + }, + options: [ + { + name: ["-c", "--compose-file"], + description: 'Path to a Compose file, or "-" to read from stdin', + args: { + name: "strings", + template: "filepaths", + }, + }, + { + name: "--orchestrator", + description: "Orchestrator to use (swarm|kubernetes|all)", + args: { + name: "string", + }, + }, + { + name: "--prune", + description: "Prune services that are no longer referenced", + }, + { + name: "--resolve-image", + description: + 'Query the registry to resolve image digest and supported platforms ("always"|"changed"|"never") (default "always")', + args: { + name: "string", + }, + }, + { + name: "--with-registry-auth", + description: + "Send registry authentication details to Swarm agents", + }, + ], + }, + { + name: "ls", + description: "List stacks", + options: [ + { + name: "--format", + description: "Pretty-print stacks using a Go template", + args: { + name: "string", + }, + }, + { + name: "--orchestrator", + description: "Orchestrator to use (swarm|kubernetes|all)", + args: { + name: "string", + }, + }, + ], + }, + { + name: "ps", + description: "List the tasks in the stack", + args: { + name: "STACK", + generators: dockerGenerators.listDockerStacks, + }, + options: [ + { + name: ["-f", "--filter"], + description: "Filter output based on conditions provided", + args: { + name: "filter", + }, + }, + { + name: "--format", + description: "Pretty-print tasks using a Go template", + args: { + name: "string", + }, + }, + { + name: "--no-resolve", + description: "Do not map IDs to Names", + }, + { + name: "--no-trunc", + description: "Do not truncate output", + }, + { + name: "--orchestrator", + description: "Orchestrator to use (swarm|kubernetes|all)", + args: { + name: "string", + }, + }, + { + name: ["-q", "--quiet"], + description: "Only display task IDs", + }, + ], + }, + { + name: "rm", + description: "Remove one or more stacks", + args: { + name: "STACK", + generators: dockerGenerators.listDockerStacks, + isVariadic: true, + }, + options: [ + { + name: "--orchestrator", + description: "Orchestrator to use (swarm|kubernetes|all)", + args: { + name: "string", + }, + }, + ], + }, + { + name: "services", + description: "List the services in the stack", + args: { + name: "STACK", + generators: dockerGenerators.listDockerStacks, + }, + options: [ + { + name: ["-f", "--filter"], + description: "Filter output based on conditions provided", + args: { + name: "filter", + }, + }, + { + name: "--format", + description: "Pretty-print services using a Go template", + args: { + name: "string", + }, + }, + { + name: "--orchestrator", + description: "Orchestrator to use (swarm|kubernetes|all)", + args: { + name: "string", + }, + }, + { + name: ["-q", "--quiet"], + description: "Only display IDs", + }, + ], + }, + ], + }, + { + name: "swarm", + description: "Manage Swarm", + subcommands: [ + { + name: "ca", + description: "Display and rotate the root CA", + options: [ + { + name: "--ca-cert", + description: + "Path to the PEM-formatted root CA certificate to use for the new cluster", + args: { + name: "pem-file", + template: "filepaths", + }, + }, + { + name: "--ca-key", + description: + "Path to the PEM-formatted root CA key to use for the new cluster", + args: { + name: "pem-file", + template: "filepaths", + }, + }, + { + name: "--cert-expiry", + description: + "Validity period for node certificates (ns|us|ms|s|m|h) (default 2160h0m0s)", + args: { + name: "duration", + }, + }, + { + name: ["-d", "--detach"], + description: + "Exit immediately instead of waiting for the root rotation to converge", + }, + { + name: "--external-ca", + description: + "Specifications of one or more certificate signing endpoints", + args: { + name: "external-ca", + }, + }, + { + name: ["-q", "--quiet"], + description: "Suppress progress output", + }, + { + name: "--rotate", + description: + "Rotate the swarm CA - if no certificate or key are provided, new ones will be generated", + }, + ], + }, + { + name: "init", + description: "Initialize a swarm", + options: [ + { + name: "--advertise-addr", + description: "Advertised address (format: [:port])", + args: { + name: "string", + }, + }, + { + name: "--autolock", + description: + "Enable manager autolocking (requiring an unlock key to start a stopped manager)", + }, + { + name: "--availability", + description: + 'Availability of the node ("active"|"pause"|"drain") (default "active")', + args: { + name: "string", + }, + }, + { + name: "--cert-expiry", + description: + "Validity period for node certificates (ns|us|ms|s|m|h) (default 2160h0m0s)", + args: { + name: "duration", + }, + }, + { + name: "--data-path-addr", + description: + "Address or interface to use for data path traffic (format: )", + args: { + name: "string", + }, + }, + { + name: "--data-path-port", + description: + "Port number to use for data path traffic (1024 - 49151). If no value is set or is set to 0, the default port (4789) is used", + args: { + name: "uint32", + }, + }, + { + name: "--default-addr-pool", + description: "Default address pool in CIDR format (default [])", + args: { + name: "ipNetSlice", + }, + }, + { + name: "--default-addr-pool-mask-length", + description: + "Default address pool subnet mask length (default 24)", + args: { + name: "uint32", + }, + }, + { + name: "--dispatcher-heartbeat", + description: + "Dispatcher heartbeat period (ns|us|ms|s|m|h) (default 5s)", + args: { + name: "duration", + }, + }, + { + name: "--external-ca", + description: + "Specifications of one or more certificate signing endpoints", + args: { + name: "external-ca", + }, + }, + { + name: "--force-new-cluster", + description: "Force create a new cluster from current state", + }, + { + name: "--listen-addr", + description: + "Listen address (format: [:port]) (default 0.0.0.0:2377)", + args: { + name: "node-addr", + }, + }, + { + name: "--max-snapshots", + description: "Number of additional Raft snapshots to retain", + args: { + name: "uint", + }, + }, + { + name: "--snapshot-interval", + description: + "Number of log entries between Raft snapshots (default 10000)", + args: { + name: "uint", + }, + }, + { + name: "--task-history-limit", + description: "Task history retention limit (default 5)", + args: { + name: "int", + }, + }, + ], + }, + { + name: "join", + description: "Join a swarm as a node and/or manager", + args: { + name: "HOST:PORT", + }, + options: [ + { + name: "--advertise-addr", + description: "Advertised address (format: [:port])", + args: { + name: "string", + }, + }, + { + name: "--availability", + description: + 'Availability of the node ("active"|"pause"|"drain") (default "active")', + args: { + name: "string", + }, + }, + { + name: "--data-path-addr", + description: + "Address or interface to use for data path traffic (format: )", + args: { + name: "string", + }, + }, + { + name: "--listen-addr", + description: + "Listen address (format: [:port]) (default 0.0.0.0:2377)", + args: { + name: "node-addr", + }, + }, + { + name: "--token", + description: "Token for entry into the swarm", + args: { + name: "string", + }, + }, + ], + }, + { + name: "join-token", + description: "Manage join tokens", + args: { + name: "worker or manager", + suggestions: ["worker", "manager"], + }, + options: [ + { + name: ["-q", "--quiet"], + description: "Only display token", + }, + { + name: "--rotate", + description: "Rotate join token", + }, + ], + }, + { + name: "leave", + description: "Leave the swarm", + options: [ + { + name: ["-f", "--force"], + description: + "Force this node to leave the swarm, ignoring warnings", + }, + ], + }, + { + name: "unlock", + description: "Unlock swarm", + }, + { + name: "unlock-key", + description: "Manage the unlock key", + options: [ + { + name: ["-q", "--quiet"], + description: "Only display token", + }, + { + name: "--rotate", + description: "Rotate unlock key", + }, + ], + }, + { + name: "update", + description: "Update the swarm", + options: [ + { + name: "--autolock", + description: "Change manager autolocking setting (true|false)", + args: { + suggestions: ["true", "false"], + }, + }, + { + name: "--cert-expiry", + description: + "Validity period for node certificates (ns|us|ms|s|m|h) (default 2160h0m0s)", + args: { + name: "duration", + }, + }, + { + name: "--dispatcher-heartbeat", + description: + "Dispatcher heartbeat period (ns|us|ms|s|m|h) (default 5s)", + args: { + name: "duration", + }, + }, + { + name: "--external-ca", + description: + "Specifications of one or more certificate signing endpoints", + args: { + name: "external-ca", + }, + }, + { + name: "--max-snapshots", + description: "Number of additional Raft snapshots to retain", + args: { + name: "uint", + }, + }, + { + name: "--snapshot-interval", + description: + "Number of log entries between Raft snapshots (default 10000)", + args: { + name: "uint", + }, + }, + { + name: "--task-history-limit", + description: "Task history retention limit (default 5)", + args: { + name: "int", + }, + }, + ], + }, + ], + }, + { + name: "system", + description: "Manage Docker", + subcommands: [ + { + name: "prune", + description: "Remove unused data", + options: [ + { + name: ["-a", "--all"], + description: "Remove all unused images not just dangling ones", + }, + { + name: "--filter", + description: `Provide filter values (e.g. 'label==')", + args: { + name: "filter", + }, + }, + { + name: ["-f", "--force"], + description: "Do not prompt for confirmation", + }, + ], + }, + { + name: "rm", + description: "Remove one or more volumes", + args: { + name: "VOLUME", + generators: dockerGenerators.listDockerVolumes, + isVariadic: true, + }, + options: [ + { + name: ["-f", "--force"], + description: "Force the removal of one or more volumes", + }, + ], + }, + ], + }, + { + name: "compose", + description: "Define and run multi-container applications with Docker", + loadSpec: "docker-compose", + }, + ], +}; + +export default completionSpec; diff --git a/extensions/terminal-suggest/src/completions/upstream/dotnet.ts b/extensions/terminal-suggest/src/completions/upstream/dotnet.ts new file mode 100644 index 00000000000..adb415aa087 --- /dev/null +++ b/extensions/terminal-suggest/src/completions/upstream/dotnet.ts @@ -0,0 +1,249 @@ +import { filepaths } from '../../helpers/filepaths'; + +const DOTNET_ICON = + "https://upload.wikimedia.org/wikipedia/commons/7/7d/Microsoft_.NET_logo.svg"; + +const commands: Fig.Subcommand[] = [ + { + name: "new", + loadSpec: "dotnet/dotnet-new", + icon: DOTNET_ICON, + }, + { + name: "add", + loadSpec: "dotnet/dotnet-add", + icon: DOTNET_ICON, + }, + { + name: "list", + loadSpec: "dotnet/dotnet-list", + icon: DOTNET_ICON, + }, + { + name: "remove", + loadSpec: "dotnet/dotnet-remove", + icon: DOTNET_ICON, + }, + { + name: "build", + loadSpec: "dotnet/dotnet-build", + icon: DOTNET_ICON, + }, + { + name: "build-server", + loadSpec: "dotnet/dotnet-build-server", + icon: DOTNET_ICON, + }, + { + name: "clean", + loadSpec: "dotnet/dotnet-clean", + icon: DOTNET_ICON, + }, + { + name: "format", + loadSpec: "dotnet/dotnet-format", + icon: DOTNET_ICON, + }, + { + name: "migrate", + loadSpec: "dotnet/dotnet-migrate", + icon: DOTNET_ICON, + }, + { + name: "msbuild", + loadSpec: "dotnet/dotnet-msbuild", + icon: DOTNET_ICON, + }, + { + name: "nuget", + loadSpec: "dotnet/dotnet-nuget", + icon: DOTNET_ICON, + }, + { + name: "pack", + loadSpec: "dotnet/dotnet-pack", + icon: DOTNET_ICON, + }, + { + name: "publish", + loadSpec: "dotnet/dotnet-publish", + icon: DOTNET_ICON, + }, + { + name: "restore", + loadSpec: "dotnet/dotnet-restore", + icon: DOTNET_ICON, + }, + { + name: "run", + loadSpec: "dotnet/dotnet-run", + icon: DOTNET_ICON, + }, + { + name: "sln", + loadSpec: "dotnet/dotnet-sln", + icon: DOTNET_ICON, + }, + { + name: "store", + loadSpec: "dotnet/dotnet-store", + icon: DOTNET_ICON, + }, + { + name: "test", + loadSpec: "dotnet/dotnet-test", + icon: DOTNET_ICON, + }, + { + name: "tool", + loadSpec: "dotnet/dotnet-tool", + icon: DOTNET_ICON, + }, +]; + +const completionSpec: Fig.Spec = { + name: "dotnet", + description: "The dotnet cli", + icon: DOTNET_ICON, + args: { + name: "command", + isOptional: true, + generators: filepaths({ extensions: ["dll"] }), + }, + options: [ + { + name: "--version", + description: + "Prints out the version of the .NET SDK used by dotnet commands. Includes the effects of any global.json", + }, + { + name: "--info", + description: + "Prints out detailed information about a .NET installation and the machine environment, such as the current operating system, and commit SHA of the .NET version", + }, + { + name: "--list-runtimes", + description: + "Prints out a list of the installed .NET runtimes. An x86 version of the SDK lists only x86 runtimes, and an x64 version of the SDK lists only x64 runtimes", + }, + { + name: "--list-sdks", + description: "Prints out a list of the installed .NET SDKs", + }, + { + name: ["-?", "-h", "--help"], + description: "Prints out a list of available commands", + }, + { + name: ["-d", "--diagnostics"], + description: "Enables diagnostic output", + }, + { + name: ["-v", "--verbosity"], + description: + "Sets the verbosity level of the command. Allowed values are q[uiet], m[inimal], n[ormal], d[etailed], and diag[nostic]. Not supported in every command. See specific command page to determine if this option is available", + args: { + name: "verbosity", + suggestions: ["quiet", "minimal", "normal", "detailed", "diagnostic"], + }, + }, + { + name: "--additionalprobingpath", + description: "Path containing probing policy and assemblies to probe", + args: { + name: "path", + template: "folders", + }, + }, + { + name: "--additional-deps", + description: + "Path to an additional .deps.json file. A deps.json file contains a list of dependencies, compilation dependencies, and version information used to address assembly conflicts. For more information, see Runtime Configuration Files on GitHub", + args: { + name: "deps", + template: "filepaths", + }, + }, + { + name: "-depsfile", + description: + "Path to the deps.json file. A deps.json file is a configuration file that contains information about dependencies necessary to run the application. This file is generated by the .NET SDK", + args: { + name: "deps", + template: "filepaths", + }, + }, + { + name: "--runtimeconfig", + description: + "Path to a runtimeconfig.json file. A runtimeconfig.json file is a configuration file that contains run-time settings", + args: { + name: "path", + template: "filepaths", + }, + }, + { + name: "--roll-forward", + description: + "Controls how roll forward is applied to the app. The SETTING can be one of the following values. If not specified, Minor is the default", + args: { + name: "setting", + suggestions: [ + "LatestPatch", + "Minor", + "Major", + "LatestMinor", + "LatestMajor", + "Disable", + ], + }, + }, + { + name: "--fx-version", + description: "Version of the .NET runtime to use to run the application", + args: { + name: "version", + }, + }, + ], + subcommands: commands, + async generateSpec(_, executeShellCommand) { + const argRegex = /(([a-zA-Z \.\[\]#,/][^ ]{1,})+)/g; + + const subcommands: Fig.Subcommand[] = []; + const { stdout } = await executeShellCommand({ + command: "dotnet", + args: ["tool", "list", "--global"], + }); + + const lines = stdout.split("\n").slice(2); + + for (const line of lines) { + const [_, __, command] = line + .match(argRegex)! + .map((match) => match.trim()); + + const commands = command.split(",").map((cmd) => { + const value = cmd.replace("dotnet-", ""); + + return { + name: value, + description: cmd, + args: { + name: "args", + isOptional: true, + }, + }; + }); + + subcommands.push(...commands); + } + + return { + name: "dotnet", + subcommands, + }; + }, +}; + +export default completionSpec; diff --git a/extensions/terminal-suggest/src/completions/upstream/go.ts b/extensions/terminal-suggest/src/completions/upstream/go.ts new file mode 100644 index 00000000000..483119a2921 --- /dev/null +++ b/extensions/terminal-suggest/src/completions/upstream/go.ts @@ -0,0 +1,921 @@ +const buildModeSuggestions: Fig.Suggestion[] = [ + { + name: "archive", + description: "Build the listed non-main packages into .a files", + }, + { + name: "c-archive", + description: + "Build the listed main package, plus all packages it imports, into a C archive file", + }, + { + name: "c-shared", + description: + "Build the listed main package, plus all packages it imports, into a C shared library", + }, + { + name: "default", + description: + "Listed main packages are built into executables and listed non-main packages are built into .a files", + }, + { + name: "shared", + description: + "Combine all the listed non-main packages into a single shared library that will be used when building with the -linkshared option", + }, + { + name: "exe", + description: + "Build the listed main packages and everything they import into executables", + }, + { + name: "pie", + description: + "Build the listed main packages and everything they import into position independent executables (PIE)", + }, + { + name: "plugin", + description: + "Build the listed main packages, plus all packages that they import, into a Go plugin", + }, +]; + +const resolutionAndExecutionOptions: Fig.Option[] = [ + { + name: "-n", + description: "Print the commands but do not run them", + }, + { + name: "-v", + description: "Print the names of packages as they are compiled", + }, + { + name: "-x", + description: "Print the commands", + }, + { + name: "-tags", + description: + "A comma-separated list of build tags to consider satisfied during the build", + args: { + name: "tags", + }, + }, + { + name: "-toolexec", + insertValue: "-toolexec '{cursor}'", + description: + "A program to use to invoke toolchain programs like vet and asm", + args: { + name: "cmd", + }, + }, +]; + +const globalOptions: Fig.Option[] = [ + ...resolutionAndExecutionOptions, + { + name: "-a", + description: "Force rebuilding of packages that are already up-to-date", + }, + { + name: "-p", + description: "The number of programs, such as build commands or", + args: { + name: "programs", + }, + }, + { + name: "-race", + description: `Enable data race detection. +Supported only on linux/amd64, freebsd/amd64, darwin/amd64, windows/amd64, +linux/ppc64le and linux/arm64 (only for 48-bit VMA)`, + }, + { + name: "-msan", + description: `Enable interoperation with memory sanitizer. +Supported only on linux/amd64, linux/arm64 +and only with Clang/LLVM as the host C compiler. +On linux/arm64, pie build mode will be used`, + }, + { + name: "-work", + description: `Print the name of the temporary work directory and +do not delete it when exiting`, + }, + { + name: "-asmflags", + insertValue: "-asmflags='{cursor}'", + description: "Arguments to pass on each go tool asm invocation", + args: { + name: "flag", + isVariadic: true, + }, + }, + { + name: "-buildmode", + description: "Build mode to use. See 'go help buildmode' for more", + args: { + name: "mode", + suggestions: buildModeSuggestions, + }, + }, + { + name: "-compiler", + description: + "Name of compiler to use, as in runtime.Compiler (gccgo or gc)", + args: { + name: "name", + }, + }, + { + name: "-gccgoflags", + insertValue: "--gccgoflags='{cursor}'", + description: "Arguments to pass on each gccgo compiler/linker invocation", + args: { + name: "flag", + isVariadic: true, + }, + }, + { + name: "-gcflags", + insertValue: "-gcflags='{cursor}'", + description: "Arguments to pass on each go tool compile invocation", + args: { + name: "flag", + isVariadic: true, + }, + }, + { + name: "-installsuffix", + description: + "A suffix to use in the name of the package installation directory,", + args: { + name: "suffix", + }, + }, + { + name: "-ldflags", + insertValue: "-ldflags='{cursor}'", + description: "Arguments to pass on each go tool link invocation", + args: { + name: "flag", + isVariadic: true, + }, + }, + { + name: "-linkshared", + description: + "Build code that will be linked against shared libraries previously", + }, + { + name: "-mod", + description: "Module download mode to use: readonly, vendor, or mod", + args: { + name: "mode", + suggestions: [ + { + name: "readonly", + }, + { + name: "vendor", + }, + { + name: "mod", + }, + ], + }, + }, + { + name: "-modcacherw", + description: + "Leave newly-created directories in the module cache read-write", + }, + { + name: "-modfile", + description: + "In module aware mode, read (and possibly write) an alternate go.mod file instead of the one in the module root directory", + args: { + name: "file", + }, + }, + { + name: "-overlay", + description: + "Read a JSON config file that provides an overlay for build operations", + args: { + name: "file", + }, + }, + { + name: "-pkgdir", + description: + "Install and load all packages from dir instead of the usual locations", + args: { + name: "dir", + }, + }, + { + name: "-trimpath", + description: "Remove all file system paths from the resulting executable", + }, +]; + +const packagesArg: Fig.Arg = { + name: "packages", + isVariadic: true, + isOptional: true, + template: ["filepaths"], +}; + +const completionSpec: Fig.Spec = { + name: "go", + description: "Go is a tool for managing Go source code", + parserDirectives: { + flagsArePosixNoncompliant: true, + }, + subcommands: [ + { + name: "bug", + description: "Start a bug report", + }, + { + name: "build", + description: "Compile packages and dependencies", + options: [ + ...globalOptions, + { + name: "-o", + description: + "Write the resulting executable or object to the named output file or directory", + args: { + template: ["filepaths", "folders"], + }, + }, + { + name: "-i", + description: + "Install the packages that are dependencies of the target", + }, + ], + args: packagesArg, + }, + { + name: "clean", + description: "Remove object files and cached files", + options: [ + ...globalOptions, + { + name: "-i", + description: "Remove the corresponding installed archive or binary", + }, + { + name: "-r", + description: + "Apply recursively to all the dependencies of the packages named by the import paths", + }, + { + name: "-cache", + description: "Remove the entire go build cache", + }, + { + name: "-testcache", + description: "Expire all test results in the go build cache", + }, + { + name: "-modcache", + description: + "Remove the entire module download cache, including unpacked source code of versioned dependencies", + }, + ], + }, + { + name: "doc", + description: "Show documentation for package or symbol", + options: [ + { + name: "-all", + description: "Show all the documentation for the package", + }, + { + name: "-c", + description: "Respect case when matching symbols", + }, + { + name: "-cmd", + description: + "Treat a command (package main) like a regular package. Otherwise package main's exported symbols are hidden when showing the package's top-level documentation", + }, + { + name: "-short", + description: "One-line representation for each symbol", + }, + { + name: "-src", + description: "Show the full source code for the symbol", + }, + { + name: "-u", + description: + "Show documentation for unexported as well as exported symbols, methods, and fields", + }, + ], + args: { + name: "package", + }, + }, + { + name: "env", + description: "Print Go environment information", + options: [ + { + name: "-json", + description: + "Prints the environment in JSON format instead of as a shell script", + }, + { + name: "-u", + description: + "Unset the default setting for the named environment variables", + args: { + isVariadic: true, + }, + }, + { + name: "-w", + description: + "Change the default settings of the named environment variables to the given values", + args: { + isVariadic: true, + }, + }, + ], + }, + { + name: "fix", + description: "Update packages to use new APIs", + args: packagesArg, + }, + { + name: "fmt", + description: "Gofmt (reformat) package sources", + options: [ + { + name: "-n", + description: "Print the commands that would be executed", + }, + { + name: "-x", + description: "Print the commands as they are executed", + }, + { + name: "-mod", + description: "Which module download mode to use", + args: { + name: "mode", + suggestions: [ + { + name: "readonly", + }, + { + name: "vendor", + }, + ], + }, + }, + ], + args: packagesArg, + }, + { + name: "generate", + description: "Generate Go files by processing source", + options: [ + ...globalOptions, + { + name: "-run", + insertValue: '-run "{cursor}"', + description: + "Specifies a regular expression to select directives whose full original source text matches the expression", + }, + ], + }, + { + name: "get", + description: "Add dependencies to current module and install them", + options: [ + ...globalOptions, + { + name: "-t", + description: + "Modules needed to build tests of packages specified on the command line", + }, + { + name: "-u", + description: "Update to newer minor or patch releases when available", + args: { + isOptional: true, + suggestions: [ + { + name: "patch", + description: "Update to newer patch releases", + }, + ], + }, + }, + { + name: "-insecure", + description: "Permit fetching from insecure origins", + }, + { + name: "-d", + description: + "Only update go.mod and download source code needed to build packages", + }, + ], + args: { + name: "url", + isOptional: true, + }, + }, + { + name: "install", + description: "Compile and install packages and dependencies", + options: [...globalOptions], + args: { + name: "packages", + isVariadic: true, + }, + }, + { + name: "list", + description: "List packages or modules", + options: [ + ...globalOptions, + { + name: "-compiled", + description: "Set CompiledGoFiles to the Go source files", + }, + { + name: "-deps", + description: + "Terate over not just the named packages but also all their dependencies", + }, + { + name: "-f", + insertValue: "-f '{cursor}'", + description: "Specify an alternate format for the list", + args: { + name: "format", + }, + }, + { + name: "-e", + description: + "Processes the erroneous packages with the usual printing", + }, + { + name: "-export", + description: + "Set the Export field to the name of a file containing up-to-date export information for the given package", + }, + { + name: "-find", + description: + "Identify the named packages but not resolve their dependencies", + }, + { + name: "-test", + description: "Report test binaries", + }, + { + name: "-m", + description: "List modules instead of packages", + }, + { + name: "-u", + description: "Add information about available upgrades", + }, + { + name: "-versions", + description: + "Set the Module's Versions field to a list of all known versions of that module", + }, + { + name: "-retracted", + description: "Eport information about retracted module versions", + }, + ], + args: { + isOptional: true, + }, + }, + { + name: "mod", + description: "Module maintenance", + subcommands: [ + { + name: "download", + description: "Download the named modules into the module cache", + options: [ + { + name: "-json", + description: + "Print a sequence of JSON objects to standard output, describing each downloaded module (or failure)", + }, + { + name: "-x", + description: + "Print the commands download executes to standard error", + }, + ], + args: { + name: "modules", + isVariadic: true, + }, + }, + { + name: "edit", + description: "Edit and format go.mod files", + options: [ + { + name: "-module", + description: "Change the module's path", + }, + { + name: "-go", + requiresSeparator: true, + description: "Set the expected Go language version", + args: { + name: "version", + }, + }, + { + name: "-require", + requiresSeparator: true, + description: "Add a requirement on the given module", + args: { + name: "path", + }, + }, + { + name: "-droprequire", + requiresSeparator: true, + description: "Drop a requirement on the given module", + args: { + name: "path", + }, + }, + { + name: "-exclude", + requiresSeparator: true, + description: "Add an exclusion on the given module", + args: { + name: "path", + }, + }, + { + name: "-dropexclude", + requiresSeparator: true, + description: "Drop an exclusion on the given module", + args: { + name: "path", + }, + }, + { + name: "-replace", + requiresSeparator: true, + description: + "Add a replacement of the given module path and version pair", + args: { + name: "path", + }, + }, + { + name: "-dropreplace", + requiresSeparator: true, + description: + "Drops a replacement of the given module path and version pair", + args: { + name: "path", + }, + }, + { + name: "-retract", + requiresSeparator: true, + description: "Add a retraction for the given version", + args: { + name: "version", + }, + }, + { + name: "-dropretract", + requiresSeparator: true, + description: "Drop a retraction for the given version", + args: { + name: "version", + }, + }, + { + name: "-fmt", + description: + "Format the go.mod file without making other changes", + }, + { + name: "-print", + description: + "Print the final go.mod in its text format instead of writing it back to disk", + }, + { + name: "-json", + description: + "Print the final go.mod in JSON format instead of writing it back to disk in text forma", + }, + ], + }, + { + name: "graph", + description: "Print the module requirement graph", + }, + { + name: "init", + description: + "Initialize and write a new go.mod file in the current directory", + args: { + name: "module path", + isOptional: true, + }, + }, + { + name: "tidy", + description: + "Ensure that the go.mod file matches the source code in the module", + options: [ + { + name: "-e", + description: + "Attempt to proceed despite errors encountered while loading packages", + }, + { + name: "-v", + description: "Print information about removed modules", + }, + ], + }, + { + name: "vendor", + description: + "Construct a directory named vendor in the main module's root directory", + options: [ + { + name: "-e", + description: + "Attempt to proceed despite errors encountered while loading packages", + }, + { + name: "-v", + description: "Print information about removed modules", + }, + ], + }, + { + name: "verify", + description: + "Check that dependencies of the main module stored in the module cache have not been modified since they were downloaded", + }, + { + name: "why", + description: + "Show a shortest path in the import graph from the main module to each of the listed packages", + options: [ + { + name: "-m", + description: "Treat its arguments as a list of modules", + }, + { + name: "-vendor", + description: + "Ignore imports in tests of packages outside the main module", + }, + ], + args: { + name: "packages", + isVariadic: true, + }, + }, + ], + }, + { + name: "work", + description: "Workspace maintenance", + subcommands: [ + { + name: "edit", + description: "Edit go.work from tools or scripts", + options: [ + { + name: "-fmt", + description: + "The -fmt flag reformats the go.work file without making other changes. This reformatting is also implied by any other modifications that use or rewrite the go.mod file. The only time this flag is needed is if no other flags are specified, as in 'go work edit -fmt'", + }, + { + name: "-use", + requiresSeparator: true, + description: + "The -use=path and -dropuse=path flags add and drop a use directive from the go.work file's set of module directories", + args: { + name: "path", + }, + }, + { + name: "-dropuse", + requiresSeparator: true, + description: + "The -use=path and -dropuse=path flags add and drop a use directive from the go.work file's set of module directories", + args: { + name: "path", + }, + }, + { + name: "-replace", + requiresSeparator: true, + description: + "The -replace=old[@v]=new[@v] flag adds a replacement of the given module path and version pair. If the @v in old@v is omitted, a replacement without a version on the left side is added, which applies to all versions of the old module path. If the @v in new@v is omitted, the new path should be a local module root directory, not a module path. Note that -replace overrides any redundant replacements for old[@v], so omitting @v will drop existing replacements for specific versions", + args: { + name: "old[@v]=new[@v]", + }, + }, + { + name: "-dropreplace", + requiresSeparator: true, + description: + "The -dropreplace=old[@v] flag drops a replacement of the given module path and version pair. If the @v is omitted, a replacement without a version on the left side is dropped", + args: { + name: "old[@v]", + }, + }, + { + name: "-go", + requiresSeparator: true, + description: "Set the expected Go language version", + args: { + name: "version", + }, + }, + { + name: "-print", + description: + "The -print flag prints the final go.work in its text format instead of writing it back to go.mod", + }, + { + name: "-json", + description: + "The -json flag prints the final go.work file in JSON format instead of writing it back to go.mod", + }, + ], + }, + { + name: "init", + description: "Initialize workspace file", + args: { + name: "moddirs", + isVariadic: true, + }, + }, + { + name: "sync", + description: "Sync workspace build list to modules", + }, + { + name: "use", + description: "Add modules to workspace file", + options: [ + { + name: "-r", + description: + "The -r flag searches recursively for modules in the argument directories, and the use command operates as if each of the directories were specified as arguments: namely, use directives will be added for directories that exist, and removed for directories that do not exist", + }, + ], + args: { + name: "moddirs", + isVariadic: true, + }, + }, + ], + }, + { + name: "run", + description: "Compile and run Go program", + options: [ + ...globalOptions, + { + name: "-exec", + description: "Invoke the binary using xprog", + args: {}, + }, + ], + args: { + name: "package", + isScript: true, + }, + }, + { + name: "test", + description: "Test packages", + options: [ + ...globalOptions, + { + name: "-args", + description: + "Pass the remainder of the command line to the test binary", + args: { + isVariadic: true, + }, + }, + { + name: "-c", + description: "Compile the test binary to pkg.test but do not run it", + }, + { + name: "-exec", + description: "Invoke the binary using xprog", + args: {}, + }, + { + name: "-i", + description: "Install packages that are dependencies of the test", + }, + { + name: "-json", + description: "Convert test output to JSON suitable", + }, + { + name: "-o", + description: "Compile the test binary to the named file", + args: { + name: "file", + template: "filepaths", + }, + }, + ], + }, + { + name: "tool", + description: "Run specified go tool", + options: [ + { + name: "-n", + description: + "Print the command that would be executed but not execute it", + }, + ], + args: { + name: "tool", + generators: { + script: ["go", "tool"], + splitOn: "\n", + }, + }, + }, + { + name: "version", + description: "Print Go version", + options: [ + { + name: "-m", + description: + "Print each executable's embedded module version information", + }, + { + name: "-v", + description: "Report unrecognized files", + }, + ], + args: { + name: "file", + isOptional: true, + }, + }, + { + name: "vet", + description: "Report likely mistakes in packages", + options: [ + ...resolutionAndExecutionOptions, + { + name: "-vettool", + requiresSeparator: true, + description: + "Select a different analysis tool with alternative or additional checks", + args: { + name: "tool", + }, + }, + ], + args: { + name: "package", + isOptional: true, + }, + }, + ], +}; + +export default completionSpec; diff --git a/extensions/terminal-suggest/src/completions/upstream/pip.ts b/extensions/terminal-suggest/src/completions/upstream/pip.ts new file mode 100644 index 00000000000..8278ce0daa7 --- /dev/null +++ b/extensions/terminal-suggest/src/completions/upstream/pip.ts @@ -0,0 +1,16822 @@ +const listPackages: Fig.Generator = { + script: ["pip", "list"], + postProcess: function (out) { + const lines = out.split("\n"); + const packages = []; + for (let i = 2; i < lines.length; i++) { + packages.push({ + name: lines[i], + icon: "🐍", + }); + } + return packages; + }, +}; + +// Accessible through ES imports - e.g. import { packageList } from "./pip" +export const packageList: Array = [ + { + name: "urllib3", + icon: "📦", + }, + { + name: "six", + icon: "📦", + }, + { + name: "botocore", + icon: "📦", + }, + { + name: "requests", + icon: "📦", + }, + { + name: "python-dateutil", + icon: "📦", + }, + { + name: "setuptools", + icon: "📦", + }, + { + name: "certifi", + icon: "📦", + }, + { + name: "idna", + icon: "📦", + }, + { + name: "s3transfer", + icon: "📦", + }, + { + name: "chardet", + icon: "📦", + }, + { + name: "pyyaml", + icon: "📦", + }, + { + name: "pip", + icon: "📦", + }, + { + name: "docutils", + icon: "📦", + }, + { + name: "jmespath", + icon: "📦", + }, + { + name: "rsa", + icon: "📦", + }, + { + name: "pyasn1", + icon: "📦", + }, + { + name: "boto3", + icon: "📦", + }, + { + name: "numpy", + icon: "📦", + }, + { + name: "wheel", + icon: "📦", + }, + { + name: "pytz", + icon: "📦", + }, + { + name: "awscli", + icon: "📦", + }, + { + name: "colorama", + icon: "📦", + }, + { + name: "cffi", + icon: "📦", + }, + { + name: "markupsafe", + icon: "📦", + }, + { + name: "protobuf", + icon: "📦", + }, + { + name: "quick-mail", + icon: "📦", + }, + { + name: "jinja2", + icon: "📦", + }, + { + name: "attrs", + icon: "📦", + }, + { + name: "cryptography", + icon: "📦", + }, + { + name: "importlib-metadata", + icon: "📦", + }, + { + name: "pycparser", + icon: "📦", + }, + { + name: "zipp", + icon: "📦", + }, + { + name: "click", + icon: "📦", + }, + { + name: "requests-oauthlib", + icon: "📦", + }, + { + name: "oauthlib", + icon: "📦", + }, + { + name: "pandas", + icon: "📦", + }, + { + name: "pyparsing", + icon: "📦", + }, + { + name: "pyasn1-modules", + icon: "📦", + }, + { + name: "futures", + icon: "📦", + }, + { + name: "future", + icon: "📦", + }, + { + name: "google-auth", + icon: "📦", + }, + { + name: "cachetools", + icon: "📦", + }, + { + name: "packaging", + icon: "📦", + }, + { + name: "decorator", + icon: "📦", + }, + { + name: "scipy", + icon: "📦", + }, + { + name: "werkzeug", + icon: "📦", + }, + { + name: "simplejson", + icon: "📦", + }, + { + name: "google-api-core", + icon: "📦", + }, + { + name: "jsonschema", + icon: "📦", + }, + { + name: "pygments", + icon: "📦", + }, + { + name: "pyrsistent", + icon: "📦", + }, + { + name: "pillow", + icon: "📦", + }, + { + name: "pyjwt", + icon: "📦", + }, + { + name: "wcwidth", + icon: "📦", + }, + { + name: "py", + icon: "📦", + }, + { + name: "pytest", + icon: "📦", + }, + { + name: "googleapis-common-protos", + icon: "📦", + }, + { + name: "psutil", + icon: "📦", + }, + { + name: "google-cloud-core", + icon: "📦", + }, + { + name: "grpcio", + icon: "📦", + }, + { + name: "google-resumable-media", + icon: "📦", + }, + { + name: "lxml", + icon: "📦", + }, + { + name: "pluggy", + icon: "📦", + }, + { + name: "isodate", + icon: "📦", + }, + { + name: "google-cloud-storage", + icon: "📦", + }, + { + name: "wrapt", + icon: "📦", + }, + { + name: "more-itertools", + icon: "📦", + }, + { + name: "flask", + icon: "📦", + }, + { + name: "google-api-python-client", + icon: "📦", + }, + { + name: "scikit-learn", + icon: "📦", + }, + { + name: "sqlalchemy", + icon: "📦", + }, + { + name: "websocket-client", + icon: "📦", + }, + { + name: "joblib", + icon: "📦", + }, + { + name: "coverage", + icon: "📦", + }, + { + name: "itsdangerous", + icon: "📦", + }, + { + name: "pyopenssl", + icon: "📦", + }, + { + name: "msrest", + icon: "📦", + }, + { + name: "uritemplate", + icon: "📦", + }, + { + name: "entrypoints", + icon: "📦", + }, + { + name: "appdirs", + icon: "📦", + }, + { + name: "pexpect", + icon: "📦", + }, + { + name: "tornado", + icon: "📦", + }, + { + name: "defusedxml", + icon: "📦", + }, + { + name: "tqdm", + icon: "📦", + }, + { + name: "ptyprocess", + icon: "📦", + }, + { + name: "prompt-toolkit", + icon: "📦", + }, + { + name: "redis", + icon: "📦", + }, + { + name: "azure-storage-blob", + icon: "📦", + }, + { + name: "prometheus-client", + icon: "📦", + }, + { + name: "virtualenv", + icon: "📦", + }, + { + name: "httplib2", + icon: "📦", + }, + { + name: "ipython", + icon: "📦", + }, + { + name: "bleach", + icon: "📦", + }, + { + name: "matplotlib", + icon: "📦", + }, + { + name: "webencodings", + icon: "📦", + }, + { + name: "toml", + icon: "📦", + }, + { + name: "enum34", + icon: "📦", + }, + { + name: "google-auth-httplib2", + icon: "📦", + }, + { + name: "typing-extensions", + icon: "📦", + }, + { + name: "tensorflow", + icon: "📦", + }, + { + name: "traitlets", + icon: "📦", + }, + { + name: "configparser", + icon: "📦", + }, + { + name: "multidict", + icon: "📦", + }, + { + name: "ipython-genutils", + icon: "📦", + }, + { + name: "openai", + icon: "📦", + }, + { + name: "mccabe", + icon: "📦", + }, + { + name: "absl-py", + icon: "📦", + }, + { + name: "beautifulsoup4", + icon: "📦", + }, + { + name: "pickleshare", + icon: "📦", + }, + { + name: "bcrypt", + icon: "📦", + }, + { + name: "docker", + icon: "📦", + }, + { + name: "tabulate", + icon: "📦", + }, + { + name: "filelock", + icon: "📦", + }, + { + name: "google-cloud-bigquery", + icon: "📦", + }, + { + name: "yarl", + icon: "📦", + }, + { + name: "azure-common", + icon: "📦", + }, + { + name: "google-auth-oauthlib", + icon: "📦", + }, + { + name: "ipaddress", + icon: "📦", + }, + { + name: "boto", + icon: "📦", + }, + { + name: "pyzmq", + icon: "📦", + }, + { + name: "pynacl", + icon: "📦", + }, + { + name: "pycodestyle", + icon: "📦", + }, + { + name: "paramiko", + icon: "📦", + }, + { + name: "tensorboard", + icon: "📦", + }, + { + name: "mock", + icon: "📦", + }, + { + name: "psycopg2-binary", + icon: "📦", + }, + { + name: "aiohttp", + icon: "📦", + }, + { + name: "kiwisolver", + icon: "📦", + }, + { + name: "regex", + icon: "📦", + }, + { + name: "gunicorn", + icon: "📦", + }, + { + name: "typed-ast", + icon: "📦", + }, + { + name: "soupsieve", + icon: "📦", + }, + { + name: "nbformat", + icon: "📦", + }, + { + name: "tensorflow-estimator", + icon: "📦", + }, + { + name: "jupyter-core", + icon: "📦", + }, + { + name: "async-timeout", + icon: "📦", + }, + { + name: "cycler", + icon: "📦", + }, + { + name: "azure-core", + icon: "📦", + }, + { + name: "mistune", + icon: "📦", + }, + { + name: "nbconvert", + icon: "📦", + }, + { + name: "jupyter-client", + icon: "📦", + }, + { + name: "pbr", + icon: "📦", + }, + { + name: "typing", + icon: "📦", + }, + { + name: "ipykernel", + icon: "📦", + }, + { + name: "markdown", + icon: "📦", + }, + { + name: "babel", + icon: "📦", + }, + { + name: "testpath", + icon: "📦", + }, + { + name: "pandocfilters", + icon: "📦", + }, + { + name: "notebook", + icon: "📦", + }, + { + name: "pyarrow", + icon: "📦", + }, + { + name: "argparse", + icon: "📦", + }, + { + name: "distlib", + icon: "📦", + }, + { + name: "gitpython", + icon: "📦", + }, + { + name: "dnspython", + icon: "📦", + }, + { + name: "terminado", + icon: "📦", + }, + { + name: "send2trash", + icon: "📦", + }, + { + name: "jedi", + icon: "📦", + }, + { + name: "pyflakes", + icon: "📦", + }, + { + name: "parso", + icon: "📦", + }, + { + name: "lazy-object-proxy", + icon: "📦", + }, + { + name: "isort", + icon: "📦", + }, + { + name: "asn1crypto", + icon: "📦", + }, + { + name: "ujson", + icon: "📦", + }, + { + name: "widgetsnbextension", + icon: "📦", + }, + { + name: "ipywidgets", + icon: "📦", + }, + { + name: "sqlparse", + icon: "📦", + }, + { + name: "termcolor", + icon: "📦", + }, + { + name: "flake8", + icon: "📦", + }, + { + name: "backcall", + icon: "📦", + }, + { + name: "cython", + icon: "📦", + }, + { + name: "h5py", + icon: "📦", + }, + { + name: "py4j", + icon: "📦", + }, + { + name: "tzlocal", + icon: "📦", + }, + { + name: "contextlib2", + icon: "📦", + }, + { + name: "tensorflow-metadata", + icon: "📦", + }, + { + name: "requests-toolbelt", + icon: "📦", + }, + { + name: "oauth2client", + icon: "📦", + }, + { + name: "pymongo", + icon: "📦", + }, + { + name: "adal", + icon: "📦", + }, + { + name: "psycopg2", + icon: "📦", + }, + { + name: "smart-open", + icon: "📦", + }, + { + name: "jupyter-console", + icon: "📦", + }, + { + name: "qtconsole", + icon: "📦", + }, + { + name: "jupyter", + icon: "📦", + }, + { + name: "msgpack", + icon: "📦", + }, + { + name: "pathlib2", + icon: "📦", + }, + { + name: "retrying", + icon: "📦", + }, + { + name: "importlib-resources", + icon: "📦", + }, + { + name: "dill", + icon: "📦", + }, + { + name: "networkx", + icon: "📦", + }, + { + name: "azure-devops", + icon: "📦", + }, + { + name: "smmap", + icon: "📦", + }, + { + name: "tensorflow-serving-api", + icon: "📦", + }, + { + name: "tensorflow-transform", + icon: "📦", + }, + { + name: "sortedcontainers", + icon: "📦", + }, + { + name: "fsspec", + icon: "📦", + }, + { + name: "cloudpickle", + icon: "📦", + }, + { + name: "pyspark", + icon: "📦", + }, + { + name: "gast", + icon: "📦", + }, + { + name: "google-cloud-logging", + icon: "📦", + }, + { + name: "websockets", + icon: "📦", + }, + { + name: "xlrd", + icon: "📦", + }, + { + name: "pytest-cov", + icon: "📦", + }, + { + name: "azure-storage-common", + icon: "📦", + }, + { + name: "gensim", + icon: "📦", + }, + { + name: "mako", + icon: "📦", + }, + { + name: "atomicwrites", + icon: "📦", + }, + { + name: "qtpy", + icon: "📦", + }, + { + name: "alembic", + icon: "📦", + }, + { + name: "astroid", + icon: "📦", + }, + { + name: "keras-preprocessing", + icon: "📦", + }, + { + name: "docopt", + icon: "📦", + }, + { + name: "gitdb", + icon: "📦", + }, + { + name: "pymysql", + icon: "📦", + }, + { + name: "distro", + icon: "📦", + }, + { + name: "zope-interface", + icon: "📦", + }, + { + name: "tfx-bsl", + icon: "📦", + }, + { + name: "pylint", + icon: "📦", + }, + { + name: "pandas-gbq", + icon: "📦", + }, + { + name: "django", + icon: "📦", + }, + { + name: "datadog", + icon: "📦", + }, + { + name: "pydata-google-auth", + icon: "📦", + }, + { + name: "ordereddict", + icon: "📦", + }, + { + name: "msrestazure", + icon: "📦", + }, + { + name: "pycryptodomex", + icon: "📦", + }, + { + name: "pathspec", + icon: "📦", + }, + { + name: "scandir", + icon: "📦", + }, + { + name: "xmltodict", + icon: "📦", + }, + { + name: "python-editor", + icon: "📦", + }, + { + name: "tensorflow-data-validation", + icon: "📦", + }, + { + name: "funcsigs", + icon: "📦", + }, + { + name: "slackclient", + icon: "📦", + }, + { + name: "tensorflow-model-analysis", + icon: "📦", + }, + { + name: "gcsfs", + icon: "📦", + }, + { + name: "ruamel-yaml", + icon: "📦", + }, + { + name: "nltk", + icon: "📦", + }, + { + name: "google-pasta", + icon: "📦", + }, + { + name: "mypy-extensions", + icon: "📦", + }, + { + name: "pycryptodome", + icon: "📦", + }, + { + name: "s3fs", + icon: "📦", + }, + { + name: "cached-property", + icon: "📦", + }, + { + name: "pytest-runner", + icon: "📦", + }, + { + name: "elasticsearch", + icon: "📦", + }, + { + name: "keras-applications", + icon: "📦", + }, + { + name: "ansible", + icon: "📦", + }, + { + name: "azure-nspkg", + icon: "📦", + }, + { + name: "jsonpickle", + icon: "📦", + }, + { + name: "marshmallow", + icon: "📦", + }, + { + name: "google-crc32c", + icon: "📦", + }, + { + name: "rfc3986", + icon: "📦", + }, + { + name: "pycrypto", + icon: "📦", + }, + { + name: "astor", + icon: "📦", + }, + { + name: "ruamel-yaml-clib", + icon: "📦", + }, + { + name: "xlsxwriter", + icon: "📦", + }, + { + name: "singledispatch", + icon: "📦", + }, + { + name: "setuptools-scm", + icon: "📦", + }, + { + name: "backports-functools-lru-cache", + icon: "📦", + }, + { + name: "applicationinsights", + icon: "📦", + }, + { + name: "mypy", + icon: "📦", + }, + { + name: "greenlet", + icon: "📦", + }, + { + name: "simplegeneric", + icon: "📦", + }, + { + name: "h11", + icon: "📦", + }, + { + name: "openpyxl", + icon: "📦", + }, + { + name: "pyodbc", + icon: "📦", + }, + { + name: "text-unidecode", + icon: "📦", + }, + { + name: "jdcal", + icon: "📦", + }, + { + name: "oscrypto", + icon: "📦", + }, + { + name: "bs4", + icon: "📦", + }, + { + name: "et-xmlfile", + icon: "📦", + }, + { + name: "argon2-cffi", + icon: "📦", + }, + { + name: "backports-shutil-get-terminal-size", + icon: "📦", + }, + { + name: "monotonic", + icon: "📦", + }, + { + name: "databricks-cli", + icon: "📦", + }, + { + name: "backports-abc", + icon: "📦", + }, + { + name: "selenium", + icon: "📦", + }, + { + name: "xgboost", + icon: "📦", + }, + { + name: "sentry-sdk", + icon: "📦", + }, + { + name: "snowflake-connector-python", + icon: "📦", + }, + { + name: "plotly", + icon: "📦", + }, + { + name: "uvloop", + icon: "📦", + }, + { + name: "opt-einsum", + icon: "📦", + }, + { + name: "snowballstemmer", + icon: "📦", + }, + { + name: "ply", + icon: "📦", + }, + { + name: "nose", + icon: "📦", + }, + { + name: "gevent", + icon: "📦", + }, + { + name: "aiofiles", + icon: "📦", + }, + { + name: "black", + icon: "📦", + }, + { + name: "tenacity", + icon: "📦", + }, + { + name: "azure-mgmt-resource", + icon: "📦", + }, + { + name: "async-generator", + icon: "📦", + }, + { + name: "argcomplete", + icon: "📦", + }, + { + name: "httptools", + icon: "📦", + }, + { + name: "python-dotenv", + icon: "📦", + }, + { + name: "opencv-python", + icon: "📦", + }, + { + name: "mozlog", + icon: "📦", + }, + { + name: "sniffio", + icon: "📦", + }, + { + name: "html5lib", + icon: "📦", + }, + { + name: "grpc-google-iam-v1", + icon: "📦", + }, + { + name: "mozrunner", + icon: "📦", + }, + { + name: "toolz", + icon: "📦", + }, + { + name: "lockfile", + icon: "📦", + }, + { + name: "iniconfig", + icon: "📦", + }, + { + name: "unidecode", + icon: "📦", + }, + { + name: "sphinx", + icon: "📦", + }, + { + name: "kubernetes", + icon: "📦", + }, + { + name: "kombu", + icon: "📦", + }, + { + name: "secretstorage", + icon: "📦", + }, + { + name: "httpx", + icon: "📦", + }, + { + name: "netaddr", + icon: "📦", + }, + { + name: "amqp", + icon: "📦", + }, + { + name: "thrift", + icon: "📦", + }, + { + name: "sklearn", + icon: "📦", + }, + { + name: "ijson", + icon: "📦", + }, + { + name: "threadpoolctl", + icon: "📦", + }, + { + name: "celery", + icon: "📦", + }, + { + name: "jeepney", + icon: "📦", + }, + { + name: "discord-py", + icon: "📦", + }, + { + name: "keras", + icon: "📦", + }, + { + name: "functools32", + icon: "📦", + }, + { + name: "shapely", + icon: "📦", + }, + { + name: "nest-asyncio", + icon: "📦", + }, + { + name: "statsmodels", + icon: "📦", + }, + { + name: "geopy", + icon: "📦", + }, + { + name: "lightgbm", + icon: "📦", + }, + { + name: "virtualenv-clone", + icon: "📦", + }, + { + name: "djangorestframework", + icon: "📦", + }, + { + name: "azure-mgmt-storage", + icon: "📦", + }, + { + name: "mysqlclient", + icon: "📦", + }, + { + name: "aioopenssl", + icon: "📦", + }, + { + name: "aiosasl", + icon: "📦", + }, + { + name: "graphviz", + icon: "📦", + }, + { + name: "sortedcollections", + icon: "📦", + }, + { + name: "ecdsa", + icon: "📦", + }, + { + name: "hpack", + icon: "📦", + }, + { + name: "aioconsole", + icon: "📦", + }, + { + name: "h2", + icon: "📦", + }, + { + name: "hyperframe", + icon: "📦", + }, + { + name: "portalocker", + icon: "📦", + }, + { + name: "google-cloud-pubsub", + icon: "📦", + }, + { + name: "nbclient", + icon: "📦", + }, + { + name: "billiard", + icon: "📦", + }, + { + name: "pysftp", + icon: "📦", + }, + { + name: "keyring", + icon: "📦", + }, + { + name: "arrow", + icon: "📦", + }, + { + name: "aioxmpp", + icon: "📦", + }, + { + name: "python-jose", + icon: "📦", + }, + { + name: "gitdb2", + icon: "📦", + }, + { + name: "sanic", + icon: "📦", + }, + { + name: "querystring-parser", + icon: "📦", + }, + { + name: "mlflow", + icon: "📦", + }, + { + name: "imagesize", + icon: "📦", + }, + { + name: "alabaster", + icon: "📦", + }, + { + name: "jupyterlab-pygments", + icon: "📦", + }, + { + name: "pipenv", + icon: "📦", + }, + { + name: "tox", + icon: "📦", + }, + { + name: "pytest-mock", + icon: "📦", + }, + { + name: "fortnitepy", + icon: "📦", + }, + { + name: "vine", + icon: "📦", + }, + { + name: "apache-beam", + icon: "📦", + }, + { + name: "fuzzywuzzy", + icon: "📦", + }, + { + name: "pkginfo", + icon: "📦", + }, + { + name: "inflection", + icon: "📦", + }, + { + name: "unicodecsv", + icon: "📦", + }, + { + name: "imageio", + icon: "📦", + }, + { + name: "flask-cors", + icon: "📦", + }, + { + name: "prometheus-flask-exporter", + icon: "📦", + }, + { + name: "hstspreload", + icon: "📦", + }, + { + name: "pytest-forked", + icon: "📦", + }, + { + name: "faker", + icon: "📦", + }, + { + name: "execnet", + icon: "📦", + }, + { + name: "flask-sqlalchemy", + icon: "📦", + }, + { + name: "humanfriendly", + icon: "📦", + }, + { + name: "apipkg", + icon: "📦", + }, + { + name: "pytest-xdist", + icon: "📦", + }, + { + name: "watchdog", + icon: "📦", + }, + { + name: "twisted", + icon: "📦", + }, + { + name: "ua-parser", + icon: "📦", + }, + { + name: "seaborn", + icon: "📦", + }, + { + name: "fasteners", + icon: "📦", + }, + { + name: "dataclasses", + icon: "📦", + }, + { + name: "iso8601", + icon: "📦", + }, + { + name: "azure-mgmt-containerregistry", + icon: "📦", + }, + { + name: "subprocess32", + icon: "📦", + }, + { + name: "azure-mgmt-keyvault", + icon: "📦", + }, + { + name: "pywavelets", + icon: "📦", + }, + { + name: "colorlog", + icon: "📦", + }, + { + name: "patsy", + icon: "📦", + }, + { + name: "jsonpointer", + icon: "📦", + }, + { + name: "gorilla", + icon: "📦", + }, + { + name: "pendulum", + icon: "📦", + }, + { + name: "stevedore", + icon: "📦", + }, + { + name: "ndg-httpsclient", + icon: "📦", + }, + { + name: "asgiref", + icon: "📦", + }, + { + name: "readme-renderer", + icon: "📦", + }, + { + name: "kafka-python", + icon: "📦", + }, + { + name: "incremental", + icon: "📦", + }, + { + name: "deprecated", + icon: "📦", + }, + { + name: "tensorboard-plugin-wit", + icon: "📦", + }, + { + name: "responses", + icon: "📦", + }, + { + name: "pyhamcrest", + icon: "📦", + }, + { + name: "fastavro", + icon: "📦", + }, + { + name: "aniso8601", + icon: "📦", + }, + { + name: "msal", + icon: "📦", + }, + { + name: "hvac", + icon: "📦", + }, + { + name: "texttable", + icon: "📦", + }, + { + name: "pytzdata", + icon: "📦", + }, + { + name: "retry", + icon: "📦", + }, + { + name: "ezfnsetup", + icon: "📦", + }, + { + name: "backports-weakref", + icon: "📦", + }, + { + name: "python-http-client", + icon: "📦", + }, + { + name: "dask", + icon: "📦", + }, + { + name: "cachecontrol", + icon: "📦", + }, + { + name: "blessings", + icon: "📦", + }, + { + name: "smmap2", + icon: "📦", + }, + { + name: "mysql-connector-python", + icon: "📦", + }, + { + name: "azure-datalake-store", + icon: "📦", + }, + { + name: "docker-pycreds", + icon: "📦", + }, + { + name: "astunparse", + icon: "📦", + }, + { + name: "azure-keyvault", + icon: "📦", + }, + { + name: "bottle", + icon: "📦", + }, + { + name: "azure-storage-queue", + icon: "📦", + }, + { + name: "scikit-image", + icon: "📦", + }, + { + name: "sendgrid", + icon: "📦", + }, + { + name: "pygsheets", + icon: "📦", + }, + { + name: "mozdevice", + icon: "📦", + }, + { + name: "sphinxcontrib-serializinghtml", + icon: "📦", + }, + { + name: "discord", + icon: "📦", + }, + { + name: "python-levenshtein", + icon: "📦", + }, + { + name: "jsonpatch", + icon: "📦", + }, + { + name: "blinker", + icon: "📦", + }, + { + name: "mozinfo", + icon: "📦", + }, + { + name: "mozprocess", + icon: "📦", + }, + { + name: "azure-mgmt-authorization", + icon: "📦", + }, + { + name: "google-cloud-datastore", + icon: "📦", + }, + { + name: "backports-ssl-match-hostname", + icon: "📦", + }, + { + name: "llvmlite", + icon: "📦", + }, + { + name: "python-magic", + icon: "📦", + }, + { + name: "azure-graphrbac", + icon: "📦", + }, + { + name: "proto-plus", + icon: "📦", + }, + { + name: "requests-file", + icon: "📦", + }, + { + name: "avro-python3", + icon: "📦", + }, + { + name: "torch", + icon: "📦", + }, + { + name: "statsd", + icon: "📦", + }, + { + name: "msal-extensions", + icon: "📦", + }, + { + name: "service-identity", + icon: "📦", + }, + { + name: "mozprofile", + icon: "📦", + }, + { + name: "python-daemon", + icon: "📦", + }, + { + name: "sphinxcontrib-htmlhelp", + icon: "📦", + }, + { + name: "numba", + icon: "📦", + }, + { + name: "sphinxcontrib-applehelp", + icon: "📦", + }, + { + name: "idna-ssl", + icon: "📦", + }, + { + name: "sphinxcontrib-devhelp", + icon: "📦", + }, + { + name: "sphinxcontrib-qthelp", + icon: "📦", + }, + { + name: "tldextract", + icon: "📦", + }, + { + name: "azure-mgmt-nspkg", + icon: "📦", + }, + { + name: "maxminddb", + icon: "📦", + }, + { + name: "cssselect", + icon: "📦", + }, + { + name: "freezegun", + icon: "📦", + }, + { + name: "hyperlink", + icon: "📦", + }, + { + name: "prettytable", + icon: "📦", + }, + { + name: "automat", + icon: "📦", + }, + { + name: "constantly", + icon: "📦", + }, + { + name: "sphinxcontrib-jsmath", + icon: "📦", + }, + { + name: "deepdiff", + icon: "📦", + }, + { + name: "pathtools", + icon: "📦", + }, + { + name: "s3cmd", + icon: "📦", + }, + { + name: "pydot", + icon: "📦", + }, + { + name: "python-json-logger", + icon: "📦", + }, + { + name: "azure-mgmt-compute", + icon: "📦", + }, + { + name: "wtforms", + icon: "📦", + }, + { + name: "croniter", + icon: "📦", + }, + { + name: "mozfile", + icon: "📦", + }, + { + name: "azure-cosmosdb-table", + icon: "📦", + }, + { + name: "hdfs", + icon: "📦", + }, + { + name: "mozterm", + icon: "📦", + }, + { + name: "raven", + icon: "📦", + }, + { + name: "configobj", + icon: "📦", + }, + { + name: "geoip2", + icon: "📦", + }, + { + name: "google-cloud", + icon: "📦", + }, + { + name: "nodeenv", + icon: "📦", + }, + { + name: "identify", + icon: "📦", + }, + { + name: "azure-cosmosdb-nspkg", + icon: "📦", + }, + { + name: "jsondiff", + icon: "📦", + }, + { + name: "pyproj", + icon: "📦", + }, + { + name: "azure-identity", + icon: "📦", + }, + { + name: "typing-inspect", + icon: "📦", + }, + { + name: "python-slugify", + icon: "📦", + }, + { + name: "django-cors-headers", + icon: "📦", + }, + { + name: "pre-commit", + icon: "📦", + }, + { + name: "backoff", + icon: "📦", + }, + { + name: "azure-mgmt-network", + icon: "📦", + }, + { + name: "tblib", + icon: "📦", + }, + { + name: "cfgv", + icon: "📦", + }, + { + name: "pycurl", + icon: "📦", + }, + { + name: "pyhive", + icon: "📦", + }, + { + name: "dockerpty", + icon: "📦", + }, + { + name: "pypandoc", + icon: "📦", + }, + { + name: "autopep8", + icon: "📦", + }, + { + name: "crcmod", + icon: "📦", + }, + { + name: "docker-compose", + icon: "📦", + }, + { + name: "pathlib", + icon: "📦", + }, + { + name: "google-cloud-bigtable", + icon: "📦", + }, + { + name: "hiredis", + icon: "📦", + }, + { + name: "holidays", + icon: "📦", + }, + { + name: "gspread", + icon: "📦", + }, + { + name: "grpcio-tools", + icon: "📦", + }, + { + name: "azure-mgmt-datalake-nspkg", + icon: "📦", + }, + { + name: "azure-mgmt-sql", + icon: "📦", + }, + { + name: "voluptuous", + icon: "📦", + }, + { + name: "azure-batch", + icon: "📦", + }, + { + name: "django-filter", + icon: "📦", + }, + { + name: "aws-xray-sdk", + icon: "📦", + }, + { + name: "netifaces", + icon: "📦", + }, + { + name: "pymssql", + icon: "📦", + }, + { + name: "semantic-version", + icon: "📦", + }, + { + name: "pysocks", + icon: "📦", + }, + { + name: "promise", + icon: "📦", + }, + { + name: "geographiclib", + icon: "📦", + }, + { + name: "elasticsearch-dsl", + icon: "📦", + }, + { + name: "pydantic", + icon: "📦", + }, + { + name: "scp", + icon: "📦", + }, + { + name: "django-extensions", + icon: "📦", + }, + { + name: "zope-event", + icon: "📦", + }, + { + name: "flask-wtf", + icon: "📦", + }, + { + name: "pika", + icon: "📦", + }, + { + name: "google-apitools", + icon: "📦", + }, + { + name: "munch", + icon: "📦", + }, + { + name: "azure-mgmt-rdbms", + icon: "📦", + }, + { + name: "ordered-set", + icon: "📦", + }, + { + name: "sphinx-rtd-theme", + icon: "📦", + }, + { + name: "azure-servicebus", + icon: "📦", + }, + { + name: "uwsgi", + icon: "📦", + }, + { + name: "pywin32", + icon: "📦", + }, + { + name: "user-agents", + icon: "📦", + }, + { + name: "pytest-timeout", + icon: "📦", + }, + { + name: "zope-deprecation", + icon: "📦", + }, + { + name: "aws-sam-translator", + icon: "📦", + }, + { + name: "simple-salesforce", + icon: "📦", + }, + { + name: "pyaml", + icon: "📦", + }, + { + name: "webrtcvad-wheels", + icon: "📦", + }, + { + name: "sqlalchemy-utils", + icon: "📦", + }, + { + name: "pyserial", + icon: "📦", + }, + { + name: "aiobotocore", + icon: "📦", + }, + { + name: "azure-mgmt-batch", + icon: "📦", + }, + { + name: "azure-mgmt-cosmosdb", + icon: "📦", + }, + { + name: "youtube-dl", + icon: "📦", + }, + { + name: "lunardate", + icon: "📦", + }, + { + name: "lz4", + icon: "📦", + }, + { + name: "jpype1", + icon: "📦", + }, + { + name: "azure-mgmt-datalake-store", + icon: "📦", + }, + { + name: "sh", + icon: "📦", + }, + { + name: "bz2file", + icon: "📦", + }, + { + name: "humanize", + icon: "📦", + }, + { + name: "tomlkit", + icon: "📦", + }, + { + name: "influxdb", + icon: "📦", + }, + { + name: "requests-aws4auth", + icon: "📦", + }, + { + name: "cerberus", + icon: "📦", + }, + { + name: "passlib", + icon: "📦", + }, + { + name: "spacy", + icon: "📦", + }, + { + name: "python3-openid", + icon: "📦", + }, + { + name: "azure-mgmt-cdn", + icon: "📦", + }, + { + name: "ephem", + icon: "📦", + }, + { + name: "azure-mgmt-monitor", + icon: "📦", + }, + { + name: "azure-mgmt-web", + icon: "📦", + }, + { + name: "google-cloud-spanner", + icon: "📦", + }, + { + name: "pycountry", + icon: "📦", + }, + { + name: "yamllint", + icon: "📦", + }, + { + name: "flask-login", + icon: "📦", + }, + { + name: "azure-storage", + icon: "📦", + }, + { + name: "thinc", + icon: "📦", + }, + { + name: "httpcore", + icon: "📦", + }, + { + name: "pygithub", + icon: "📦", + }, + { + name: "bokeh", + icon: "📦", + }, + { + name: "invoke", + icon: "📦", + }, + { + name: "cfn-lint", + icon: "📦", + }, + { + name: "moto", + icon: "📦", + }, + { + name: "datetime", + icon: "📦", + }, + { + name: "azure-mgmt-containerservice", + icon: "📦", + }, + { + name: "awscli-cwlogs", + icon: "📦", + }, + { + name: "emoji", + icon: "📦", + }, + { + name: "twine", + icon: "📦", + }, + { + name: "preshed", + icon: "📦", + }, + { + name: "ipdb", + icon: "📦", + }, + { + name: "azure-mgmt-datalake-analytics", + icon: "📦", + }, + { + name: "sentencepiece", + icon: "📦", + }, + { + name: "avro", + icon: "📦", + }, + { + name: "pyperclip", + icon: "📦", + }, + { + name: "murmurhash", + icon: "📦", + }, + { + name: "mmh3", + icon: "📦", + }, + { + name: "shellingham", + icon: "📦", + }, + { + name: "multiprocess", + icon: "📦", + }, + { + name: "requests-mock", + icon: "📦", + }, + { + name: "aliyun-python-sdk-core", + icon: "📦", + }, + { + name: "google-gax", + icon: "📦", + }, + { + name: "cymem", + icon: "📦", + }, + { + name: "azure-mgmt-devtestlabs", + icon: "📦", + }, + { + name: "jira", + icon: "📦", + }, + { + name: "webob", + icon: "📦", + }, + { + name: "ddtrace", + icon: "📦", + }, + { + name: "factory-boy", + icon: "📦", + }, + { + name: "inflect", + icon: "📦", + }, + { + name: "azure-mgmt-iothub", + icon: "📦", + }, + { + name: "plac", + icon: "📦", + }, + { + name: "codecov", + icon: "📦", + }, + { + name: "marshmallow-enum", + icon: "📦", + }, + { + name: "python-gflags", + icon: "📦", + }, + { + name: "setproctitle", + icon: "📦", + }, + { + name: "configargparse", + icon: "📦", + }, + { + name: "django-storages", + icon: "📦", + }, + { + name: "uamqp", + icon: "📦", + }, + { + name: "phonenumbers", + icon: "📦", + }, + { + name: "python-pam", + icon: "📦", + }, + { + name: "blis", + icon: "📦", + }, + { + name: "zeep", + icon: "📦", + }, + { + name: "redis-py-cluster", + icon: "📦", + }, + { + name: "azure-cli-core", + icon: "📦", + }, + { + name: "aliyun-python-sdk-ecs", + icon: "📦", + }, + { + name: "google", + icon: "📦", + }, + { + name: "azure-mgmt-redis", + icon: "📦", + }, + { + name: "srsly", + icon: "📦", + }, + { + name: "antlr4-python3-runtime", + icon: "📦", + }, + { + name: "aliyunsdkcore", + icon: "📦", + }, + { + name: "pip-tools", + icon: "📦", + }, + { + name: "azure-mgmt-loganalytics", + icon: "📦", + }, + { + name: "azure-mgmt-dns", + icon: "📦", + }, + { + name: "coloredlogs", + icon: "📦", + }, + { + name: "confluent-kafka", + icon: "📦", + }, + { + name: "newrelic", + icon: "📦", + }, + { + name: "pep8", + icon: "📦", + }, + { + name: "natsort", + icon: "📦", + }, + { + name: "junit-xml", + icon: "📦", + }, + { + name: "cx-oracle", + icon: "📦", + }, + { + name: "azure-mgmt-containerinstance", + icon: "📦", + }, + { + name: "wasabi", + icon: "📦", + }, + { + name: "flask-restful", + icon: "📦", + }, + { + name: "azure-mgmt-cognitiveservices", + icon: "📦", + }, + { + name: "argh", + icon: "📦", + }, + { + name: "pycalverter", + icon: "📦", + }, + { + name: "azure-mgmt-eventhub", + icon: "📦", + }, + { + name: "azure-mgmt-trafficmanager", + icon: "📦", + }, + { + name: "azure-mgmt-media", + icon: "📦", + }, + { + name: "pyluach", + icon: "📦", + }, + { + name: "pox", + icon: "📦", + }, + { + name: "backports-tempfile", + icon: "📦", + }, + { + name: "poetry", + icon: "📦", + }, + { + name: "azure-storage-nspkg", + icon: "📦", + }, + { + name: "aenum", + icon: "📦", + }, + { + name: "sympy", + icon: "📦", + }, + { + name: "koalas", + icon: "📦", + }, + { + name: "distributed", + icon: "📦", + }, + { + name: "pytest-django", + icon: "📦", + }, + { + name: "convertdate", + icon: "📦", + }, + { + name: "numexpr", + icon: "📦", + }, + { + name: "pydocstyle", + icon: "📦", + }, + { + name: "pathos", + icon: "📦", + }, + { + name: "pystan", + icon: "📦", + }, + { + name: "parameterized", + icon: "📦", + }, + { + name: "fire", + icon: "📦", + }, + { + name: "parsedatetime", + icon: "📦", + }, + { + name: "semver", + icon: "📦", + }, + { + name: "progressbar2", + icon: "📦", + }, + { + name: "parse", + icon: "📦", + }, + { + name: "ppft", + icon: "📦", + }, + { + name: "azureml-core", + icon: "📦", + }, + { + name: "msgpack-python", + icon: "📦", + }, + { + name: "pytest-html", + icon: "📦", + }, + { + name: "azure-mgmt-iotcentral", + icon: "📦", + }, + { + name: "python-utils", + icon: "📦", + }, + { + name: "pystache", + icon: "📦", + }, + { + name: "cleo", + icon: "📦", + }, + { + name: "azure-kusto-data", + icon: "📦", + }, + { + name: "graphql-core", + icon: "📦", + }, + { + name: "pyrfc3339", + icon: "📦", + }, + { + name: "python-gnupg", + icon: "📦", + }, + { + name: "google-cloud-firestore", + icon: "📦", + }, + { + name: "dateparser", + icon: "📦", + }, + { + name: "pastel", + icon: "📦", + }, + { + name: "kazoo", + icon: "📦", + }, + { + name: "pymeeus", + icon: "📦", + }, + { + name: "marshmallow-sqlalchemy", + icon: "📦", + }, + { + name: "azure-mgmt-recoveryservicesbackup", + icon: "📦", + }, + { + name: "knack", + icon: "📦", + }, + { + name: "azure-mgmt-applicationinsights", + icon: "📦", + }, + { + name: "pylev", + icon: "📦", + }, + { + name: "azure-mgmt-eventgrid", + icon: "📦", + }, + { + name: "heapdict", + icon: "📦", + }, + { + name: "azure-mgmt-marketplaceordering", + icon: "📦", + }, + { + name: "azure-mgmt-servicebus", + icon: "📦", + }, + { + name: "click-plugins", + icon: "📦", + }, + { + name: "azure-mgmt-servicefabric", + icon: "📦", + }, + { + name: "zict", + icon: "📦", + }, + { + name: "azure-mgmt-reservations", + icon: "📦", + }, + { + name: "azure-mgmt-search", + icon: "📦", + }, + { + name: "itypes", + icon: "📦", + }, + { + name: "cachy", + icon: "📦", + }, + { + name: "libcst", + icon: "📦", + }, + { + name: "clikit", + icon: "📦", + }, + { + name: "coreapi", + icon: "📦", + }, + { + name: "azure-mgmt-recoveryservices", + icon: "📦", + }, + { + name: "coreschema", + icon: "📦", + }, + { + name: "pytest-metadata", + icon: "📦", + }, + { + name: "apispec", + icon: "📦", + }, + { + name: "google-cloud-monitoring", + icon: "📦", + }, + { + name: "azure-mgmt-iothubprovisioningservices", + icon: "📦", + }, + { + name: "azure-cosmos", + icon: "📦", + }, + { + name: "azure-mgmt-msi", + icon: "📦", + }, + { + name: "waitress", + icon: "📦", + }, + { + name: "shap", + icon: "📦", + }, + { + name: "azure-mgmt-advisor", + icon: "📦", + }, + { + name: "linecache2", + icon: "📦", + }, + { + name: "jellyfish", + icon: "📦", + }, + { + name: "python-consul", + icon: "📦", + }, + { + name: "azure-mgmt-billing", + icon: "📦", + }, + { + name: "azure-mgmt-datafactory", + icon: "📦", + }, + { + name: "azure-mgmt-consumption", + icon: "📦", + }, + { + name: "azure-mgmt-batchai", + icon: "📦", + }, + { + name: "supervisor", + icon: "📦", + }, + { + name: "azure-loganalytics", + icon: "📦", + }, + { + name: "gym", + icon: "📦", + }, + { + name: "xlwt", + icon: "📦", + }, + { + name: "stripe", + icon: "📦", + }, + { + name: "azure-mgmt-policyinsights", + icon: "📦", + }, + { + name: "azure-mgmt-relay", + icon: "📦", + }, + { + name: "grpcio-gcp", + icon: "📦", + }, + { + name: "fabric", + icon: "📦", + }, + { + name: "cattrs", + icon: "📦", + }, + { + name: "expiringdict", + icon: "📦", + }, + { + name: "azure-storage-file", + icon: "📦", + }, + { + name: "apscheduler", + icon: "📦", + }, + { + name: "deprecation", + icon: "📦", + }, + { + name: "django-debug-toolbar", + icon: "📦", + }, + { + name: "imbalanced-learn", + icon: "📦", + }, + { + name: "pypdf2", + icon: "📦", + }, + { + name: "unittest2", + icon: "📦", + }, + { + name: "ldap3", + icon: "📦", + }, + { + name: "cognite-sdk", + icon: "📦", + }, + { + name: "watchtower", + icon: "📦", + }, + { + name: "setuptools-git", + icon: "📦", + }, + { + name: "azure-mgmt-signalr", + icon: "📦", + }, + { + name: "w3lib", + icon: "📦", + }, + { + name: "eventlet", + icon: "📦", + }, + { + name: "torchvision", + icon: "📦", + }, + { + name: "google-cloud-vision", + icon: "📦", + }, + { + name: "sshpubkeys", + icon: "📦", + }, + { + name: "cligj", + icon: "📦", + }, + { + name: "azure-mgmt-managementgroups", + icon: "📦", + }, + { + name: "flask-caching", + icon: "📦", + }, + { + name: "addict", + icon: "📦", + }, + { + name: "traceback2", + icon: "📦", + }, + { + name: "pydocumentdb", + icon: "📦", + }, + { + name: "flask-babel", + icon: "📦", + }, + { + name: "reportlab", + icon: "📦", + }, + { + name: "cognite-model-hosting", + icon: "📦", + }, + { + name: "ratelimit", + icon: "📦", + }, + { + name: "azure-mgmt-datamigration", + icon: "📦", + }, + { + name: "sphinxcontrib-websupport", + icon: "📦", + }, + { + name: "aioitertools", + icon: "📦", + }, + { + name: "hypothesis", + icon: "📦", + }, + { + name: "twilio", + icon: "📦", + }, + { + name: "email-validator", + icon: "📦", + }, + { + name: "pycairo", + icon: "📦", + }, + { + name: "sasl", + icon: "📦", + }, + { + name: "azure-mgmt-maps", + icon: "📦", + }, + { + name: "validators", + icon: "📦", + }, + { + name: "tensorflow-hub", + icon: "📦", + }, + { + name: "findspark", + icon: "📦", + }, + { + name: "fbprophet", + icon: "📦", + }, + { + name: "opencensus-context", + icon: "📦", + }, + { + name: "azure", + icon: "📦", + }, + { + name: "pyxdg", + icon: "📦", + }, + { + name: "strict-rfc3339", + icon: "📦", + }, + { + name: "pypika", + icon: "📦", + }, + { + name: "opentracing", + icon: "📦", + }, + { + name: "pycares", + icon: "📦", + }, + { + name: "dicttoxml", + icon: "📦", + }, + { + name: "catalogue", + icon: "📦", + }, + { + name: "flask-migrate", + icon: "📦", + }, + { + name: "whitenoise", + icon: "📦", + }, + { + name: "flask-admin", + icon: "📦", + }, + { + name: "django-redis", + icon: "📦", + }, + { + name: "ml-metadata", + icon: "📦", + }, + { + name: "azure-servicemanagement-legacy", + icon: "📦", + }, + { + name: "flask-jwt-extended", + icon: "📦", + }, + { + name: "azure-servicefabric", + icon: "📦", + }, + { + name: "brotli", + icon: "📦", + }, + { + name: "pygobject", + icon: "📦", + }, + { + name: "fiona", + icon: "📦", + }, + { + name: "opencensus", + icon: "📦", + }, + { + name: "commonmark", + icon: "📦", + }, + { + name: "thrift-sasl", + icon: "📦", + }, + { + name: "authlib", + icon: "📦", + }, + { + name: "feedparser", + icon: "📦", + }, + { + name: "yapf", + icon: "📦", + }, + { + name: "rx", + icon: "📦", + }, + { + name: "slacker", + icon: "📦", + }, + { + name: "blobfile", + icon: "📦", + }, + { + name: "azure-mgmt-logic", + icon: "📦", + }, + { + name: "azure-mgmt", + icon: "📦", + }, + { + name: "requests-futures", + icon: "📦", + }, + { + name: "python-snappy", + icon: "📦", + }, + { + name: "stringcase", + icon: "📦", + }, + { + name: "structlog", + icon: "📦", + }, + { + name: "python-mimeparse", + icon: "📦", + }, + { + name: "tld", + icon: "📦", + }, + { + name: "uptime", + icon: "📦", + }, + { + name: "dotnetcore2", + icon: "📦", + }, + { + name: "bandit", + icon: "📦", + }, + { + name: "mysql-connector", + icon: "📦", + }, + { + name: "pytest-rerunfailures", + icon: "📦", + }, + { + name: "azure-mgmt-scheduler", + icon: "📦", + }, + { + name: "flask-appbuilder", + icon: "📦", + }, + { + name: "plumbum", + icon: "📦", + }, + { + name: "azure-eventgrid", + icon: "📦", + }, + { + name: "pytest-asyncio", + icon: "📦", + }, + { + name: "tokenizers", + icon: "📦", + }, + { + name: "python-jenkins", + icon: "📦", + }, + { + name: "sacremoses", + icon: "📦", + }, + { + name: "filemagic", + icon: "📦", + }, + { + name: "jaydebeapi", + icon: "📦", + }, + { + name: "google-cloud-language", + icon: "📦", + }, + { + name: "binaryornot", + icon: "📦", + }, + { + name: "intel-openmp", + icon: "📦", + }, + { + name: "py-bcrypt", + icon: "📦", + }, + { + name: "azure-mgmt-subscription", + icon: "📦", + }, + { + name: "mkl", + icon: "📦", + }, + { + name: "apache-airflow", + icon: "📦", + }, + { + name: "mpmath", + icon: "📦", + }, + { + name: "aspy-yaml", + icon: "📦", + }, + { + name: "parsel", + icon: "📦", + }, + { + name: "azure-kusto-ingest", + icon: "📦", + }, + { + name: "azure-cli-telemetry", + icon: "📦", + }, + { + name: "multi-key-dict", + icon: "📦", + }, + { + name: "typeguard", + icon: "📦", + }, + { + name: "pyglet", + icon: "📦", + }, + { + name: "pkgconfig", + icon: "📦", + }, + { + name: "google-cloud-videointelligence", + icon: "📦", + }, + { + name: "python-crontab", + icon: "📦", + }, + { + name: "bitarray", + icon: "📦", + }, + { + name: "azure-mgmt-notificationhubs", + icon: "📦", + }, + { + name: "wandb", + icon: "📦", + }, + { + name: "azure-mgmt-managementpartner", + icon: "📦", + }, + { + name: "geojson", + icon: "📦", + }, + { + name: "geopandas", + icon: "📦", + }, + { + name: "fakeredis", + icon: "📦", + }, + { + name: "olefile", + icon: "📦", + }, + { + name: "cliff", + icon: "📦", + }, + { + name: "terminaltables", + icon: "📦", + }, + { + name: "repoze-lru", + icon: "📦", + }, + { + name: "cchardet", + icon: "📦", + }, + { + name: "cookiecutter", + icon: "📦", + }, + { + name: "bitstring", + icon: "📦", + }, + { + name: "queuelib", + icon: "📦", + }, + { + name: "pydispatcher", + icon: "📦", + }, + { + name: "tftpy", + icon: "📦", + }, + { + name: "tensorflow-gpu", + icon: "📦", + }, + { + name: "tifffile", + icon: "📦", + }, + { + name: "azure-mgmt-commerce", + icon: "📦", + }, + { + name: "azure-mgmt-powerbiembedded", + icon: "📦", + }, + { + name: "pg8000", + icon: "📦", + }, + { + name: "azure-mgmt-hanaonazure", + icon: "📦", + }, + { + name: "azure-mgmt-machinelearningcompute", + icon: "📦", + }, + { + name: "cmd2", + icon: "📦", + }, + { + name: "mongoengine", + icon: "📦", + }, + { + name: "azure-cli-nspkg", + icon: "📦", + }, + { + name: "transformers", + icon: "📦", + }, + { + name: "scikit-optimize", + icon: "📦", + }, + { + name: "scrapy", + icon: "📦", + }, + { + name: "dj-database-url", + icon: "📦", + }, + { + name: "qrcode", + icon: "📦", + }, + { + name: "poyo", + icon: "📦", + }, + { + name: "azureml-dataprep", + icon: "📦", + }, + { + name: "jsmin", + icon: "📦", + }, + { + name: "jinja2-time", + icon: "📦", + }, + { + name: "google-cloud-kms", + icon: "📦", + }, + { + name: "flask-swagger", + icon: "📦", + }, + { + name: "azureml-dataprep-native", + icon: "📦", + }, + { + name: "pyfarmhash", + icon: "📦", + }, + { + name: "html2text", + icon: "📦", + }, + { + name: "partd", + icon: "📦", + }, + { + name: "google-cloud-bigquery-storage", + icon: "📦", + }, + { + name: "korean-lunar-calendar", + icon: "📦", + }, + { + name: "prison", + icon: "📦", + }, + { + name: "python-memcached", + icon: "📦", + }, + { + name: "aiodns", + icon: "📦", + }, + { + name: "tablib", + icon: "📦", + }, + { + name: "uvicorn", + icon: "📦", + }, + { + name: "tinycss2", + icon: "📦", + }, + { + name: "unittest-xml-reporting", + icon: "📦", + }, + { + name: "azure-eventhub", + icon: "📦", + }, + { + name: "azure-mgmt-core", + icon: "📦", + }, + { + name: "intervaltree", + icon: "📦", + }, + { + name: "hyperopt", + icon: "📦", + }, + { + name: "josepy", + icon: "📦", + }, + { + name: "ntlm-auth", + icon: "📦", + }, + { + name: "flaky", + icon: "📦", + }, + { + name: "flask-openid", + icon: "📦", + }, + { + name: "flower", + icon: "📦", + }, + { + name: "locket", + icon: "📦", + }, + { + name: "debtcollector", + icon: "📦", + }, + { + name: "oslo-i18n", + icon: "📦", + }, + { + name: "qds-sdk", + icon: "📦", + }, + { + name: "tensorflow-datasets", + icon: "📦", + }, + { + name: "azure-mgmt-devspaces", + icon: "📦", + }, + { + name: "acme", + icon: "📦", + }, + { + name: "boltons", + icon: "📦", + }, + { + name: "anyjson", + icon: "📦", + }, + { + name: "zope-component", + icon: "📦", + }, + { + name: "pyelftools", + icon: "📦", + }, + { + name: "altair", + icon: "📦", + }, + { + name: "testfixtures", + icon: "📦", + }, + { + name: "azure-applicationinsights", + icon: "📦", + }, + { + name: "starlette", + icon: "📦", + }, + { + name: "django-appconf", + icon: "📦", + }, + { + name: "jupyterlab", + icon: "📦", + }, + { + name: "multipledispatch", + icon: "📦", + }, + { + name: "pypiwin32", + icon: "📦", + }, + { + name: "azure-keyvault-secrets", + icon: "📦", + }, + { + name: "recommonmark", + icon: "📦", + }, + { + name: "vcrpy", + icon: "📦", + }, + { + name: "azure-cli", + icon: "📦", + }, + { + name: "flask-bcrypt", + icon: "📦", + }, + { + name: "json-merge-patch", + icon: "📦", + }, + { + name: "webtest", + icon: "📦", + }, + { + name: "suds-jurko", + icon: "📦", + }, + { + name: "zope-proxy", + icon: "📦", + }, + { + name: "zope-hookable", + icon: "📦", + }, + { + name: "flake8-polyfill", + icon: "📦", + }, + { + name: "cairocffi", + icon: "📦", + }, + { + name: "pylint-plugin-utils", + icon: "📦", + }, + { + name: "immutables", + icon: "📦", + }, + { + name: "jaraco-functools", + icon: "📦", + }, + { + name: "drf-yasg", + icon: "📦", + }, + { + name: "patch", + icon: "📦", + }, + { + name: "requests-ntlm", + icon: "📦", + }, + { + name: "langid", + icon: "📦", + }, + { + name: "dogpile-cache", + icon: "📦", + }, + { + name: "gapic-google-cloud-logging-v2", + icon: "📦", + }, + { + name: "oslo-config", + icon: "📦", + }, + { + name: "sshtunnel", + icon: "📦", + }, + { + name: "proto-google-cloud-logging-v2", + icon: "📦", + }, + { + name: "h2o", + icon: "📦", + }, + { + name: "cssselect2", + icon: "📦", + }, + { + name: "parse-type", + icon: "📦", + }, + { + name: "paho-mqtt", + icon: "📦", + }, + { + name: "zope-deferredimport", + icon: "📦", + }, + { + name: "pynamodb", + icon: "📦", + }, + { + name: "tables", + icon: "📦", + }, + { + name: "fusepy", + icon: "📦", + }, + { + name: "pytesseract", + icon: "📦", + }, + { + name: "crayons", + icon: "📦", + }, + { + name: "cairosvg", + icon: "📦", + }, + { + name: "cfn-flip", + icon: "📦", + }, + { + name: "frozendict", + icon: "📦", + }, + { + name: "python-box", + icon: "📦", + }, + { + name: "atlassian-jwt-auth", + icon: "📦", + }, + { + name: "json5", + icon: "📦", + }, + { + name: "easyprocess", + icon: "📦", + }, + { + name: "pybind11", + icon: "📦", + }, + { + name: "oslo-utils", + icon: "📦", + }, + { + name: "cassandra-driver", + icon: "📦", + }, + { + name: "graphene", + icon: "📦", + }, + { + name: "schema", + icon: "📦", + }, + { + name: "fastparquet", + icon: "📦", + }, + { + name: "graphql-relay", + icon: "📦", + }, + { + name: "certbot", + icon: "📦", + }, + { + name: "google-cloud-error-reporting", + icon: "📦", + }, + { + name: "ciso8601", + icon: "📦", + }, + { + name: "clickclick", + icon: "📦", + }, + { + name: "pyotp", + icon: "📦", + }, + { + name: "python-crfsuite", + icon: "📦", + }, + { + name: "bashlex", + icon: "📦", + }, + { + name: "databricks-api", + icon: "📦", + }, + { + name: "presto-python-client", + icon: "📦", + }, + { + name: "falcon", + icon: "📦", + }, + { + name: "appnope", + icon: "📦", + }, + { + name: "oslo-serialization", + icon: "📦", + }, + { + name: "basictracer", + icon: "📦", + }, + { + name: "jupyterlab-server", + icon: "📦", + }, + { + name: "google-cloud-dlp", + icon: "📦", + }, + { + name: "livereload", + icon: "📦", + }, + { + name: "python-ldap", + icon: "📦", + }, + { + name: "haversine", + icon: "📦", + }, + { + name: "contextvars", + icon: "📦", + }, + { + name: "curlify", + icon: "📦", + }, + { + name: "cheroot", + icon: "📦", + }, + { + name: "python-augeas", + icon: "📦", + }, + { + name: "tdigest", + icon: "📦", + }, + { + name: "proto-google-cloud-datastore-v1", + icon: "📦", + }, + { + name: "google-cloud-secret-manager", + icon: "📦", + }, + { + name: "django-model-utils", + icon: "📦", + }, + { + name: "robotframework", + icon: "📦", + }, + { + name: "accumulation-tree", + icon: "📦", + }, + { + name: "mysql-python", + icon: "📦", + }, + { + name: "pyudorandom", + icon: "📦", + }, + { + name: "testtools", + icon: "📦", + }, + { + name: "flask-restplus", + icon: "📦", + }, + { + name: "flatbuffers", + icon: "📦", + }, + { + name: "sqlalchemy-redshift", + icon: "📦", + }, + { + name: "asyncio", + icon: "📦", + }, + { + name: "letsencrypt", + icon: "📦", + }, + { + name: "certbot-apache", + icon: "📦", + }, + { + name: "whichcraft", + icon: "📦", + }, + { + name: "pylint-django", + icon: "📦", + }, + { + name: "extras", + icon: "📦", + }, + { + name: "pygame", + icon: "📦", + }, + { + name: "python-swiftclient", + icon: "📦", + }, + { + name: "fastapi", + icon: "📦", + }, + { + name: "scramp", + icon: "📦", + }, + { + name: "phoenixdb", + icon: "📦", + }, + { + name: "coveralls", + icon: "📦", + }, + { + name: "openapi-spec-validator", + icon: "📦", + }, + { + name: "ftfy", + icon: "📦", + }, + { + name: "cherrypy", + icon: "📦", + }, + { + name: "django-environ", + icon: "📦", + }, + { + name: "cmake", + icon: "📦", + }, + { + name: "venusian", + icon: "📦", + }, + { + name: "shortuuid", + icon: "📦", + }, + { + name: "pep8-naming", + icon: "📦", + }, + { + name: "catboost", + icon: "📦", + }, + { + name: "pulp", + icon: "📦", + }, + { + name: "dpath", + icon: "📦", + }, + { + name: "fixtures", + icon: "📦", + }, + { + name: "geomet", + icon: "📦", + }, + { + name: "loguru", + icon: "📦", + }, + { + name: "yq", + icon: "📦", + }, + { + name: "aioredis", + icon: "📦", + }, + { + name: "keystoneauth1", + icon: "📦", + }, + { + name: "altgraph", + icon: "📦", + }, + { + name: "validate-email", + icon: "📦", + }, + { + name: "certbot-nginx", + icon: "📦", + }, + { + name: "cmdstanpy", + icon: "📦", + }, + { + name: "cytoolz", + icon: "📦", + }, + { + name: "descartes", + icon: "📦", + }, + { + name: "catkin-pkg", + icon: "📦", + }, + { + name: "zc-lockfile", + icon: "📦", + }, + { + name: "tempora", + icon: "📦", + }, + { + name: "exifread", + icon: "📦", + }, + { + name: "pyathena", + icon: "📦", + }, + { + name: "toposort", + icon: "📦", + }, + { + name: "django-rest-framework", + icon: "📦", + }, + { + name: "azureml-telemetry", + icon: "📦", + }, + { + name: "pyinstaller", + icon: "📦", + }, + { + name: "dictdiffer", + icon: "📦", + }, + { + name: "flask-compress", + icon: "📦", + }, + { + name: "tweepy", + icon: "📦", + }, + { + name: "azure-mgmt-hdinsight", + icon: "📦", + }, + { + name: "s2sphere", + icon: "📦", + }, + { + name: "python-gitlab", + icon: "📦", + }, + { + name: "flask-script", + icon: "📦", + }, + { + name: "django-crispy-forms", + icon: "📦", + }, + { + name: "utm", + icon: "📦", + }, + { + name: "genson", + icon: "📦", + }, + { + name: "django-timezone-field", + icon: "📦", + }, + { + name: "mleap", + icon: "📦", + }, + { + name: "databricks-pypi1", + icon: "📦", + }, + { + name: "py-cpuinfo", + icon: "📦", + }, + { + name: "fysom", + icon: "📦", + }, + { + name: "googlemaps", + icon: "📦", + }, + { + name: "lunarcalendar", + icon: "📦", + }, + { + name: "portend", + icon: "📦", + }, + { + name: "instana", + icon: "📦", + }, + { + name: "behave", + icon: "📦", + }, + { + name: "jsonfield", + icon: "📦", + }, + { + name: "langdetect", + icon: "📦", + }, + { + name: "objectpath", + icon: "📦", + }, + { + name: "pdfminer-six", + icon: "📦", + }, + { + name: "autowrapt", + icon: "📦", + }, + { + name: "pyee", + icon: "📦", + }, + { + name: "boxsdk", + icon: "📦", + }, + { + name: "sqlalchemy-jsonfield", + icon: "📦", + }, + { + name: "cookies", + icon: "📦", + }, + { + name: "tfx", + icon: "📦", + }, + { + name: "python-docx", + icon: "📦", + }, + { + name: "statistics", + icon: "📦", + }, + { + name: "imageio-ffmpeg", + icon: "📦", + }, + { + name: "azureml-pipeline-core", + icon: "📦", + }, + { + name: "starkbank-ecdsa", + icon: "📦", + }, + { + name: "compound-word-splitter", + icon: "📦", + }, + { + name: "cmudict", + icon: "📦", + }, + { + name: "pronouncing", + icon: "📦", + }, + { + name: "openstacksdk", + icon: "📦", + }, + { + name: "os-service-types", + icon: "📦", + }, + { + name: "azure-storage-file-datalake", + icon: "📦", + }, + { + name: "googleads", + icon: "📦", + }, + { + name: "cvxopt", + icon: "📦", + }, + { + name: "pyphen", + icon: "📦", + }, + { + name: "pytest-instafail", + icon: "📦", + }, + { + name: "ruamel-ordereddict", + icon: "📦", + }, + { + name: "jsonpath-rw", + icon: "📦", + }, + { + name: "pygam", + icon: "📦", + }, + { + name: "pyqt5", + icon: "📦", + }, + { + name: "beautifulsoup", + icon: "📦", + }, + { + name: "functions-framework", + icon: "📦", + }, + { + name: "colour", + icon: "📦", + }, + { + name: "rospkg", + icon: "📦", + }, + { + name: "azureml-train-core", + icon: "📦", + }, + { + name: "tensorboardx", + icon: "📦", + }, + { + name: "rq", + icon: "📦", + }, + { + name: "snowflake-sqlalchemy", + icon: "📦", + }, + { + name: "azureml-train-restclients-hyperdrive", + icon: "📦", + }, + { + name: "collections-extended", + icon: "📦", + }, + { + name: "opencensus-ext-azure", + icon: "📦", + }, + { + name: "python-keystoneclient", + icon: "📦", + }, + { + name: "google-cloud-translate", + icon: "📦", + }, + { + name: "enum-compat", + icon: "📦", + }, + { + name: "theano", + icon: "📦", + }, + { + name: "ansible-base", + icon: "📦", + }, + { + name: "scapy", + icon: "📦", + }, + { + name: "azure-mgmt-netapp", + icon: "📦", + }, + { + name: "schedule", + icon: "📦", + }, + { + name: "luigi", + icon: "📦", + }, + { + name: "lark-parser", + icon: "📦", + }, + { + name: "safety", + icon: "📦", + }, + { + name: "diff-match-patch", + icon: "📦", + }, + { + name: "webargs", + icon: "📦", + }, + { + name: "resampy", + icon: "📦", + }, + { + name: "pyinotify", + icon: "📦", + }, + { + name: "flake8-docstrings", + icon: "📦", + }, + { + name: "cssutils", + icon: "📦", + }, + { + name: "tensorflow-addons", + icon: "📦", + }, + { + name: "azureml-pipeline-steps", + icon: "📦", + }, + { + name: "paste", + icon: "📦", + }, + { + name: "dparse", + icon: "📦", + }, + { + name: "probableparsing", + icon: "📦", + }, + { + name: "cloudant", + icon: "📦", + }, + { + name: "docker-py", + icon: "📦", + }, + { + name: "troposphere", + icon: "📦", + }, + { + name: "soundfile", + icon: "📦", + }, + { + name: "geohash", + icon: "📦", + }, + { + name: "backports-csv", + icon: "📦", + }, + { + name: "jsonlines", + icon: "📦", + }, + { + name: "django-celery-beat", + icon: "📦", + }, + { + name: "azureml-pipeline", + icon: "📦", + }, + { + name: "rjsmin", + icon: "📦", + }, + { + name: "watson-machine-learning-client", + icon: "📦", + }, + { + name: "datashape", + icon: "📦", + }, + { + name: "funcy", + icon: "📦", + }, + { + name: "demjson", + icon: "📦", + }, + { + name: "pint", + icon: "📦", + }, + { + name: "pmdarima", + icon: "📦", + }, + { + name: "google-cloud-speech", + icon: "📦", + }, + { + name: "mozversion", + icon: "📦", + }, + { + name: "urltools", + icon: "📦", + }, + { + name: "tribool", + icon: "📦", + }, + { + name: "azureml-train", + icon: "📦", + }, + { + name: "rfc3987", + icon: "📦", + }, + { + name: "mpi4py", + icon: "📦", + }, + { + name: "xmlsec", + icon: "📦", + }, + { + name: "ansible-lint", + icon: "📦", + }, + { + name: "azureml-sdk", + icon: "📦", + }, + { + name: "usaddress", + icon: "📦", + }, + { + name: "social-auth-core", + icon: "📦", + }, + { + name: "autobahn", + icon: "📦", + }, + { + name: "couchdb", + icon: "📦", + }, + { + name: "orderedmultidict", + icon: "📦", + }, + { + name: "bidict", + icon: "📦", + }, + { + name: "oyaml", + icon: "📦", + }, + { + name: "pyvirtualdisplay", + icon: "📦", + }, + { + name: "workalendar", + icon: "📦", + }, + { + name: "flake8-bugbear", + icon: "📦", + }, + { + name: "opencv-contrib-python", + icon: "📦", + }, + { + name: "aws-requests-auth", + icon: "📦", + }, + { + name: "pillow-simd", + icon: "📦", + }, + { + name: "azure-multiapi-storage", + icon: "📦", + }, + { + name: "clickhouse-driver", + icon: "📦", + }, + { + name: "dataclasses-json", + icon: "📦", + }, + { + name: "wget", + icon: "📦", + }, + { + name: "weasyprint", + icon: "📦", + }, + { + name: "neptune-client", + icon: "📦", + }, + { + name: "pastedeploy", + icon: "📦", + }, + { + name: "firebase-admin", + icon: "📦", + }, + { + name: "shellescape", + icon: "📦", + }, + { + name: "brotlipy", + icon: "📦", + }, + { + name: "eli5", + icon: "📦", + }, + { + name: "htmlmin", + icon: "📦", + }, + { + name: "orjson", + icon: "📦", + }, + { + name: "pytest-sugar", + icon: "📦", + }, + { + name: "stackprinter", + icon: "📦", + }, + { + name: "sgp4", + icon: "📦", + }, + { + name: "python-geohash", + icon: "📦", + }, + { + name: "social-auth-app-django", + icon: "📦", + }, + { + name: "azureml-automl-core", + icon: "📦", + }, + { + name: "colorlover", + icon: "📦", + }, + { + name: "dominate", + icon: "📦", + }, + { + name: "mkdocs", + icon: "📦", + }, + { + name: "librosa", + icon: "📦", + }, + { + name: "azureml-train-automl-client", + icon: "📦", + }, + { + name: "timezonefinder", + icon: "📦", + }, + { + name: "flake8-quotes", + icon: "📦", + }, + { + name: "pyformance", + icon: "📦", + }, + { + name: "gapic-google-cloud-datastore-v1", + icon: "📦", + }, + { + name: "glob2", + icon: "📦", + }, + { + name: "txaio", + icon: "📦", + }, + { + name: "aioprometheus", + icon: "📦", + }, + { + name: "azureml-model-management-sdk", + icon: "📦", + }, + { + name: "ws4py", + icon: "📦", + }, + { + name: "jplephem", + icon: "📦", + }, + { + name: "django-ipware", + icon: "📦", + }, + { + name: "spotinst-agent", + icon: "📦", + }, + { + name: "pyvmomi", + icon: "📦", + }, + { + name: "django-import-export", + icon: "📦", + }, + { + name: "flask-marshmallow", + icon: "📦", + }, + { + name: "ray", + icon: "📦", + }, + { + name: "onnxruntime", + icon: "📦", + }, + { + name: "pyppeteer", + icon: "📦", + }, + { + name: "jsonpath-ng", + icon: "📦", + }, + { + name: "oslo-log", + icon: "📦", + }, + { + name: "odfpy", + icon: "📦", + }, + { + name: "django-js-asset", + icon: "📦", + }, + { + name: "webcolors", + icon: "📦", + }, + { + name: "peewee", + icon: "📦", + }, + { + name: "connexion", + icon: "📦", + }, + { + name: "python-novaclient", + icon: "📦", + }, + { + name: "requestsexceptions", + icon: "📦", + }, + { + name: "mathematics-dataset", + icon: "📦", + }, + { + name: "pytest-env", + icon: "📦", + }, + { + name: "skyfield", + icon: "📦", + }, + { + name: "analytics-python", + icon: "📦", + }, + { + name: "schematics", + icon: "📦", + }, + { + name: "memoized-property", + icon: "📦", + }, + { + name: "googletrans", + icon: "📦", + }, + { + name: "django-rest-swagger", + icon: "📦", + }, + { + name: "polyline", + icon: "📦", + }, + { + name: "graphframes", + icon: "📦", + }, + { + name: "nvidia-ml-py3", + icon: "📦", + }, + { + name: "pyvcf", + icon: "📦", + }, + { + name: "onnx", + icon: "📦", + }, + { + name: "serpent", + icon: "📦", + }, + { + name: "pyathenajdbc", + icon: "📦", + }, + { + name: "flake8-import-order", + icon: "📦", + }, + { + name: "oslo-context", + icon: "📦", + }, + { + name: "autograd", + icon: "📦", + }, + { + name: "pytimeparse", + icon: "📦", + }, + { + name: "django-phonenumber-field", + icon: "📦", + }, + { + name: "opencv-python-headless", + icon: "📦", + }, + { + name: "skyfield-data", + icon: "📦", + }, + { + name: "audioread", + icon: "📦", + }, + { + name: "blessed", + icon: "📦", + }, + { + name: "facebook-business", + icon: "📦", + }, + { + name: "pep517", + icon: "📦", + }, + { + name: "python-socketio", + icon: "📦", + }, + { + name: "branca", + icon: "📦", + }, + { + name: "pyqt5-sip", + icon: "📦", + }, + { + name: "python-engineio", + icon: "📦", + }, + { + name: "timeout-decorator", + icon: "📦", + }, + { + name: "phonenumberslite", + icon: "📦", + }, + { + name: "osc-lib", + icon: "📦", + }, + { + name: "openapi-codec", + icon: "📦", + }, + { + name: "pydash", + icon: "📦", + }, + { + name: "djangorestframework-jwt", + icon: "📦", + }, + { + name: "pyro4", + icon: "📦", + }, + { + name: "fake-useragent", + icon: "📦", + }, + { + name: "requests-kerberos", + icon: "📦", + }, + { + name: "cachelib", + icon: "📦", + }, + { + name: "tb-nightly", + icon: "📦", + }, + { + name: "scikit-build", + icon: "📦", + }, + { + name: "virtualenvwrapper", + icon: "📦", + }, + { + name: "flask-socketio", + icon: "📦", + }, + { + name: "pdfkit", + icon: "📦", + }, + { + name: "pefile", + icon: "📦", + }, + { + name: "sseclient-py", + icon: "📦", + }, + { + name: "fonttools", + icon: "📦", + }, + { + name: "orderedset", + icon: "📦", + }, + { + name: "platformio", + icon: "📦", + }, + { + name: "elastic-apm", + icon: "📦", + }, + { + name: "kafka", + icon: "📦", + }, + { + name: "dash-renderer", + icon: "📦", + }, + { + name: "python3-saml", + icon: "📦", + }, + { + name: "google-cloud-trace", + icon: "📦", + }, + { + name: "folium", + icon: "📦", + }, + { + name: "naked", + icon: "📦", + }, + { + name: "aws-encryption-sdk", + icon: "📦", + }, + { + name: "urwid", + icon: "📦", + }, + { + name: "xarray", + icon: "📦", + }, + { + name: "asynctest", + icon: "📦", + }, + { + name: "jwcrypto", + icon: "📦", + }, + { + name: "credstash", + icon: "📦", + }, + { + name: "pykerberos", + icon: "📦", + }, + { + name: "textblob", + icon: "📦", + }, + { + name: "ninja", + icon: "📦", + }, + { + name: "dash", + icon: "📦", + }, + { + name: "mutagen", + icon: "📦", + }, + { + name: "pywinrm", + icon: "📦", + }, + { + name: "dash-core-components", + icon: "📦", + }, + { + name: "django-allauth", + icon: "📦", + }, + { + name: "mysql-connector-python-rf", + icon: "📦", + }, + { + name: "django-mptt", + icon: "📦", + }, + { + name: "google-cloud-dataflow", + icon: "📦", + }, + { + name: "pyfiglet", + icon: "📦", + }, + { + name: "cerberus-python-client", + icon: "📦", + }, + { + name: "dropbox", + icon: "📦", + }, + { + name: "wordcloud", + icon: "📦", + }, + { + name: "sentinels", + icon: "📦", + }, + { + name: "editdistance", + icon: "📦", + }, + { + name: "googledatastore", + icon: "📦", + }, + { + name: "tensorflow-tensorboard", + icon: "📦", + }, + { + name: "dash-html-components", + icon: "📦", + }, + { + name: "swagger-spec-validator", + icon: "📦", + }, + { + name: "thriftpy2", + icon: "📦", + }, + { + name: "nvidia-ml-py", + icon: "📦", + }, + { + name: "facebook-sdk", + icon: "📦", + }, + { + name: "bumpversion", + icon: "📦", + }, + { + name: "azure-keyvault-keys", + icon: "📦", + }, + { + name: "python-cinderclient", + icon: "📦", + }, + { + name: "base58", + icon: "📦", + }, + { + name: "initools", + icon: "📦", + }, + { + name: "pytest-remotedata", + icon: "📦", + }, + { + name: "imblearn", + icon: "📦", + }, + { + name: "url-normalize", + icon: "📦", + }, + { + name: "pywin32-ctypes", + icon: "📦", + }, + { + name: "spark-sklearn", + icon: "📦", + }, + { + name: "scrapy-splash", + icon: "📦", + }, + { + name: "django-countries", + icon: "📦", + }, + { + name: "asyncpg", + icon: "📦", + }, + { + name: "cftime", + icon: "📦", + }, + { + name: "ipaddr", + icon: "📦", + }, + { + name: "imagehash", + icon: "📦", + }, + { + name: "django-nose", + icon: "📦", + }, + { + name: "marionette-driver", + icon: "📦", + }, + { + name: "python-subunit", + icon: "📦", + }, + { + name: "netcdf4", + icon: "📦", + }, + { + name: "django-webpack-loader", + icon: "📦", + }, + { + name: "mongomock", + icon: "📦", + }, + { + name: "protobuf3-to-dict", + icon: "📦", + }, + { + name: "appium-python-client", + icon: "📦", + }, + { + name: "py-spy", + icon: "📦", + }, + { + name: "gql", + icon: "📦", + }, + { + name: "rtree", + icon: "📦", + }, + { + name: "flask-testing", + icon: "📦", + }, + { + name: "attrdict", + icon: "📦", + }, + { + name: "mercantile", + icon: "📦", + }, + { + name: "signalfx", + icon: "📦", + }, + { + name: "astropy", + icon: "📦", + }, + { + name: "xxhash", + icon: "📦", + }, + { + name: "pyquery", + icon: "📦", + }, + { + name: "clickhouse-cityhash", + icon: "📦", + }, + { + name: "flake8-comprehensions", + icon: "📦", + }, + { + name: "gcloud", + icon: "📦", + }, + { + name: "nox", + icon: "📦", + }, + { + name: "crypto", + icon: "📦", + }, + { + name: "httpretty", + icon: "📦", + }, + { + name: "launcher", + icon: "📦", + }, + { + name: "databricks-pypi2", + icon: "📦", + }, + { + name: "cement", + icon: "📦", + }, + { + name: "azure-mgmt-sqlvirtualmachine", + icon: "📦", + }, + { + name: "django-celery-results", + icon: "📦", + }, + { + name: "json-log-formatter", + icon: "📦", + }, + { + name: "azure-mgmt-deploymentmanager", + icon: "📦", + }, + { + name: "astral", + icon: "📦", + }, + { + name: "azureml-designer-serving", + icon: "📦", + }, + { + name: "diskcache", + icon: "📦", + }, + { + name: "pdfminer", + icon: "📦", + }, + { + name: "azure-mgmt-appconfiguration", + icon: "📦", + }, + { + name: "fluent-logger", + icon: "📦", + }, + { + name: "azure-mgmt-security", + icon: "📦", + }, + { + name: "isoweek", + icon: "📦", + }, + { + name: "rollbar", + icon: "📦", + }, + { + name: "dash-table", + icon: "📦", + }, + { + name: "update-checker", + icon: "📦", + }, + { + name: "sagemaker", + icon: "📦", + }, + { + name: "meld3", + icon: "📦", + }, + { + name: "pykwalify", + icon: "📦", + }, + { + name: "click-completion", + icon: "📦", + }, + { + name: "djangorestframework-simplejwt", + icon: "📦", + }, + { + name: "ddt", + icon: "📦", + }, + { + name: "annoy", + icon: "📦", + }, + { + name: "j2cli", + icon: "📦", + }, + { + name: "hashids", + icon: "📦", + }, + { + name: "weka-easypy", + icon: "📦", + }, + { + name: "pysnmp", + icon: "📦", + }, + { + name: "python-logstash", + icon: "📦", + }, + { + name: "lru-dict", + icon: "📦", + }, + { + name: "ratelim", + icon: "📦", + }, + { + name: "libsass", + icon: "📦", + }, + { + name: "path-py", + icon: "📦", + }, + { + name: "rdflib", + icon: "📦", + }, + { + name: "google-cloud-dns", + icon: "📦", + }, + { + name: "geocoder", + icon: "📦", + }, + { + name: "azure-mgmt-apimanagement", + icon: "📦", + }, + { + name: "poetry-core", + icon: "📦", + }, + { + name: "azure-mgmt-imagebuilder", + icon: "📦", + }, + { + name: "tensorflow-probability", + icon: "📦", + }, + { + name: "jupyterlab-widgets", + icon: "📦", + }, + { + name: "rope", + icon: "📦", + }, + { + name: "google-cloud-resource-manager", + icon: "📦", + }, + { + name: "daphne", + icon: "📦", + }, + { + name: "azure-mgmt-kusto", + icon: "📦", + }, + { + name: "cufflinks", + icon: "📦", + }, + { + name: "ezfntesting", + icon: "📦", + }, + { + name: "jsonref", + icon: "📦", + }, + { + name: "javaproperties", + icon: "📦", + }, + { + name: "hacs-frontend", + icon: "📦", + }, + { + name: "simpleeval", + icon: "📦", + }, + { + name: "cbor2", + icon: "📦", + }, + { + name: "vsts", + icon: "📦", + }, + { + name: "furl", + icon: "📦", + }, + { + name: "flask-mail", + icon: "📦", + }, + { + name: "pyrogram", + icon: "📦", + }, + { + name: "pyaes", + icon: "📦", + }, + { + name: "django-compressor", + icon: "📦", + }, + { + name: "pytoml", + icon: "📦", + }, + { + name: "pysmi", + icon: "📦", + }, + { + name: "pyautogui", + icon: "📦", + }, + { + name: "ptvsd", + icon: "📦", + }, + { + name: "moznetwork", + icon: "📦", + }, + { + name: "channels", + icon: "📦", + }, + { + name: "pymdown-extensions", + icon: "📦", + }, + { + name: "js2xml", + icon: "📦", + }, + { + name: "fastdtw", + icon: "📦", + }, + { + name: "html5-parser", + icon: "📦", + }, + { + name: "pyscreeze", + icon: "📦", + }, + { + name: "txaws", + icon: "📦", + }, + { + name: "azure-mgmt-privatedns", + icon: "📦", + }, + { + name: "mechanize", + icon: "📦", + }, + { + name: "checkdigit", + icon: "📦", + }, + { + name: "azure-functions-devops-build", + icon: "📦", + }, + { + name: "pysaml2", + icon: "📦", + }, + { + name: "pyobjc-core", + icon: "📦", + }, + { + name: "keras-tuner", + icon: "📦", + }, + { + name: "num2words", + icon: "📦", + }, + { + name: "vsts-cd-manager", + icon: "📦", + }, + { + name: "pymsgbox", + icon: "📦", + }, + { + name: "google-cloud-container", + icon: "📦", + }, + { + name: "zstandard", + icon: "📦", + }, + { + name: "mxnet", + icon: "📦", + }, + { + name: "pyusb", + icon: "📦", + }, + { + name: "locustio", + icon: "📦", + }, + { + name: "python-telegram-bot", + icon: "📦", + }, + { + name: "conan", + icon: "📦", + }, + { + name: "smdebug-rulesconfig", + icon: "📦", + }, + { + name: "django-oauth-toolkit", + icon: "📦", + }, + { + name: "awsebcli", + icon: "📦", + }, + { + name: "pywinpty", + icon: "📦", + }, + { + name: "os-client-config", + icon: "📦", + }, + { + name: "pytest-ordering", + icon: "📦", + }, + { + name: "azure-mgmt-botservice", + icon: "📦", + }, + { + name: "google-cloud-runtimeconfig", + icon: "📦", + }, + { + name: "flask-httpauth", + icon: "📦", + }, + { + name: "ansiwrap", + icon: "📦", + }, + { + name: "python-decouple", + icon: "📦", + }, + { + name: "dulwich", + icon: "📦", + }, + { + name: "django-simple-history", + icon: "📦", + }, + { + name: "pytweening", + icon: "📦", + }, + { + name: "tableauserverclient", + icon: "📦", + }, + { + name: "azureml-contrib-services", + icon: "📦", + }, + { + name: "vertica-python", + icon: "📦", + }, + { + name: "pluginbase", + icon: "📦", + }, + { + name: "autoflake", + icon: "📦", + }, + { + name: "args", + icon: "📦", + }, + { + name: "azure-mgmt-managedservices", + icon: "📦", + }, + { + name: "pygetwindow", + icon: "📦", + }, + { + name: "premailer", + icon: "📦", + }, + { + name: "tempita", + icon: "📦", + }, + { + name: "pyshp", + icon: "📦", + }, + { + name: "pytest-randomly", + icon: "📦", + }, + { + name: "translationstring", + icon: "📦", + }, + { + name: "clint", + icon: "📦", + }, + { + name: "torchtext", + icon: "📦", + }, + { + name: "tzwhere", + icon: "📦", + }, + { + name: "pyhocon", + icon: "📦", + }, + { + name: "python-stdnum", + icon: "📦", + }, + { + name: "node-semver", + icon: "📦", + }, + { + name: "pyrect", + icon: "📦", + }, + { + name: "parsimonious", + icon: "📦", + }, + { + name: "python-glanceclient", + icon: "📦", + }, + { + name: "pypd", + icon: "📦", + }, + { + name: "azure-mgmt-redhatopenshift", + icon: "📦", + }, + { + name: "iso3166", + icon: "📦", + }, + { + name: "stups-tokens", + icon: "📦", + }, + { + name: "rcssmin", + icon: "📦", + }, + { + name: "pylru", + icon: "📦", + }, + { + name: "salesforce-bulk", + icon: "📦", + }, + { + name: "pipdeptree", + icon: "📦", + }, + { + name: "gprof2dot", + icon: "📦", + }, + { + name: "collectd-nvidianvml", + icon: "📦", + }, + { + name: "pvlib", + icon: "📦", + }, + { + name: "google-compute-engine", + icon: "📦", + }, + { + name: "textwrap3", + icon: "📦", + }, + { + name: "visitor", + icon: "📦", + }, + { + name: "pyspark-stubs", + icon: "📦", + }, + { + name: "mkdocs-material", + icon: "📦", + }, + { + name: "pytest-repeat", + icon: "📦", + }, + { + name: "python-nvd3", + icon: "📦", + }, + { + name: "allure-python-commons", + icon: "📦", + }, + { + name: "empy", + icon: "📦", + }, + { + name: "nose-timer", + icon: "📦", + }, + { + name: "liac-arff", + icon: "📦", + }, + { + name: "glfw", + icon: "📦", + }, + { + name: "robotframework-seleniumlibrary", + icon: "📦", + }, + { + name: "mouseinfo", + icon: "📦", + }, + { + name: "mypy-protobuf", + icon: "📦", + }, + { + name: "pymemcache", + icon: "📦", + }, + { + name: "azure-keyvault-certificates", + icon: "📦", + }, + { + name: "grequests", + icon: "📦", + }, + { + name: "aiogithubapi", + icon: "📦", + }, + { + name: "stups-zign", + icon: "📦", + }, + { + name: "stups-cli-support", + icon: "📦", + }, + { + name: "line-profiler", + icon: "📦", + }, + { + name: "crashtest", + icon: "📦", + }, + { + name: "tsfresh", + icon: "📦", + }, + { + name: "m3u8", + icon: "📦", + }, + { + name: "keyrings-alt", + icon: "📦", + }, + { + name: "markdown2", + icon: "📦", + }, + { + name: "rauth", + icon: "📦", + }, + { + name: "port-for", + icon: "📦", + }, + { + name: "ptable", + icon: "📦", + }, + { + name: "thriftpy", + icon: "📦", + }, + { + name: "great-expectations", + icon: "📦", + }, + { + name: "minio", + icon: "📦", + }, + { + name: "polib", + icon: "📦", + }, + { + name: "model-mommy", + icon: "📦", + }, + { + name: "azureml-dataprep-rslex", + icon: "📦", + }, + { + name: "django-widget-tweaks", + icon: "📦", + }, + { + name: "category-encoders", + icon: "📦", + }, + { + name: "mrjob", + icon: "📦", + }, + { + name: "rasterio", + icon: "📦", + }, + { + name: "memory-profiler", + icon: "📦", + }, + { + name: "papermill", + icon: "📦", + }, + { + name: "sqlalchemy-migrate", + icon: "📦", + }, + { + name: "filechunkio", + icon: "📦", + }, + { + name: "pyhs2", + icon: "📦", + }, + { + name: "pandas-profiling", + icon: "📦", + }, + { + name: "pytest-flask", + icon: "📦", + }, + { + name: "jsonnet", + icon: "📦", + }, + { + name: "spark-nlp", + icon: "📦", + }, + { + name: "python-neutronclient", + icon: "📦", + }, + { + name: "auth", + icon: "📦", + }, + { + name: "aws-sam-cli", + icon: "📦", + }, + { + name: "flake8-builtins", + icon: "📦", + }, + { + name: "benbotasync", + icon: "📦", + }, + { + name: "oauth2", + icon: "📦", + }, + { + name: "xlwings", + icon: "📦", + }, + { + name: "lazy", + icon: "📦", + }, + { + name: "bottleneck", + icon: "📦", + }, + { + name: "tree-format", + icon: "📦", + }, + { + name: "bson", + icon: "📦", + }, + { + name: "affine", + icon: "📦", + }, + { + name: "pyenchant", + icon: "📦", + }, + { + name: "circleci", + icon: "📦", + }, + { + name: "elementpath", + icon: "📦", + }, + { + name: "gtts", + icon: "📦", + }, + { + name: "aiohttp-cors", + icon: "📦", + }, + { + name: "imutils", + icon: "📦", + }, + { + name: "python-whois", + icon: "📦", + }, + { + name: "json-logging-py", + icon: "📦", + }, + { + name: "webapp2", + icon: "📦", + }, + { + name: "jinja2-cli", + icon: "📦", + }, + { + name: "django-localflavor", + icon: "📦", + }, + { + name: "maturin", + icon: "📦", + }, + { + name: "django-taggit", + icon: "📦", + }, + { + name: "h3", + icon: "📦", + }, + { + name: "azure-cli-command-modules-nspkg", + icon: "📦", + }, + { + name: "django-polymorphic", + icon: "📦", + }, + { + name: "geoalchemy2", + icon: "📦", + }, + { + name: "pydotplus", + icon: "📦", + }, + { + name: "pysqlite", + icon: "📦", + }, + { + name: "flake8-commas", + icon: "📦", + }, + { + name: "aws-lambda-builders", + icon: "📦", + }, + { + name: "routes", + icon: "📦", + }, + { + name: "icalendar", + icon: "📦", + }, + { + name: "mss", + icon: "📦", + }, + { + name: "awacs", + icon: "📦", + }, + { + name: "nameparser", + icon: "📦", + }, + { + name: "pattern", + icon: "📦", + }, + { + name: "feather-format", + icon: "📦", + }, + { + name: "django-formtools", + icon: "📦", + }, + { + name: "warlock", + icon: "📦", + }, + { + name: "confuse", + icon: "📦", + }, + { + name: "prawcore", + icon: "📦", + }, + { + name: "snuggs", + icon: "📦", + }, + { + name: "filetype", + icon: "📦", + }, + { + name: "google-cloud-ndb", + icon: "📦", + }, + { + name: "jieba", + icon: "📦", + }, + { + name: "graphene-django", + icon: "📦", + }, + { + name: "anyconfig", + icon: "📦", + }, + { + name: "spotipy", + icon: "📦", + }, + { + name: "fortniteapiasync", + icon: "📦", + }, + { + name: "flake8-print", + icon: "📦", + }, + { + name: "slicer", + icon: "📦", + }, + { + name: "rpyc", + icon: "📦", + }, + { + name: "jenkinsapi", + icon: "📦", + }, + { + name: "markuppy", + icon: "📦", + }, + { + name: "django-mysql", + icon: "📦", + }, + { + name: "radon", + icon: "📦", + }, + { + name: "xlocal", + icon: "📦", + }, + { + name: "bump2version", + icon: "📦", + }, + { + name: "pyros-genmsg", + icon: "📦", + }, + { + name: "protego", + icon: "📦", + }, + { + name: "github3-py", + icon: "📦", + }, + { + name: "lifetimes", + icon: "📦", + }, + { + name: "flashtext", + icon: "📦", + }, + { + name: "python-openstackclient", + icon: "📦", + }, + { + name: "drf-nested-routers", + icon: "📦", + }, + { + name: "pytest-benchmark", + icon: "📦", + }, + { + name: "retry-decorator", + icon: "📦", + }, + { + name: "patch-ng", + icon: "📦", + }, + { + name: "swagger-ui-bundle", + icon: "📦", + }, + { + name: "xmlschema", + icon: "📦", + }, + { + name: "pyros-genpy", + icon: "📦", + }, + { + name: "vatnumber", + icon: "📦", + }, + { + name: "molecule", + icon: "📦", + }, + { + name: "logbook", + icon: "📦", + }, + { + name: "asyncio-nats-client", + icon: "📦", + }, + { + name: "django-braces", + icon: "📦", + }, + { + name: "wikipedia", + icon: "📦", + }, + { + name: "tf-estimator-nightly", + icon: "📦", + }, + { + name: "pyjarowinkler", + icon: "📦", + }, + { + name: "fpdf", + icon: "📦", + }, + { + name: "py3nvml", + icon: "📦", + }, + { + name: "transitions", + icon: "📦", + }, + { + name: "moviepy", + icon: "📦", + }, + { + name: "jinja2-pluralize", + icon: "📦", + }, + { + name: "recordtype", + icon: "📦", + }, + { + name: "mixpanel", + icon: "📦", + }, + { + name: "junitparser", + icon: "📦", + }, + { + name: "django-rest-auth", + icon: "📦", + }, + { + name: "public", + icon: "📦", + }, + { + name: "wand", + icon: "📦", + }, + { + name: "grpcio-health-checking", + icon: "📦", + }, + { + name: "python-pptx", + icon: "📦", + }, + { + name: "python-string-utils", + icon: "📦", + }, + { + name: "edn-format", + icon: "📦", + }, + { + name: "pdf2image", + icon: "📦", + }, + { + name: "agate", + icon: "📦", + }, + { + name: "leather", + icon: "📦", + }, + { + name: "missingno", + icon: "📦", + }, + { + name: "ffmpeg-python", + icon: "📦", + }, + { + name: "flake8-isort", + icon: "📦", + }, + { + name: "lime", + icon: "📦", + }, + { + name: "snakebite", + icon: "📦", + }, + { + name: "ipyparallel", + icon: "📦", + }, + { + name: "braintree", + icon: "📦", + }, + { + name: "hurry-filesize", + icon: "📦", + }, + { + name: "nose2", + icon: "📦", + }, + { + name: "pathlib-mate", + icon: "📦", + }, + { + name: "openshift", + icon: "📦", + }, + { + name: "pytest-flake8", + icon: "📦", + }, + { + name: "jupyter-nbextensions-configurator", + icon: "📦", + }, + { + name: "pandasql", + icon: "📦", + }, + { + name: "python-rapidjson", + icon: "📦", + }, + { + name: "datasketch", + icon: "📦", + }, + { + name: "django-waffle", + icon: "📦", + }, + { + name: "ansicolors", + icon: "📦", + }, + { + name: "hyper", + icon: "📦", + }, + { + name: "maxminddb-geolite2", + icon: "📦", + }, + { + name: "google-cloud-profiler", + icon: "📦", + }, + { + name: "fastprogress", + icon: "📦", + }, + { + name: "azureml-defaults", + icon: "📦", + }, + { + name: "mando", + icon: "📦", + }, + { + name: "slackweb", + icon: "📦", + }, + { + name: "databricks-connect", + icon: "📦", + }, + { + name: "gevent-websocket", + icon: "📦", + }, + { + name: "google-cloud-dataproc", + icon: "📦", + }, + { + name: "gtts-token", + icon: "📦", + }, + { + name: "jupyter-latex-envs", + icon: "📦", + }, + { + name: "praw", + icon: "📦", + }, + { + name: "flask-oauthlib", + icon: "📦", + }, + { + name: "gcs-oauth2-boto-plugin", + icon: "📦", + }, + { + name: "jaeger-client", + icon: "📦", + }, + { + name: "luminol", + icon: "📦", + }, + { + name: "progressbar", + icon: "📦", + }, + { + name: "fancycompleter", + icon: "📦", + }, + { + name: "oslo-concurrency", + icon: "📦", + }, + { + name: "threadloop", + icon: "📦", + }, + { + name: "google-cloud-bigquery-datatransfer", + icon: "📦", + }, + { + name: "fabric3", + icon: "📦", + }, + { + name: "recordclass", + icon: "📦", + }, + { + name: "pyfakefs", + icon: "📦", + }, + { + name: "testinfra", + icon: "📦", + }, + { + name: "deepmerge", + icon: "📦", + }, + { + name: "azureml-dataset-runtime", + icon: "📦", + }, + { + name: "nose-exclude", + icon: "📦", + }, + { + name: "stomp-py", + icon: "📦", + }, + { + name: "solartime", + icon: "📦", + }, + { + name: "pdfrw", + icon: "📦", + }, + { + name: "uuid", + icon: "📦", + }, + { + name: "django-reversion", + icon: "📦", + }, + { + name: "pylint-flask", + icon: "📦", + }, + { + name: "django-redis-cache", + icon: "📦", + }, + { + name: "sklearn-pandas", + icon: "📦", + }, + { + name: "ansible-tower-cli", + icon: "📦", + }, + { + name: "readthedocs-sphinx-ext", + icon: "📦", + }, + { + name: "jaraco-classes", + icon: "📦", + }, + { + name: "chevron", + icon: "📦", + }, + { + name: "pygresql", + icon: "📦", + }, + { + name: "rich", + icon: "📦", + }, + { + name: "msgpack-numpy", + icon: "📦", + }, + { + name: "pyu2f", + icon: "📦", + }, + { + name: "mlxtend", + icon: "📦", + }, + { + name: "flex", + icon: "📦", + }, + { + name: "ggplot", + icon: "📦", + }, + { + name: "phik", + icon: "📦", + }, + { + name: "pytest-pythonpath", + icon: "📦", + }, + { + name: "records", + icon: "📦", + }, + { + name: "lmdb", + icon: "📦", + }, + { + name: "pyramid", + icon: "📦", + }, + { + name: "macholib", + icon: "📦", + }, + { + name: "vobject", + icon: "📦", + }, + { + name: "python-gilt", + icon: "📦", + }, + { + name: "python-openid", + icon: "📦", + }, + { + name: "diff-cover", + icon: "📦", + }, + { + name: "graphql-server-core", + icon: "📦", + }, + { + name: "allure-pytest", + icon: "📦", + }, + { + name: "pytest-watch", + icon: "📦", + }, + { + name: "pudb", + icon: "📦", + }, + { + name: "pamqp", + icon: "📦", + }, + { + name: "trains", + icon: "📦", + }, + { + name: "wmctrl", + icon: "📦", + }, + { + name: "numpydoc", + icon: "📦", + }, + { + name: "jaraco-text", + icon: "📦", + }, + { + name: "milksnake", + icon: "📦", + }, + { + name: "imgaug", + icon: "📦", + }, + { + name: "serverlessrepo", + icon: "📦", + }, + { + name: "jaraco-collections", + icon: "📦", + }, + { + name: "google-reauth", + icon: "📦", + }, + { + name: "django-ses", + icon: "📦", + }, + { + name: "happybase", + icon: "📦", + }, + { + name: "python-redis-lock", + icon: "📦", + }, + { + name: "jupyter-contrib-core", + icon: "📦", + }, + { + name: "pybase64", + icon: "📦", + }, + { + name: "youtube-dl-server", + icon: "📦", + }, + { + name: "pympler", + icon: "📦", + }, + { + name: "jupyter-contrib-nbextensions", + icon: "📦", + }, + { + name: "requests-unixsocket", + icon: "📦", + }, + { + name: "django-picklefield", + icon: "📦", + }, + { + name: "pdbpp", + icon: "📦", + }, + { + name: "snapshottest", + icon: "📦", + }, + { + name: "sphinxcontrib-httpdomain", + icon: "📦", + }, + { + name: "environs", + icon: "📦", + }, + { + name: "ipy", + icon: "📦", + }, + { + name: "check-manifest", + icon: "📦", + }, + { + name: "webdriver-manager", + icon: "📦", + }, + { + name: "pylint-celery", + icon: "📦", + }, + { + name: "django-treebeard", + icon: "📦", + }, + { + name: "alog", + icon: "📦", + }, + { + name: "currencyconverter", + icon: "📦", + }, + { + name: "publicsuffix", + icon: "📦", + }, + { + name: "pytest-variables", + icon: "📦", + }, + { + name: "pydub", + icon: "📦", + }, + { + name: "djangorestframework-camel-case", + icon: "📦", + }, + { + name: "google-cloud-tasks", + icon: "📦", + }, + { + name: "electrical-calendar", + icon: "📦", + }, + { + name: "hupper", + icon: "📦", + }, + { + name: "brewer2mpl", + icon: "📦", + }, + { + name: "motor", + icon: "📦", + }, + { + name: "ortools", + icon: "📦", + }, + { + name: "overrides", + icon: "📦", + }, + { + name: "tfrecord-lite", + icon: "📦", + }, + { + name: "rq-scheduler", + icon: "📦", + }, + { + name: "impyla", + icon: "📦", + }, + { + name: "palettable", + icon: "📦", + }, + { + name: "pypyodbc", + icon: "📦", + }, + { + name: "dataclasses-serialization", + icon: "📦", + }, + { + name: "wsaccel", + icon: "📦", + }, + { + name: "django-otp", + icon: "📦", + }, + { + name: "zmq", + icon: "📦", + }, + { + name: "partybotpackage", + icon: "📦", + }, + { + name: "jupyter-highlight-selected-word", + icon: "📦", + }, + { + name: "lunr", + icon: "📦", + }, + { + name: "selinux", + icon: "📦", + }, + { + name: "django-axes", + icon: "📦", + }, + { + name: "pyjwkest", + icon: "📦", + }, + { + name: "python-multipart", + icon: "📦", + }, + { + name: "xhtml2pdf", + icon: "📦", + }, + { + name: "bugsnag", + icon: "📦", + }, + { + name: "django-stubs", + icon: "📦", + }, + { + name: "dodgy", + icon: "📦", + }, + { + name: "delorean", + icon: "📦", + }, + { + name: "librato-metrics", + icon: "📦", + }, + { + name: "flasgger", + icon: "📦", + }, + { + name: "asana", + icon: "📦", + }, + { + name: "dm-tree", + icon: "📦", + }, + { + name: "ec2-metadata", + icon: "📦", + }, + { + name: "pyzipcode3", + icon: "📦", + }, + { + name: "django-health-check", + icon: "📦", + }, + { + name: "pyobjc", + icon: "📦", + }, + { + name: "neotime", + icon: "📦", + }, + { + name: "base64io", + icon: "📦", + }, + { + name: "djangorestframework-csv", + icon: "📦", + }, + { + name: "channels-redis", + icon: "📦", + }, + { + name: "gspread-dataframe", + icon: "📦", + }, + { + name: "gapic-google-cloud-error-reporting-v1beta1", + icon: "📦", + }, + { + name: "dictionaries", + icon: "📦", + }, + { + name: "proto-google-cloud-error-reporting-v1beta1", + icon: "📦", + }, + { + name: "avro-gen", + icon: "📦", + }, + { + name: "pygrok", + icon: "📦", + }, + { + name: "pywinauto", + icon: "📦", + }, + { + name: "timing-asgi", + icon: "📦", + }, + { + name: "ur-rtde", + icon: "📦", + }, + { + name: "javaobj-py3", + icon: "📦", + }, + { + name: "httpagentparser", + icon: "📦", + }, + { + name: "queueman", + icon: "📦", + }, + { + name: "pyjks", + icon: "📦", + }, + { + name: "aws-encryption-sdk-cli", + icon: "📦", + }, + { + name: "google-oauth", + icon: "📦", + }, + { + name: "boto3-type-annotations", + icon: "📦", + }, + { + name: "pylibmc", + icon: "📦", + }, + { + name: "amazon-dax-client", + icon: "📦", + }, + { + name: "flatten-json", + icon: "📦", + }, + { + name: "robotframework-requests", + icon: "📦", + }, + { + name: "twofish", + icon: "📦", + }, + { + name: "wsproto", + icon: "📦", + }, + { + name: "ibm-cos-sdk", + icon: "📦", + }, + { + name: "python-xlib", + icon: "📦", + }, + { + name: "mpld3", + icon: "📦", + }, + { + name: "pyreadline", + icon: "📦", + }, + { + name: "xvfbwrapper", + icon: "📦", + }, + { + name: "progress", + icon: "📦", + }, + { + name: "django-anymail", + icon: "📦", + }, + { + name: "chart-studio", + icon: "📦", + }, + { + name: "h2o-pysparkling-2-4", + icon: "📦", + }, + { + name: "flask-api", + icon: "📦", + }, + { + name: "elasticsearch5", + icon: "📦", + }, + { + name: "oauth", + icon: "📦", + }, + { + name: "pex", + icon: "📦", + }, + { + name: "pyahocorasick", + icon: "📦", + }, + { + name: "eth-utils", + icon: "📦", + }, + { + name: "civis", + icon: "📦", + }, + { + name: "socksipy-branch", + icon: "📦", + }, + { + name: "datadiff", + icon: "📦", + }, + { + name: "transaction", + icon: "📦", + }, + { + name: "pyspark-flame", + icon: "📦", + }, + { + name: "gnupg", + icon: "📦", + }, + { + name: "interval", + icon: "📦", + }, + { + name: "pymsteams", + icon: "📦", + }, + { + name: "pytest-base-url", + icon: "📦", + }, + { + name: "beaker", + icon: "📦", + }, + { + name: "proto-google-cloud-pubsub-v1", + icon: "📦", + }, + { + name: "jinjasql", + icon: "📦", + }, + { + name: "flake8-blind-except", + icon: "📦", + }, + { + name: "pyrepl", + icon: "📦", + }, + { + name: "pytest-shard", + icon: "📦", + }, + { + name: "uritools", + icon: "📦", + }, + { + name: "python-resize-image", + icon: "📦", + }, + { + name: "ntplib", + icon: "📦", + }, + { + name: "apns2", + icon: "📦", + }, + { + name: "tox-travis", + icon: "📦", + }, + { + name: "limits", + icon: "📦", + }, + { + name: "threatconnect", + icon: "📦", + }, + { + name: "django-guardian", + icon: "📦", + }, + { + name: "integrationhelper", + icon: "📦", + }, + { + name: "ts-flint", + icon: "📦", + }, + { + name: "eth-typing", + icon: "📦", + }, + { + name: "pytest-selenium", + icon: "📦", + }, + { + name: "iptools", + icon: "📦", + }, + { + name: "pypng", + icon: "📦", + }, + { + name: "django-silk", + icon: "📦", + }, + { + name: "m2crypto", + icon: "📦", + }, + { + name: "dateutils", + icon: "📦", + }, + { + name: "pandas-datareader", + icon: "📦", + }, + { + name: "pymediainfo", + icon: "📦", + }, + { + name: "scout-apm", + icon: "📦", + }, + { + name: "enum", + icon: "📦", + }, + { + name: "restructuredtext-lint", + icon: "📦", + }, + { + name: "magicattr", + icon: "📦", + }, + { + name: "json-rpc", + icon: "📦", + }, + { + name: "sgmllib3k", + icon: "📦", + }, + { + name: "tinydb", + icon: "📦", + }, + { + name: "path", + icon: "📦", + }, + { + name: "simpleitk", + icon: "📦", + }, + { + name: "python3-xlib", + icon: "📦", + }, + { + name: "fasttext", + icon: "📦", + }, + { + name: "query-string", + icon: "📦", + }, + { + name: "marisa-trie", + icon: "📦", + }, + { + name: "nbsphinx", + icon: "📦", + }, + { + name: "xmlrunner", + icon: "📦", + }, + { + name: "optuna", + icon: "📦", + }, + { + name: "prospector", + icon: "📦", + }, + { + name: "django-ckeditor", + icon: "📦", + }, + { + name: "logging", + icon: "📦", + }, + { + name: "selenium-wire", + icon: "📦", + }, + { + name: "auth0-python", + icon: "📦", + }, + { + name: "pyfcm", + icon: "📦", + }, + { + name: "yattag", + icon: "📦", + }, + { + name: "requirements-detector", + icon: "📦", + }, + { + name: "pprintpp", + icon: "📦", + }, + { + name: "databricks-pypi-extras", + icon: "📦", + }, + { + name: "vulture", + icon: "📦", + }, + { + name: "aerospike", + icon: "📦", + }, + { + name: "pamela", + icon: "📦", + }, + { + name: "proglog", + icon: "📦", + }, + { + name: "easydict", + icon: "📦", + }, + { + name: "pytest-custom-exit-code", + icon: "📦", + }, + { + name: "sphinx-autobuild", + icon: "📦", + }, + { + name: "esptool", + icon: "📦", + }, + { + name: "pytest-cache", + icon: "📦", + }, + { + name: "pytest-dependency", + icon: "📦", + }, + { + name: "elasticsearch-curator", + icon: "📦", + }, + { + name: "visions", + icon: "📦", + }, + { + name: "setoptconf", + icon: "📦", + }, + { + name: "ibm-cos-sdk-core", + icon: "📦", + }, + { + name: "ibm-cos-sdk-s3transfer", + icon: "📦", + }, + { + name: "pyactiveresource", + icon: "📦", + }, + { + name: "telethon", + icon: "📦", + }, + { + name: "pytest-pylint", + icon: "📦", + }, + { + name: "tangled-up-in-unicode", + icon: "📦", + }, + { + name: "mecab-python3", + icon: "📦", + }, + { + name: "psycogreen", + icon: "📦", + }, + { + name: "aiocontextvars", + icon: "📦", + }, + { + name: "click-help-colors", + icon: "📦", + }, + { + name: "uszipcode", + icon: "📦", + }, + { + name: "objgraph", + icon: "📦", + }, + { + name: "gremlinpython", + icon: "📦", + }, + { + name: "google-cloud-texttospeech", + icon: "📦", + }, + { + name: "osqp", + icon: "📦", + }, + { + name: "wasmer", + icon: "📦", + }, + { + name: "shopifyapi", + icon: "📦", + }, + { + name: "pytest-aiohttp", + icon: "📦", + }, + { + name: "pysam", + icon: "📦", + }, + { + name: "cmarkgfm", + icon: "📦", + }, + { + name: "geventhttpclient-wheels", + icon: "📦", + }, + { + name: "opencensus-ext-stackdriver", + icon: "📦", + }, + { + name: "web3", + icon: "📦", + }, + { + name: "gapic-google-cloud-pubsub-v1", + icon: "📦", + }, + { + name: "cvxpy", + icon: "📦", + }, + { + name: "distance", + icon: "📦", + }, + { + name: "json-delta", + icon: "📦", + }, + { + name: "dbutils", + icon: "📦", + }, + { + name: "webassets", + icon: "📦", + }, + { + name: "django-prometheus", + icon: "📦", + }, + { + name: "fastcluster", + icon: "📦", + }, + { + name: "splunk-sdk", + icon: "📦", + }, + { + name: "flask-session", + icon: "📦", + }, + { + name: "google-api-helper", + icon: "📦", + }, + { + name: "newlinejson", + icon: "📦", + }, + { + name: "eth-abi", + icon: "📦", + }, + { + name: "colorclass", + icon: "📦", + }, + { + name: "pycocotools", + icon: "📦", + }, + { + name: "selectors2", + icon: "📦", + }, + { + name: "elasticsearch6", + icon: "📦", + }, + { + name: "pyscreenshot", + icon: "📦", + }, + { + name: "stestr", + icon: "📦", + }, + { + name: "httmock", + icon: "📦", + }, + { + name: "oci", + icon: "📦", + }, + { + name: "neobolt", + icon: "📦", + }, + { + name: "lifelines", + icon: "📦", + }, + { + name: "cov-core", + icon: "📦", + }, + { + name: "verboselogs", + icon: "📦", + }, + { + name: "plaster-pastedeploy", + icon: "📦", + }, + { + name: "python-jwt", + icon: "📦", + }, + { + name: "pyhcl", + icon: "📦", + }, + { + name: "comtypes", + icon: "📦", + }, + { + name: "request", + icon: "📦", + }, + { + name: "flask-bootstrap", + icon: "📦", + }, + { + name: "jws", + icon: "📦", + }, + { + name: "biplist", + icon: "📦", + }, + { + name: "rake-nltk", + icon: "📦", + }, + { + name: "mizani", + icon: "📦", + }, + { + name: "pyroute2", + icon: "📦", + }, + { + name: "plaster", + icon: "📦", + }, + { + name: "bingads", + icon: "📦", + }, + { + name: "django-dirtyfields", + icon: "📦", + }, + { + name: "flask-talisman", + icon: "📦", + }, + { + name: "dynaconf", + icon: "📦", + }, + { + name: "get", + icon: "📦", + }, + { + name: "easy-thumbnails", + icon: "📦", + }, + { + name: "requests-cache", + icon: "📦", + }, + { + name: "post", + icon: "📦", + }, + { + name: "django-grappelli", + icon: "📦", + }, + { + name: "biopython", + icon: "📦", + }, + { + name: "pyldap", + icon: "📦", + }, + { + name: "parsley", + icon: "📦", + }, + { + name: "flask-graphql", + icon: "📦", + }, + { + name: "ecos", + icon: "📦", + }, + { + name: "scs", + icon: "📦", + }, + { + name: "crc16", + icon: "📦", + }, + { + name: "utils", + icon: "📦", + }, + { + name: "openapi-core", + icon: "📦", + }, + { + name: "ofxparse", + icon: "📦", + }, + { + name: "hjson", + icon: "📦", + }, + { + name: "profilehooks", + icon: "📦", + }, + { + name: "amply", + icon: "📦", + }, + { + name: "rednose", + icon: "📦", + }, + { + name: "django-user-agents", + icon: "📦", + }, + { + name: "typish", + icon: "📦", + }, + { + name: "nimbusml", + icon: "📦", + }, + { + name: "httpie", + icon: "📦", + }, + { + name: "graypy", + icon: "📦", + }, + { + name: "getch", + icon: "📦", + }, + { + name: "cmaes", + icon: "📦", + }, + { + name: "placebo", + icon: "📦", + }, + { + name: "plotnine", + icon: "📦", + }, + { + name: "jupyterhub", + icon: "📦", + }, + { + name: "logzio-python-handler", + icon: "📦", + }, + { + name: "fs", + icon: "📦", + }, + { + name: "pubnub", + icon: "📦", + }, + { + name: "pywebpush", + icon: "📦", + }, + { + name: "suds", + icon: "📦", + }, + { + name: "robotframework-sshlibrary", + icon: "📦", + }, + { + name: "jupyter-pip", + icon: "📦", + }, + { + name: "sphinx-markdown-tables", + icon: "📦", + }, + { + name: "anytree", + icon: "📦", + }, + { + name: "marshmallow-oneofschema", + icon: "📦", + }, + { + name: "coffeehouse", + icon: "📦", + }, + { + name: "pygtrie", + icon: "📦", + }, + { + name: "pygeocoder", + icon: "📦", + }, + { + name: "umap-learn", + icon: "📦", + }, + { + name: "sphinx-autodoc-typehints", + icon: "📦", + }, + { + name: "urlobject", + icon: "📦", + }, + { + name: "tlslite", + icon: "📦", + }, + { + name: "pusher", + icon: "📦", + }, + { + name: "slimit", + icon: "📦", + }, + { + name: "brunel", + icon: "📦", + }, + { + name: "hdbscan", + icon: "📦", + }, + { + name: "zeroconf", + icon: "📦", + }, + { + name: "django-celery", + icon: "📦", + }, + { + name: "textdistance", + icon: "📦", + }, + { + name: "td-client", + icon: "📦", + }, + { + name: "infinity", + icon: "📦", + }, + { + name: "pytest-random-order", + icon: "📦", + }, + { + name: "cheetah3", + icon: "📦", + }, + { + name: "pyside2", + icon: "📦", + }, + { + name: "colorful", + icon: "📦", + }, + { + name: "pipfile", + icon: "📦", + }, + { + name: "shiboken2", + icon: "📦", + }, + { + name: "requests-pkcs12", + icon: "📦", + }, + { + name: "speechrecognition", + icon: "📦", + }, + { + name: "shyaml", + icon: "📦", + }, + { + name: "py-moneyed", + icon: "📦", + }, + { + name: "pycli", + icon: "📦", + }, + { + name: "streamlit", + icon: "📦", + }, + { + name: "rethinkdb", + icon: "📦", + }, + { + name: "click-log", + icon: "📦", + }, + { + name: "pygal", + icon: "📦", + }, + { + name: "implicit", + icon: "📦", + }, + { + name: "pymc3", + icon: "📦", + }, + { + name: "rpy2", + icon: "📦", + }, + { + name: "pydrive", + icon: "📦", + }, + { + name: "django-tables2", + icon: "📦", + }, + { + name: "testing-common-database", + icon: "📦", + }, + { + name: "ifaddr", + icon: "📦", + }, + { + name: "intervals", + icon: "📦", + }, + { + name: "sorl-thumbnail", + icon: "📦", + }, + { + name: "termstyle", + icon: "📦", + }, + { + name: "sphinxcontrib-bibtex", + icon: "📦", + }, + { + name: "requests-html", + icon: "📦", + }, + { + name: "awsiotpythonsdk", + icon: "📦", + }, + { + name: "flask-restx", + icon: "📦", + }, + { + name: "atari-py", + icon: "📦", + }, + { + name: "sphinxcontrib-plantuml", + icon: "📦", + }, + { + name: "prance", + icon: "📦", + }, + { + name: "names", + icon: "📦", + }, + { + name: "pem", + icon: "📦", + }, + { + name: "django-admin-rangefilter", + icon: "📦", + }, + { + name: "sphinxcontrib-spelling", + icon: "📦", + }, + { + name: "collectd", + icon: "📦", + }, + { + name: "django-jsonfield", + icon: "📦", + }, + { + name: "yaspin", + icon: "📦", + }, + { + name: "azure-functions", + icon: "📦", + }, + { + name: "suds-py3", + icon: "📦", + }, + { + name: "hmmlearn", + icon: "📦", + }, + { + name: "envs", + icon: "📦", + }, + { + name: "eth-hash", + icon: "📦", + }, + { + name: "pandoc", + icon: "📦", + }, + { + name: "flask-mysql", + icon: "📦", + }, + { + name: "click-didyoumean", + icon: "📦", + }, + { + name: "geventhttpclient", + icon: "📦", + }, + { + name: "spotdl", + icon: "📦", + }, + { + name: "dacite", + icon: "📦", + }, + { + name: "peakutils", + icon: "📦", + }, + { + name: "imapclient", + icon: "📦", + }, + { + name: "rlp", + icon: "📦", + }, + { + name: "word2number", + icon: "📦", + }, + { + name: "django-fsm", + icon: "📦", + }, + { + name: "django-classy-tags", + icon: "📦", + }, + { + name: "install", + icon: "📦", + }, + { + name: "tokenize-rt", + icon: "📦", + }, + { + name: "superlance", + icon: "📦", + }, + { + name: "apiclient", + icon: "📦", + }, + { + name: "django-ratelimit", + icon: "📦", + }, + { + name: "bravado-core", + icon: "📦", + }, + { + name: "colored", + icon: "📦", + }, + { + name: "ncclient", + icon: "📦", + }, + { + name: "newrelic-telemetry-sdk", + icon: "📦", + }, + { + name: "django-crontab", + icon: "📦", + }, + { + name: "pythonwhois", + icon: "📦", + }, + { + name: "flask-principal", + icon: "📦", + }, + { + name: "lightfm", + icon: "📦", + }, + { + name: "pytest-azurepipelines", + icon: "📦", + }, + { + name: "dumbyaml", + icon: "📦", + }, + { + name: "globre", + icon: "📦", + }, + { + name: "testresources", + icon: "📦", + }, + { + name: "lml", + icon: "📦", + }, + { + name: "logutils", + icon: "📦", + }, + { + name: "pytd", + icon: "📦", + }, + { + name: "commentjson", + icon: "📦", + }, + { + name: "tableauhyperapi", + icon: "📦", + }, + { + name: "tensorflow-cpu", + icon: "📦", + }, + { + name: "htcondor", + icon: "📦", + }, + { + name: "kaggle", + icon: "📦", + }, + { + name: "treelib", + icon: "📦", + }, + { + name: "fastjsonschema", + icon: "📦", + }, + { + name: "django-autocomplete-light", + icon: "📦", + }, + { + name: "stopit", + icon: "📦", + }, + { + name: "jsonpath-rw-ext", + icon: "📦", + }, + { + name: "flask-apispec", + icon: "📦", + }, + { + name: "xmljson", + icon: "📦", + }, + { + name: "testscenarios", + icon: "📦", + }, + { + name: "us", + icon: "📦", + }, + { + name: "capstone", + icon: "📦", + }, + { + name: "google-cloud-automl", + icon: "📦", + }, + { + name: "reverse-geocoder", + icon: "📦", + }, + { + name: "justwatch", + icon: "📦", + }, + { + name: "onnxconverter-common", + icon: "📦", + }, + { + name: "django-tastypie", + icon: "📦", + }, + { + name: "more-properties", + icon: "📦", + }, + { + name: "geohash2", + icon: "📦", + }, + { + name: "entrypoint2", + icon: "📦", + }, + { + name: "django-csp", + icon: "📦", + }, + { + name: "httpbin", + icon: "📦", + }, + { + name: "pyaudio", + icon: "📦", + }, + { + name: "flask-basicauth", + icon: "📦", + }, + { + name: "eth-keys", + icon: "📦", + }, + { + name: "twitter-common-lang", + icon: "📦", + }, + { + name: "facenet", + icon: "📦", + }, + { + name: "kazurator", + icon: "📦", + }, + { + name: "lottie", + icon: "📦", + }, + { + name: "portpicker", + icon: "📦", + }, + { + name: "pyexcel-io", + icon: "📦", + }, + { + name: "horovod", + icon: "📦", + }, + { + name: "jsii", + icon: "📦", + }, + { + name: "asset", + icon: "📦", + }, + { + name: "twitter-common-dirutil", + icon: "📦", + }, + { + name: "python-geoip", + icon: "📦", + }, + { + name: "django-bulk-update", + icon: "📦", + }, + { + name: "deezloader", + icon: "📦", + }, + { + name: "textfsm", + icon: "📦", + }, + { + name: "opencensus-ext-logging", + icon: "📦", + }, + { + name: "awswrangler", + icon: "📦", + }, + { + name: "pytest-mypy", + icon: "📦", + }, + { + name: "aws-cdk-core", + icon: "📦", + }, + { + name: "latexcodec", + icon: "📦", + }, + { + name: "databricks-pypi", + icon: "📦", + }, + { + name: "p4python", + icon: "📦", + }, + { + name: "arviz", + icon: "📦", + }, + { + name: "django-heroku", + icon: "📦", + }, + { + name: "aws-cdk-cx-api", + icon: "📦", + }, + { + name: "trafaret", + icon: "📦", + }, + { + name: "pygeohash", + icon: "📦", + }, + { + name: "hacking", + icon: "📦", + }, + { + name: "pybtex", + icon: "📦", + }, + { + name: "futurist", + icon: "📦", + }, + { + name: "grpc-google-logging-v2", + icon: "📦", + }, + { + name: "google-images-search", + icon: "📦", + }, + { + name: "createsend", + icon: "📦", + }, + { + name: "pydevd", + icon: "📦", + }, + { + name: "pyxlsb", + icon: "📦", + }, + { + name: "twitter-common-log", + icon: "📦", + }, + { + name: "pywatchman", + icon: "📦", + }, + { + name: "twitter-common-options", + icon: "📦", + }, + { + name: "spark-df-profiling", + icon: "📦", + }, + { + name: "teamcity-messages", + icon: "📦", + }, + { + name: "testing-postgresql", + icon: "📦", + }, + { + name: "unicode-slugify", + icon: "📦", + }, + { + name: "flock", + icon: "📦", + }, + { + name: "dumb-init", + icon: "📦", + }, + { + name: "tensorflow-text", + icon: "📦", + }, + { + name: "grpc-google-pubsub-v1", + icon: "📦", + }, + { + name: "patool", + icon: "📦", + }, + { + name: "spotify-tensorflow", + icon: "📦", + }, + { + name: "urlopen", + icon: "📦", + }, + { + name: "pywebhdfs", + icon: "📦", + }, + { + name: "json2parquet", + icon: "📦", + }, + { + name: "flatten-dict", + icon: "📦", + }, + { + name: "eth-account", + icon: "📦", + }, + { + name: "django-haystack", + icon: "📦", + }, + { + name: "aws-cdk-region-info", + icon: "📦", + }, + { + name: "pooch", + icon: "📦", + }, + { + name: "gax-google-logging-v2", + icon: "📦", + }, + { + name: "requirements-parser", + icon: "📦", + }, + { + name: "gspread-pandas", + icon: "📦", + }, + { + name: "flask-assets", + icon: "📦", + }, + { + name: "hexbytes", + icon: "📦", + }, + { + name: "autograd-gamma", + icon: "📦", + }, + { + name: "aws-cdk-aws-iam", + icon: "📦", + }, + { + name: "ptpython", + icon: "📦", + }, + { + name: "configspace", + icon: "📦", + }, + { + name: "gax-google-pubsub-v1", + icon: "📦", + }, + { + name: "robotframework-selenium2library", + icon: "📦", + }, + { + name: "python-oauth2", + icon: "📦", + }, + { + name: "publication", + icon: "📦", + }, + { + name: "django-coverage-plugin", + icon: "📦", + }, + { + name: "pysmb", + icon: "📦", + }, + { + name: "first", + icon: "📦", + }, + { + name: "yappi", + icon: "📦", + }, + { + name: "google-ads", + icon: "📦", + }, + { + name: "vadersentiment", + icon: "📦", + }, + { + name: "grpcio-status", + icon: "📦", + }, + { + name: "dohq-artifactory", + icon: "📦", + }, + { + name: "pydicom", + icon: "📦", + }, + { + name: "yfinance", + icon: "📦", + }, + { + name: "circuitbreaker", + icon: "📦", + }, + { + name: "aioresponses", + icon: "📦", + }, + { + name: "drf-extensions", + icon: "📦", + }, + { + name: "auditwheel", + icon: "📦", + }, + { + name: "keras2onnx", + icon: "📦", + }, + { + name: "zope-sqlalchemy", + icon: "📦", + }, + { + name: "pyzabbix", + icon: "📦", + }, + { + name: "eth-rlp", + icon: "📦", + }, + { + name: "mkdocs-minify-plugin", + icon: "📦", + }, + { + name: "pytube3", + icon: "📦", + }, + { + name: "eth-keyfile", + icon: "📦", + }, + { + name: "pytest-pep8", + icon: "📦", + }, + { + name: "pyarabic", + icon: "📦", + }, + { + name: "pybtex-docutils", + icon: "📦", + }, + { + name: "m2r", + icon: "📦", + }, + { + name: "eyed3", + icon: "📦", + }, + { + name: "skl2onnx", + icon: "📦", + }, + { + name: "wordsegment", + icon: "📦", + }, + { + name: "heroku3", + icon: "📦", + }, + { + name: "click-repl", + icon: "📦", + }, + { + name: "oset", + icon: "📦", + }, + { + name: "lazy-import", + icon: "📦", + }, + { + name: "omegaconf", + icon: "📦", + }, + { + name: "python-heatclient", + icon: "📦", + }, + { + name: "pyod", + icon: "📦", + }, + { + name: "python-twitter", + icon: "📦", + }, + { + name: "rdflib-jsonld", + icon: "📦", + }, + { + name: "interpret-core", + icon: "📦", + }, + { + name: "readline", + icon: "📦", + }, + { + name: "glom", + icon: "📦", + }, + { + name: "html-telegraph-poster", + icon: "📦", + }, + { + name: "img2pdf", + icon: "📦", + }, + { + name: "jwt", + icon: "📦", + }, + { + name: "log-symbols", + icon: "📦", + }, + { + name: "nosexcover", + icon: "📦", + }, + { + name: "quandl", + icon: "📦", + }, + { + name: "nose-cov", + icon: "📦", + }, + { + name: "aws-cdk-aws-kms", + icon: "📦", + }, + { + name: "twitter", + icon: "📦", + }, + { + name: "fake-factory", + icon: "📦", + }, + { + name: "hmsclient", + icon: "📦", + }, + { + name: "slacker-log-handler", + icon: "📦", + }, + { + name: "bravado", + icon: "📦", + }, + { + name: "flask-limiter", + icon: "📦", + }, + { + name: "face", + icon: "📦", + }, + { + name: "tinyrpc", + icon: "📦", + }, + { + name: "namedlist", + icon: "📦", + }, + { + name: "grpcio-reflection", + icon: "📦", + }, + { + name: "wsgi-request-logger", + icon: "📦", + }, + { + name: "aws-cdk-aws-cloudwatch", + icon: "📦", + }, + { + name: "param", + icon: "📦", + }, + { + name: "injector", + icon: "📦", + }, + { + name: "yamlordereddictloader", + icon: "📦", + }, + { + name: "meson", + icon: "📦", + }, + { + name: "django-auth-ldap", + icon: "📦", + }, + { + name: "aspy-refactor-imports", + icon: "📦", + }, + { + name: "coremltools", + icon: "📦", + }, + { + name: "googledrivedownloader", + icon: "📦", + }, + { + name: "databricks", + icon: "📦", + }, + { + name: "async-lru", + icon: "📦", + }, + { + name: "django-bitfield", + icon: "📦", + }, + { + name: "pyspark-dist-explore", + icon: "📦", + }, + { + name: "av", + icon: "📦", + }, + { + name: "tavern", + icon: "📦", + }, + { + name: "vcsi", + icon: "📦", + }, + { + name: "fastai", + icon: "📦", + }, + { + name: "onnxmltools", + icon: "📦", + }, + { + name: "nose-parameterized", + icon: "📦", + }, + { + name: "aws-cdk-aws-ssm", + icon: "📦", + }, + { + name: "mandrill", + icon: "📦", + }, + { + name: "speaklater", + icon: "📦", + }, + { + name: "halo", + icon: "📦", + }, + { + name: "python-geoip-geolite2", + icon: "📦", + }, + { + name: "coverage-badge", + icon: "📦", + }, + { + name: "artifactory", + icon: "📦", + }, + { + name: "spinners", + icon: "📦", + }, + { + name: "yara-python", + icon: "📦", + }, + { + name: "property-manager", + icon: "📦", + }, + { + name: "scrypt", + icon: "📦", + }, + { + name: "cpplint", + icon: "📦", + }, + { + name: "plaid-python", + icon: "📦", + }, + { + name: "aws-cdk-aws-events", + icon: "📦", + }, + { + name: "evergreen-py", + icon: "📦", + }, + { + name: "wincertstore", + icon: "📦", + }, + { + name: "pytest-socket", + icon: "📦", + }, + { + name: "config", + icon: "📦", + }, + { + name: "comet-ml", + icon: "📦", + }, + { + name: "lightstep", + icon: "📦", + }, + { + name: "ngram", + icon: "📦", + }, + { + name: "aws-cdk-aws-s3", + icon: "📦", + }, + { + name: "drf-writable-nested", + icon: "📦", + }, + { + name: "baselines", + icon: "📦", + }, + { + name: "json2html", + icon: "📦", + }, + { + name: "netmiko", + icon: "📦", + }, + { + name: "django-bootstrap4", + icon: "📦", + }, + { + name: "django-constance", + icon: "📦", + }, + { + name: "ibmdbpy", + icon: "📦", + }, + { + name: "konlpy", + icon: "📦", + }, + { + name: "django-cacheops", + icon: "📦", + }, + { + name: "itopy", + icon: "📦", + }, + { + name: "peppercorn", + icon: "📦", + }, + { + name: "cqlsh", + icon: "📦", + }, + { + name: "vowpalwabbit", + icon: "📦", + }, + { + name: "durationpy", + icon: "📦", + }, + { + name: "persistent", + icon: "📦", + }, + { + name: "scons", + icon: "📦", + }, + { + name: "pytest-freezegun", + icon: "📦", + }, + { + name: "deap", + icon: "📦", + }, + { + name: "wurlitzer", + icon: "📦", + }, + { + name: "concurrent-log-handler", + icon: "📦", + }, + { + name: "python-redis", + icon: "📦", + }, + { + name: "aws-cdk-aws-ec2", + icon: "📦", + }, + { + name: "edgegrid-python", + icon: "📦", + }, + { + name: "aws-cdk-aws-logs", + icon: "📦", + }, + { + name: "pyinstaller-hooks-contrib", + icon: "📦", + }, + { + name: "aws-cdk-assets", + icon: "📦", + }, + { + name: "polling", + icon: "📦", + }, + { + name: "flake8-logging-format", + icon: "📦", + }, + { + name: "bayesian-optimization", + icon: "📦", + }, + { + name: "dbt-core", + icon: "📦", + }, + { + name: "dbfread", + icon: "📦", + }, + { + name: "django-multiselectfield", + icon: "📦", + }, + { + name: "pydruid", + icon: "📦", + }, + { + name: "mkdocs-material-extensions", + icon: "📦", + }, + { + name: "tensorflow-cloud", + icon: "📦", + }, + { + name: "flake8-deprecated", + icon: "📦", + }, + { + name: "kappa", + icon: "📦", + }, + { + name: "aws-cdk-aws-s3-assets", + icon: "📦", + }, + { + name: "aiopg", + icon: "📦", + }, + { + name: "varint", + icon: "📦", + }, + { + name: "flake8-debugger", + icon: "📦", + }, + { + name: "aws-cdk-aws-sqs", + icon: "📦", + }, + { + name: "seqeval", + icon: "📦", + }, + { + name: "django-bootstrap3", + icon: "📦", + }, + { + name: "minimal-snowplow-tracker", + icon: "📦", + }, + { + name: "ipfshttpclient", + icon: "📦", + }, + { + name: "aws-cdk-aws-lambda", + icon: "📦", + }, + { + name: "oslo-db", + icon: "📦", + }, + { + name: "logstash-formatter", + icon: "📦", + }, + { + name: "wmi", + icon: "📦", + }, + { + name: "pygeoip", + icon: "📦", + }, + { + name: "asttokens", + icon: "📦", + }, + { + name: "honcho", + icon: "📦", + }, + { + name: "cron-descriptor", + icon: "📦", + }, + { + name: "sqlalchemy-stubs", + icon: "📦", + }, + { + name: "multiaddr", + icon: "📦", + }, + { + name: "git-lint", + icon: "📦", + }, + { + name: "btrees", + icon: "📦", + }, + { + name: "predicthq", + icon: "📦", + }, + { + name: "combo", + icon: "📦", + }, + { + name: "apache-libcloud", + icon: "📦", + }, + { + name: "intelhex", + icon: "📦", + }, + { + name: "androguard", + icon: "📦", + }, + { + name: "suod", + icon: "📦", + }, + { + name: "memcnn", + icon: "📦", + }, + { + name: "django-sekizai", + icon: "📦", + }, + { + name: "neo4j", + icon: "📦", + }, + { + name: "flake8-tidy-imports", + icon: "📦", + }, + { + name: "pyudev", + icon: "📦", + }, + { + name: "python-coveralls", + icon: "📦", + }, + { + name: "transifex-client", + icon: "📦", + }, + { + name: "hdfs3", + icon: "📦", + }, + { + name: "pygerduty", + icon: "📦", + }, + { + name: "pydeck", + icon: "📦", + }, + { + name: "pyqrcode", + icon: "📦", + }, + { + name: "gsutil", + icon: "📦", + }, + { + name: "emoji-country-flag", + icon: "📦", + }, + { + name: "pybrake", + icon: "📦", + }, + { + name: "pytorch-pretrained-bert", + icon: "📦", + }, + { + name: "bunch", + icon: "📦", + }, + { + name: "graphite-web", + icon: "📦", + }, + { + name: "shrub-py", + icon: "📦", + }, + { + name: "sacrebleu", + icon: "📦", + }, + { + name: "django-pipeline", + icon: "📦", + }, + { + name: "whoosh", + icon: "📦", + }, + { + name: "zappa", + icon: "📦", + }, + { + name: "gpustat", + icon: "📦", + }, + { + name: "django-modeltranslation", + icon: "📦", + }, + { + name: "jsonmerge", + icon: "📦", + }, + { + name: "pathvalidate", + icon: "📦", + }, + { + name: "modernize", + icon: "📦", + }, + { + name: "zenpy", + icon: "📦", + }, + { + name: "logzero", + icon: "📦", + }, + { + name: "mockito", + icon: "📦", + }, + { + name: "codetiming", + icon: "📦", + }, + { + name: "glitch-this", + icon: "📦", + }, + { + name: "ccy", + icon: "📦", + }, + { + name: "oslo-messaging", + icon: "📦", + }, + { + name: "tf-nightly", + icon: "📦", + }, + { + name: "pykmip", + icon: "📦", + }, + { + name: "websocket", + icon: "📦", + }, + { + name: "pip-api", + icon: "📦", + }, + { + name: "debugpy", + icon: "📦", + }, + { + name: "etcd3", + icon: "📦", + }, + { + name: "uritemplate-py", + icon: "📦", + }, + { + name: "aws-cdk-aws-sns", + icon: "📦", + }, + { + name: "twitter-common-collections", + icon: "📦", + }, + { + name: "vtk", + icon: "📦", + }, + { + name: "django-compat", + icon: "📦", + }, + { + name: "gspread-formatting", + icon: "📦", + }, + { + name: "u-msgpack-python", + icon: "📦", + }, + { + name: "oslo-policy", + icon: "📦", + }, + { + name: "constructs", + icon: "📦", + }, + { + name: "pytest-bdd", + icon: "📦", + }, + { + name: "colander", + icon: "📦", + }, + { + name: "testrepository", + icon: "📦", + }, + { + name: "pastescript", + icon: "📦", + }, + { + name: "sms-toolkit", + icon: "📦", + }, + { + name: "itemadapter", + icon: "📦", + }, + { + name: "asyncssh", + icon: "📦", + }, + { + name: "html-testrunner", + icon: "📦", + }, + { + name: "robotremoteserver", + icon: "📦", + }, + { + name: "django-object-actions", + icon: "📦", + }, + { + name: "dynamodb-json", + icon: "📦", + }, + { + name: "graphyte", + icon: "📦", + }, + { + name: "pynput", + icon: "📦", + }, + { + name: "python-designateclient", + icon: "📦", + }, + { + name: "dbt-postgres", + icon: "📦", + }, + { + name: "comet-git-pure", + icon: "📦", + }, + { + name: "python-jsonrpc-server", + icon: "📦", + }, + { + name: "oslo-service", + icon: "📦", + }, + { + name: "kneed", + icon: "📦", + }, + { + name: "autosemver", + icon: "📦", + }, + { + name: "future-fstrings", + icon: "📦", + }, + { + name: "ovs", + icon: "📦", + }, + { + name: "facebookads", + icon: "📦", + }, + { + name: "model-bakery", + icon: "📦", + }, + { + name: "sailthru-client", + icon: "📦", + }, + { + name: "pytest-spark", + icon: "📦", + }, + { + name: "poster", + icon: "📦", + }, + { + name: "asteval", + icon: "📦", + }, + { + name: "interpret-community", + icon: "📦", + }, + { + name: "locust", + icon: "📦", + }, + { + name: "pycron", + icon: "📦", + }, + { + name: "marshmallow-dataclass", + icon: "📦", + }, + { + name: "pygit2", + icon: "📦", + }, + { + name: "assertpy", + icon: "📦", + }, + { + name: "hologram", + icon: "📦", + }, + { + name: "piexif", + icon: "📦", + }, + { + name: "bindep", + icon: "📦", + }, + { + name: "django-log-request-id", + icon: "📦", + }, + { + name: "readchar", + icon: "📦", + }, + { + name: "docx2txt", + icon: "📦", + }, + { + name: "django-admin-sortable2", + icon: "📦", + }, + { + name: "dbt-redshift", + icon: "📦", + }, + { + name: "flask-pymongo", + icon: "📦", + }, + { + name: "cursor", + icon: "📦", + }, + { + name: "tornado-cors", + icon: "📦", + }, + { + name: "google-cloud-iam", + icon: "📦", + }, + { + name: "py2neo", + icon: "📦", + }, + { + name: "concurrentloghandler", + icon: "📦", + }, + { + name: "postal-address", + icon: "📦", + }, + { + name: "ratelimiter", + icon: "📦", + }, + { + name: "twython", + icon: "📦", + }, + { + name: "oslo-middleware", + icon: "📦", + }, + { + name: "flask-rq2", + icon: "📦", + }, + { + name: "viivakoodi", + icon: "📦", + }, + { + name: "sparqlwrapper", + icon: "📦", + }, + { + name: "usps-api", + icon: "📦", + }, + { + name: "aws-cdk-aws-route53", + icon: "📦", + }, + { + name: "blist", + icon: "📦", + }, + { + name: "mitmproxy", + icon: "📦", + }, + { + name: "eradicate", + icon: "📦", + }, + { + name: "dlib", + icon: "📦", + }, + { + name: "aws-cdk-aws-cloudformation", + icon: "📦", + }, + { + name: "pandas-usaddress", + icon: "📦", + }, + { + name: "aws-cdk-aws-certificatemanager", + icon: "📦", + }, + { + name: "antlr4-python2-runtime", + icon: "📦", + }, + { + name: "image", + icon: "📦", + }, + { + name: "ffmpeg", + icon: "📦", + }, + { + name: "tracemoepy", + icon: "📦", + }, + { + name: "reno", + icon: "📦", + }, + { + name: "pytest-faulthandler", + icon: "📦", + }, + { + name: "flask-debugtoolbar", + icon: "📦", + }, + { + name: "logilab-common", + icon: "📦", + }, + { + name: "binpacking", + icon: "📦", + }, + { + name: "pyscaffold", + icon: "📦", + }, + { + name: "ebaysdk", + icon: "📦", + }, + { + name: "functools", + icon: "📦", + }, + { + name: "authy", + icon: "📦", + }, + { + name: "homeassistant", + icon: "📦", + }, + { + name: "times", + icon: "📦", + }, + { + name: "kfp-server-api", + icon: "📦", + }, + { + name: "udatetime", + icon: "📦", + }, + { + name: "pytorch-transformers", + icon: "📦", + }, + { + name: "gputil", + icon: "📦", + }, + { + name: "pyinquirer", + icon: "📦", + }, + { + name: "pytest-profiling", + icon: "📦", + }, + { + name: "imagecodecs", + icon: "📦", + }, + { + name: "hdbcli", + icon: "📦", + }, + { + name: "git-url-parse", + icon: "📦", + }, + { + name: "aws-cdk-aws-autoscaling-common", + icon: "📦", + }, + { + name: "osprofiler", + icon: "📦", + }, + { + name: "typer", + icon: "📦", + }, + { + name: "testcontainers", + icon: "📦", + }, + { + name: "pyldavis", + icon: "📦", + }, + { + name: "python-etcd", + icon: "📦", + }, + { + name: "aadict", + icon: "📦", + }, + { + name: "py-zipkin", + icon: "📦", + }, + { + name: "click-default-group", + icon: "📦", + }, + { + name: "extract-msg", + icon: "📦", + }, + { + name: "pytest-factoryboy", + icon: "📦", + }, + { + name: "aiokafka", + icon: "📦", + }, + { + name: "flask-babelex", + icon: "📦", + }, + { + name: "treeinterpreter", + icon: "📦", + }, + { + name: "aws-cdk-aws-applicationautoscaling", + icon: "📦", + }, + { + name: "aws-cdk-aws-elasticloadbalancingv2", + icon: "📦", + }, + { + name: "svgwrite", + icon: "📦", + }, + { + name: "rarfile", + icon: "📦", + }, + { + name: "atpublic", + icon: "📦", + }, + { + name: "aio-pika", + icon: "📦", + }, + { + name: "compatibility-lib", + icon: "📦", + }, + { + name: "requests-oauth", + icon: "📦", + }, + { + name: "dbt-bigquery", + icon: "📦", + }, + { + name: "scikit-surprise", + icon: "📦", + }, + { + name: "jobspy", + icon: "📦", + }, + { + name: "everett", + icon: "📦", + }, + { + name: "oslo-cache", + icon: "📦", + }, + { + name: "fastdiff", + icon: "📦", + }, + { + name: "python-language-server", + icon: "📦", + }, + { + name: "envparse", + icon: "📦", + }, + { + name: "dirq", + icon: "📦", + }, + { + name: "splinter", + icon: "📦", + }, + { + name: "yacs", + icon: "📦", + }, + { + name: "simple-settings", + icon: "📦", + }, + { + name: "rpqueue", + icon: "📦", + }, + { + name: "django-rq", + icon: "📦", + }, + { + name: "django-tinymce", + icon: "📦", + }, + { + name: "kaitaistruct", + icon: "📦", + }, + { + name: "dbt-snowflake", + icon: "📦", + }, + { + name: "resource", + icon: "📦", + }, + { + name: "jsonsir", + icon: "📦", + }, + { + name: "jsonform", + icon: "📦", + }, + { + name: "mockredispy", + icon: "📦", + }, + { + name: "xml2dict", + icon: "📦", + }, + { + name: "python-easyconfig", + icon: "📦", + }, + { + name: "importlib", + icon: "📦", + }, + { + name: "djangorestframework-filters", + icon: "📦", + }, + { + name: "django-elasticsearch-dsl", + icon: "📦", + }, + { + name: "moderngl", + icon: "📦", + }, + { + name: "mailchimp3", + icon: "📦", + }, + { + name: "rabbitpy", + icon: "📦", + }, + { + name: "keystonemiddleware", + icon: "📦", + }, + { + name: "dbt", + icon: "📦", + }, + { + name: "pyquaternion", + icon: "📦", + }, + { + name: "gin-config", + icon: "📦", + }, + { + name: "attr", + icon: "📦", + }, + { + name: "alpha-vantage", + icon: "📦", + }, + { + name: "keras-mxnet", + icon: "📦", + }, + { + name: "alchemy-mock", + icon: "📦", + }, + { + name: "pycontracts", + icon: "📦", + }, + { + name: "pyshark", + icon: "📦", + }, + { + name: "graphene-sqlalchemy", + icon: "📦", + }, + { + name: "aioboto3", + icon: "📦", + }, + { + name: "aws-cdk-aws-apigateway", + icon: "📦", + }, + { + name: "pandavro", + icon: "📦", + }, + { + name: "strip-hints", + icon: "📦", + }, + { + name: "vistir", + icon: "📦", + }, + { + name: "seleniumbase", + icon: "📦", + }, + { + name: "oss2", + icon: "📦", + }, + { + name: "pytest-lazy-fixture", + icon: "📦", + }, + { + name: "python-louvain", + icon: "📦", + }, + { + name: "pythonnet", + icon: "📦", + }, + { + name: "google-cloud-build", + icon: "📦", + }, + { + name: "keyboard", + icon: "📦", + }, + { + name: "mysql", + icon: "📦", + }, + { + name: "construct", + icon: "📦", + }, + { + name: "pylama", + icon: "📦", + }, + { + name: "replit", + icon: "📦", + }, + { + name: "nose-xunitmp", + icon: "📦", + }, + { + name: "watermark", + icon: "📦", + }, + { + name: "pyviz-comms", + icon: "📦", + }, + { + name: "yamale", + icon: "📦", + }, + { + name: "pyct", + icon: "📦", + }, + { + name: "pyexcel", + icon: "📦", + }, + { + name: "ccxt", + icon: "📦", + }, + { + name: "draftjs-exporter", + icon: "📦", + }, + { + name: "caer", + icon: "📦", + }, + { + name: "dependency-injector", + icon: "📦", + }, + { + name: "google-cloud-redis", + icon: "📦", + }, + { + name: "python-barcode", + icon: "📦", + }, + { + name: "wagtail", + icon: "📦", + }, + { + name: "pycadf", + icon: "📦", + }, + { + name: "pip-shims", + icon: "📦", + }, + { + name: "uncertainties", + icon: "📦", + }, + { + name: "boto3-stubs", + icon: "📦", + }, + { + name: "backports-os", + icon: "📦", + }, + { + name: "pycountry-convert", + icon: "📦", + }, + { + name: "aws-cdk-cloud-assembly-schema", + icon: "📦", + }, + { + name: "nflx-genie-client", + icon: "📦", + }, + { + name: "jsonpath", + icon: "📦", + }, + { + name: "launchdarkly-server-sdk", + icon: "📦", + }, + { + name: "nibabel", + icon: "📦", + }, + { + name: "titlecase", + icon: "📦", + }, + { + name: "pytorch-lightning", + icon: "📦", + }, + { + name: "djangorestframework-stubs", + icon: "📦", + }, + { + name: "py-vapid", + icon: "📦", + }, + { + name: "tbb", + icon: "📦", + }, + { + name: "questionary", + icon: "📦", + }, + { + name: "aiohttp-jinja2", + icon: "📦", + }, + { + name: "holoviews", + icon: "📦", + }, + { + name: "aws-cdk-aws-sns-subscriptions", + icon: "📦", + }, + { + name: "simple-crypt", + icon: "📦", + }, + { + name: "tabulator", + icon: "📦", + }, + { + name: "django-modelcluster", + icon: "📦", + }, + { + name: "plette", + icon: "📦", + }, + { + name: "sqlitedict", + icon: "📦", + }, + { + name: "djangorestframework-xml", + icon: "📦", + }, + { + name: "flake8-class-newline", + icon: "📦", + }, + { + name: "yarn-api-client", + icon: "📦", + }, + { + name: "vcversioner", + icon: "📦", + }, + { + name: "python-barbicanclient", + icon: "📦", + }, + { + name: "js2py", + icon: "📦", + }, + { + name: "yoyo-migrations", + icon: "📦", + }, + { + name: "pager", + icon: "📦", + }, + { + name: "pytricia", + icon: "📦", + }, + { + name: "jsbeautifier", + icon: "📦", + }, + { + name: "glmnet-py", + icon: "📦", + }, + { + name: "pockets", + icon: "📦", + }, + { + name: "pgeocode", + icon: "📦", + }, + { + name: "pycld2", + icon: "📦", + }, + { + name: "opencensus-ext-zipkin", + icon: "📦", + }, + { + name: "quinn", + icon: "📦", + }, + { + name: "colcon-core", + icon: "📦", + }, + { + name: "paypalrestsdk", + icon: "📦", + }, + { + name: "aws-cdk-aws-elasticloadbalancing", + icon: "📦", + }, + { + name: "www-authenticate", + icon: "📦", + }, + { + name: "requirementslib", + icon: "📦", + }, + { + name: "tika", + icon: "📦", + }, + { + name: "cli-helpers", + icon: "📦", + }, + { + name: "hashin", + icon: "📦", + }, + { + name: "ansi2html", + icon: "📦", + }, + { + name: "lyricwikia", + icon: "📦", + }, + { + name: "aws-cdk-aws-cloudfront", + icon: "📦", + }, + { + name: "django-annoying", + icon: "📦", + }, + { + name: "os-testr", + icon: "📦", + }, + { + name: "pyexasol", + icon: "📦", + }, + { + name: "aliyun-python-sdk-kms", + icon: "📦", + }, + { + name: "linear-tsv", + icon: "📦", + }, + { + name: "stop-words", + icon: "📦", + }, + { + name: "flake8-eradicate", + icon: "📦", + }, + { + name: "gnureadline", + icon: "📦", + }, + { + name: "google-cloud-datacatalog", + icon: "📦", + }, + { + name: "jsons", + icon: "📦", + }, + { + name: "publicsuffixlist", + icon: "📦", + }, + { + name: "flake8-string-format", + icon: "📦", + }, + { + name: "unipath", + icon: "📦", + }, + { + name: "python-arango", + icon: "📦", + }, + { + name: "py-zabbix", + icon: "📦", + }, + { + name: "shade", + icon: "📦", + }, + { + name: "willow", + icon: "📦", + }, + { + name: "aws-cdk-aws-secretsmanager", + icon: "📦", + }, + { + name: "python-status", + icon: "📦", + }, + { + name: "flake8-black", + icon: "📦", + }, + { + name: "daemoniker", + icon: "📦", + }, + { + name: "stldecompose", + icon: "📦", + }, + { + name: "flask-cache", + icon: "📦", + }, + { + name: "pysolr", + icon: "📦", + }, + { + name: "pyftpdlib", + icon: "📦", + }, + { + name: "pykube-ng", + icon: "📦", + }, + { + name: "zipcodes", + icon: "📦", + }, + { + name: "wxpython", + icon: "📦", + }, + { + name: "libhoney", + icon: "📦", + }, + { + name: "password", + icon: "📦", + }, + { + name: "nteract-scrapbook", + icon: "📦", + }, + { + name: "blindspin", + icon: "📦", + }, + { + name: "flake8-mutable", + icon: "📦", + }, + { + name: "aws-cdk-aws-autoscaling", + icon: "📦", + }, + { + name: "django-autoslug", + icon: "📦", + }, + { + name: "libvirt-python", + icon: "📦", + }, + { + name: "zdesk", + icon: "📦", + }, + { + name: "protorpc", + icon: "📦", + }, + { + name: "azure-storage-logging", + icon: "📦", + }, + { + name: "exchangelib", + icon: "📦", + }, + { + name: "pydot2", + icon: "📦", + }, + { + name: "gender-guesser", + icon: "📦", + }, + { + name: "aws-cdk-aws-route53-targets", + icon: "📦", + }, + { + name: "colcon-python-setup-py", + icon: "📦", + }, + { + name: "speedtest-cli", + icon: "📦", + }, + { + name: "ffmpy", + icon: "📦", + }, + { + name: "oslo-upgradecheck", + icon: "📦", + }, + { + name: "cloudscraper", + icon: "📦", + }, + { + name: "multitasking", + icon: "📦", + }, + { + name: "aws-cdk-aws-ecr", + icon: "📦", + }, + { + name: "itemloaders", + icon: "📦", + }, + { + name: "priority", + icon: "📦", + }, + { + name: "formencode", + icon: "📦", + }, + { + name: "pytest-json-report", + icon: "📦", + }, + { + name: "django-configurations", + icon: "📦", + }, + { + name: "pygraphviz", + icon: "📦", + }, + { + name: "docx", + icon: "📦", + }, + { + name: "checksumdir", + icon: "📦", + }, + { + name: "couchbase", + icon: "📦", + }, + { + name: "ansible-runner", + icon: "📦", + }, + { + name: "colcon-test-result", + icon: "📦", + }, + { + name: "pyclipper", + icon: "📦", + }, + { + name: "doc8", + icon: "📦", + }, + { + name: "py2-ipaddress", + icon: "📦", + }, + { + name: "python-jose-cryptodome", + icon: "📦", + }, + { + name: "fastentrypoints", + icon: "📦", + }, + { + name: "sphinxcontrib-napoleon", + icon: "📦", + }, + { + name: "publicsuffix2", + icon: "📦", + }, + { + name: "aws-cdk-aws-ecr-assets", + icon: "📦", + }, + { + name: "python-nmap", + icon: "📦", + }, + { + name: "efficientnet", + icon: "📦", + }, + { + name: "editorconfig", + icon: "📦", + }, + { + name: "azure-mgmt-documentdb", + icon: "📦", + }, + { + name: "ruptures", + icon: "📦", + }, + { + name: "uwsgitop", + icon: "📦", + }, + { + name: "rapidfuzz", + icon: "📦", + }, + { + name: "artifacts-keyring", + icon: "📦", + }, + { + name: "htmlparser", + icon: "📦", + }, + { + name: "atlassian-python-api", + icon: "📦", + }, + { + name: "prov", + icon: "📦", + }, + { + name: "colcon-cmake", + icon: "📦", + }, + { + name: "flask-security", + icon: "📦", + }, + { + name: "django-cors-middleware", + icon: "📦", + }, + { + name: "django-two-factor-auth", + icon: "📦", + }, + { + name: "python-monkey-business", + icon: "📦", + }, + { + name: "qualname", + icon: "📦", + }, + { + name: "algoliasearch", + icon: "📦", + }, + { + name: "jax", + icon: "📦", + }, + { + name: "pyexcel-xlsx", + icon: "📦", + }, + { + name: "colcon-ros", + icon: "📦", + }, + { + name: "sklearn-crfsuite", + icon: "📦", + }, + { + name: "aiohttp-session", + icon: "📦", + }, + { + name: "gdata", + icon: "📦", + }, + { + name: "pysha3", + icon: "📦", + }, + { + name: "iso4217", + icon: "📦", + }, + { + name: "aws-cdk-aws-sam", + icon: "📦", + }, + { + name: "plyfile", + icon: "📦", + }, + { + name: "openml", + icon: "📦", + }, + { + name: "discord-webhook", + icon: "📦", + }, + { + name: "django-json-widget", + icon: "📦", + }, + { + name: "inquirer", + icon: "📦", + }, + { + name: "pilkit", + icon: "📦", + }, + { + name: "flake8-bandit", + icon: "📦", + }, + { + name: "crc32c", + icon: "📦", + }, + { + name: "aiormq", + icon: "📦", + }, + { + name: "redlock-py", + icon: "📦", + }, + { + name: "eeweather", + icon: "📦", + }, + { + name: "oslo-reports", + icon: "📦", + }, + { + name: "pyminizip", + icon: "📦", + }, + { + name: "django-statsd-mozilla", + icon: "📦", + }, + { + name: "aws-cdk-aws-ecs", + icon: "📦", + }, + { + name: "kfp", + icon: "📦", + }, + { + name: "aws-cdk-aws-servicediscovery", + icon: "📦", + }, + { + name: "http-ece", + icon: "📦", + }, + { + name: "dotmap", + icon: "📦", + }, + { + name: "django-jenkins", + icon: "📦", + }, + { + name: "aws-cdk-aws-autoscaling-hooktargets", + icon: "📦", + }, + { + name: "chalice", + icon: "📦", + }, + { + name: "disklist", + icon: "📦", + }, + { + name: "lizard", + icon: "📦", + }, + { + name: "mirakuru", + icon: "📦", + }, + { + name: "colcon-recursive-crawl", + icon: "📦", + }, + { + name: "glances", + icon: "📦", + }, + { + name: "doublemetaphone", + icon: "📦", + }, + { + name: "waiting", + icon: "📦", + }, + { + name: "typepy", + icon: "📦", + }, + { + name: "simple-rest-client", + icon: "📦", + }, + { + name: "colcon-library-path", + icon: "📦", + }, + { + name: "mbstrdecoder", + icon: "📦", + }, + { + name: "dnslib", + icon: "📦", + }, + { + name: "colcon-pkg-config", + icon: "📦", + }, + { + name: "twitter-common-confluence", + icon: "📦", + }, + { + name: "workflow", + icon: "📦", + }, + { + name: "sudachipy", + icon: "📦", + }, + { + name: "pyhdb", + icon: "📦", + }, + { + name: "dataset", + icon: "📦", + }, + { + name: "faiss-cpu", + icon: "📦", + }, + { + name: "honeycomb-beeline", + icon: "📦", + }, + { + name: "django-nested-admin", + icon: "📦", + }, + { + name: "featuretools", + icon: "📦", + }, + { + name: "funcparserlib", + icon: "📦", + }, + { + name: "bitstruct", + icon: "📦", + }, + { + name: "pprint", + icon: "📦", + }, + { + name: "smartsheet-python-sdk", + icon: "📦", + }, + { + name: "airtable-python-wrapper", + icon: "📦", + }, + { + name: "robotframework-pabot", + icon: "📦", + }, + { + name: "wptools", + icon: "📦", + }, + { + name: "oslo-versionedobjects", + icon: "📦", + }, + { + name: "azure-mgmt-servermanager", + icon: "📦", + }, + { + name: "dj-static", + icon: "📦", + }, + { + name: "flake8-colors", + icon: "📦", + }, + { + name: "neo4j-driver", + icon: "📦", + }, + { + name: "fissix", + icon: "📦", + }, + { + name: "django-imagekit", + icon: "📦", + }, + { + name: "xdg", + icon: "📦", + }, + { + name: "pyunpack", + icon: "📦", + }, + { + name: "automaton", + icon: "📦", + }, + { + name: "func-timeout", + icon: "📦", + }, + { + name: "iso-639", + icon: "📦", + }, + { + name: "s3io", + icon: "📦", + }, + { + name: "pyicu", + icon: "📦", + }, + { + name: "winkerberos", + icon: "📦", + }, + { + name: "pyopengl", + icon: "📦", + }, + { + name: "junitxml", + icon: "📦", + }, + { + name: "web-py", + icon: "📦", + }, + { + name: "kedro", + icon: "📦", + }, + { + name: "google-cloud-asset", + icon: "📦", + }, + { + name: "jupyterlab-launcher", + icon: "📦", + }, + { + name: "django-extra-fields", + icon: "📦", + }, + { + name: "django-mathfilters", + icon: "📦", + }, + { + name: "pytelegrambotapi", + icon: "📦", + }, + { + name: "azureml", + icon: "📦", + }, + { + name: "pytest-testmon", + icon: "📦", + }, + { + name: "django-recaptcha", + icon: "📦", + }, + { + name: "py7zr", + icon: "📦", + }, + { + name: "xlutils", + icon: "📦", + }, + { + name: "osmium", + icon: "📦", + }, + { + name: "pantsbuild-pants", + icon: "📦", + }, + { + name: "sfmergeutility", + icon: "📦", + }, + { + name: "opencv-contrib-python-headless", + icon: "📦", + }, + { + name: "unidiff", + icon: "📦", + }, + { + name: "aws-cdk-aws-stepfunctions", + icon: "📦", + }, + { + name: "gapic-google-cloud-spanner-v1", + icon: "📦", + }, + { + name: "gapic-google-cloud-spanner-admin-instance-v1", + icon: "📦", + }, + { + name: "flask-swagger-ui", + icon: "📦", + }, + { + name: "sphinx-copybutton", + icon: "📦", + }, + { + name: "proto-google-cloud-spanner-v1", + icon: "📦", + }, + { + name: "aws", + icon: "📦", + }, + { + name: "gapic-google-cloud-spanner-admin-database-v1", + icon: "📦", + }, + { + name: "datarobot", + icon: "📦", + }, + { + name: "proto-google-cloud-spanner-admin-instance-v1", + icon: "📦", + }, + { + name: "cql", + icon: "📦", + }, + { + name: "proto-google-cloud-spanner-admin-database-v1", + icon: "📦", + }, + { + name: "readability-lxml", + icon: "📦", + }, + { + name: "sphinx-argparse", + icon: "📦", + }, + { + name: "rules", + icon: "📦", + }, + { + name: "python2-secrets", + icon: "📦", + }, + { + name: "ibm-db", + icon: "📦", + }, + { + name: "python-magnumclient", + icon: "📦", + }, + { + name: "office365-rest-python-client", + icon: "📦", + }, + { + name: "hachoir", + icon: "📦", + }, + { + name: "async-exit-stack", + icon: "📦", + }, + { + name: "win-inet-pton", + icon: "📦", + }, + { + name: "sfx-jaeger-client", + icon: "📦", + }, + { + name: "yarg", + icon: "📦", + }, + { + name: "django-hijack", + icon: "📦", + }, + { + name: "unicorn", + icon: "📦", + }, + { + name: "teradatasql", + icon: "📦", + }, + { + name: "pdpyras", + icon: "📦", + }, + { + name: "pyprind", + icon: "📦", + }, + { + name: "metaphone", + icon: "📦", + }, + { + name: "jproperties", + icon: "📦", + }, + { + name: "sfctl", + icon: "📦", + }, + { + name: "setuptools-scm-git-archive", + icon: "📦", + }, + { + name: "pytrends", + icon: "📦", + }, + { + name: "python-ironicclient", + icon: "📦", + }, + { + name: "ibm-db-sa", + icon: "📦", + }, + { + name: "docstring-parser", + icon: "📦", + }, + { + name: "py-dateutil", + icon: "📦", + }, + { + name: "conllu", + icon: "📦", + }, + { + name: "pyramid-tm", + icon: "📦", + }, + { + name: "django-money", + icon: "📦", + }, + { + name: "bowler", + icon: "📦", + }, + { + name: "flufl-lock", + icon: "📦", + }, + { + name: "aws-cdk-custom-resources", + icon: "📦", + }, + { + name: "pyroma", + icon: "📦", + }, + { + name: "colcon-output", + icon: "📦", + }, + { + name: "colcon-package-information", + icon: "📦", + }, + { + name: "colcon-metadata", + icon: "📦", + }, + { + name: "colcon-defaults", + icon: "📦", + }, + { + name: "monthdelta", + icon: "📦", + }, + { + name: "colcon-package-selection", + icon: "📦", + }, + { + name: "opentracing-instrumentation", + icon: "📦", + }, + { + name: "polygon-geohasher", + icon: "📦", + }, + { + name: "paver", + icon: "📦", + }, + { + name: "django-fernet-fields", + icon: "📦", + }, + { + name: "trimesh", + icon: "📦", + }, + { + name: "json-encoder", + icon: "📦", + }, + { + name: "avalara", + icon: "📦", + }, + { + name: "colcon-powershell", + icon: "📦", + }, + { + name: "netdisco", + icon: "📦", + }, + { + name: "colcon-parallel-executor", + icon: "📦", + }, + { + name: "untangle", + icon: "📦", + }, + { + name: "django-enumfields", + icon: "📦", + }, + { + name: "colcon-mixin", + icon: "📦", + }, + { + name: "django-jinja", + icon: "📦", + }, + { + name: "libusb1", + icon: "📦", + }, + { + name: "breathe", + icon: "📦", + }, + { + name: "pecan", + icon: "📦", + }, + { + name: "lmfit", + icon: "📦", + }, + { + name: "zope-index", + icon: "📦", + }, + { + name: "oslo-rootwrap", + icon: "📦", + }, + { + name: "untokenize", + icon: "📦", + }, + { + name: "munkres", + icon: "📦", + }, + { + name: "flake8-per-file-ignores", + icon: "📦", + }, + { + name: "django-watchman", + icon: "📦", + }, + { + name: "dpkt", + icon: "📦", + }, + { + name: "pykcs11", + icon: "📦", + }, + { + name: "marshmallow-objects", + icon: "📦", + }, + { + name: "colcon-bash", + icon: "📦", + }, + { + name: "plyvel", + icon: "📦", + }, + { + name: "ifcfg", + icon: "📦", + }, + { + name: "static3", + icon: "📦", + }, + { + name: "contextdecorator", + icon: "📦", + }, + { + name: "pyzbar", + icon: "📦", + }, + { + name: "mujoco-py", + icon: "📦", + }, + { + name: "ocspbuilder", + icon: "📦", + }, + { + name: "bintrees", + icon: "📦", + }, + { + name: "uplink", + icon: "📦", + }, + { + name: "ropgadget", + icon: "📦", + }, + { + name: "flask-redis", + icon: "📦", + }, + { + name: "sparkmeasure", + icon: "📦", + }, + { + name: "colcon-notification", + icon: "📦", + }, + { + name: "kmodes", + icon: "📦", + }, + { + name: "colcon-common-extensions", + icon: "📦", + }, + { + name: "djoser", + icon: "📦", + }, + { + name: "ocspresponder", + icon: "📦", + }, + { + name: "ibm-cloud-sdk-core", + icon: "📦", + }, + { + name: "colcon-devtools", + icon: "📦", + }, + { + name: "pyhumps", + icon: "📦", + }, + { + name: "pathmatch", + icon: "📦", + }, + { + name: "tfds-nightly", + icon: "📦", + }, + { + name: "pymodbus", + icon: "📦", + }, + { + name: "goslate", + icon: "📦", + }, + { + name: "ldapdomaindump", + icon: "📦", + }, + { + name: "magicinvoke", + icon: "📦", + }, + { + name: "cachepath", + icon: "📦", + }, + { + name: "flatdict", + icon: "📦", + }, + { + name: "sanic-cors", + icon: "📦", + }, + { + name: "awesome-slugify", + icon: "📦", + }, + { + name: "python-binary-memcached", + icon: "📦", + }, + { + name: "oslo-privsep", + icon: "📦", + }, + { + name: "graphene-file-upload", + icon: "📦", + }, + { + name: "lupa", + icon: "📦", + }, + { + name: "weakrefmethod", + icon: "📦", + }, + { + name: "pyqtwebengine", + icon: "📦", + }, + { + name: "hass-nabucasa", + icon: "📦", + }, + { + name: "flask-mongoengine", + icon: "📦", + }, + { + name: "dash-bootstrap-components", + icon: "📦", + }, + { + name: "djangorestframework-bulk", + icon: "📦", + }, + { + name: "aws-cdk-aws-codecommit", + icon: "📦", + }, + { + name: "aws-parallelcluster-node", + icon: "📦", + }, + { + name: "pipreqs", + icon: "📦", + }, + { + name: "py-mini-racer", + icon: "📦", + }, + { + name: "localstack-client", + icon: "📦", + }, + { + name: "pbkdf2", + icon: "📦", + }, + { + name: "pytest-parallel", + icon: "📦", + }, + { + name: "aws-cdk-aws-codebuild", + icon: "📦", + }, + { + name: "roman", + icon: "📦", + }, + { + name: "bagit", + icon: "📦", + }, + { + name: "plotly-express", + icon: "📦", + }, + { + name: "tensorflowjs", + icon: "📦", + }, + { + name: "nbstripout", + icon: "📦", + }, + { + name: "moment", + icon: "📦", + }, + { + name: "albumentations", + icon: "📦", + }, + { + name: "awslogs", + icon: "📦", + }, + { + name: "sanic-plugins-framework", + icon: "📦", + }, + { + name: "swifter", + icon: "📦", + }, + { + name: "singleton-decorator", + icon: "📦", + }, + { + name: "django-ordered-model", + icon: "📦", + }, + { + name: "django-ajax-selects", + icon: "📦", + }, + { + name: "colcon-cd", + icon: "📦", + }, + { + name: "zxcvbn", + icon: "📦", + }, + { + name: "mimerender", + icon: "📦", + }, + { + name: "pytype", + icon: "📦", + }, + { + name: "forex-python", + icon: "📦", + }, + { + name: "panel", + icon: "📦", + }, + { + name: "hexdump", + icon: "📦", + }, + { + name: "cybox", + icon: "📦", + }, + { + name: "pylint-quotes", + icon: "📦", + }, + { + name: "cssmin", + icon: "📦", + }, + { + name: "google-cloud-scheduler", + icon: "📦", + }, + { + name: "pyowm", + icon: "📦", + }, + { + name: "sounddevice", + icon: "📦", + }, + { + name: "posix-ipc", + icon: "📦", + }, + { + name: "twitter-ads", + icon: "📦", + }, + { + name: "pytest-subtests", + icon: "📦", + }, + { + name: "pyjsparser", + icon: "📦", + }, + { + name: "xattr", + icon: "📦", + }, + { + name: "stix", + icon: "📦", + }, + { + name: "nlp", + icon: "📦", + }, + { + name: "shutilwhich", + icon: "📦", + }, + { + name: "tf-slim", + icon: "📦", + }, + { + name: "factor-analyzer", + icon: "📦", + }, + { + name: "bbcode", + icon: "📦", + }, + { + name: "gcovr", + icon: "📦", + }, + { + name: "colcon-lcov-result", + icon: "📦", + }, + { + name: "django-solo", + icon: "📦", + }, + { + name: "pyjq", + icon: "📦", + }, + { + name: "python-intercom", + icon: "📦", + }, + { + name: "simplekml", + icon: "📦", + }, + { + name: "jaconv", + icon: "📦", + }, + { + name: "uhashring", + icon: "📦", + }, + { + name: "import-from-github-com", + icon: "📦", + }, + { + name: "django-select2", + icon: "📦", + }, + { + name: "datadog-checks-base", + icon: "📦", + }, + { + name: "mixbox", + icon: "📦", + }, + { + name: "googleappenginecloudstorageclient", + icon: "📦", + }, + { + name: "tooz", + icon: "📦", + }, + { + name: "os-traits", + icon: "📦", + }, + { + name: "codacy-coverage", + icon: "📦", + }, + { + name: "paretochart", + icon: "📦", + }, + { + name: "petname", + icon: "📦", + }, + { + name: "diamond", + icon: "📦", + }, + { + name: "djangorestframework-gis", + icon: "📦", + }, + { + name: "django-bootstrap-form", + icon: "📦", + }, + { + name: "wirerope", + icon: "📦", + }, + { + name: "sentence-transformers", + icon: "📦", + }, + { + name: "allure-behave", + icon: "📦", + }, + { + name: "hubspot3", + icon: "📦", + }, + { + name: "browsermob-proxy", + icon: "📦", + }, + { + name: "python-dynamodb-lock", + icon: "📦", + }, + { + name: "pyxb", + icon: "📦", + }, + { + name: "instantmusic", + icon: "📦", + }, + { + name: "fcm-django", + icon: "📦", + }, + { + name: "textract", + icon: "📦", + }, + { + name: "contractions", + icon: "📦", + }, + { + name: "aws-cdk-aws-codepipeline", + icon: "📦", + }, + { + name: "pyramid-mako", + icon: "📦", + }, + { + name: "datacompy", + icon: "📦", + }, + { + name: "yellowbrick", + icon: "📦", + }, + { + name: "pybreaker", + icon: "📦", + }, + { + name: "fuzzy", + icon: "📦", + }, + { + name: "ariadne", + icon: "📦", + }, + { + name: "anybadge", + icon: "📦", + }, + { + name: "django-sslserver", + icon: "📦", + }, + { + name: "neutron-lib", + icon: "📦", + }, + { + name: "pip-licenses", + icon: "📦", + }, + { + name: "ovsdbapp", + icon: "📦", + }, + { + name: "pykafka", + icon: "📦", + }, + { + name: "tableschema", + icon: "📦", + }, + { + name: "ez-setup", + icon: "📦", + }, + { + name: "handyspark", + icon: "📦", + }, + { + name: "python-can", + icon: "📦", + }, + { + name: "schema-salad", + icon: "📦", + }, + { + name: "supermercado", + icon: "📦", + }, + { + name: "cwltool", + icon: "📦", + }, + { + name: "pdpbox", + icon: "📦", + }, + { + name: "ikp3db", + icon: "📦", + }, + { + name: "cronex", + icon: "📦", + }, + { + name: "taskflow", + icon: "📦", + }, + { + name: "scikit-plot", + icon: "📦", + }, + { + name: "requests-aws-sign", + icon: "📦", + }, + { + name: "geog", + icon: "📦", + }, + { + name: "celery-redbeat", + icon: "📦", + }, + { + name: "aws-cdk-aws-events-targets", + icon: "📦", + }, + { + name: "datetime-truncate", + icon: "📦", + }, + { + name: "simplekv", + icon: "📦", + }, + { + name: "nose-progressive", + icon: "📦", + }, + { + name: "colorcet", + icon: "📦", + }, + { + name: "distribute", + icon: "📦", + }, + { + name: "castellan", + icon: "📦", + }, + { + name: "warrant", + icon: "📦", + }, + { + name: "pyinstrument-cext", + icon: "📦", + }, + { + name: "callee", + icon: "📦", + }, + { + name: "jupytext", + icon: "📦", + }, + { + name: "cloudinary", + icon: "📦", + }, + { + name: "mixer", + icon: "📦", + }, + { + name: "tinys3", + icon: "📦", + }, + { + name: "importlab", + icon: "📦", + }, + { + name: "kivy", + icon: "📦", + }, + { + name: "dask-ml", + icon: "📦", + }, + { + name: "os-vif", + icon: "📦", + }, + { + name: "pymisp", + icon: "📦", + }, + { + name: "ebooklib", + icon: "📦", + }, + { + name: "guppy3", + icon: "📦", + }, + { + name: "tendo", + icon: "📦", + }, + { + name: "pyculiar", + icon: "📦", + }, + { + name: "open3d-python", + icon: "📦", + }, + { + name: "python-keycloak", + icon: "📦", + }, + { + name: "hypercorn", + icon: "📦", + }, + { + name: "sqlalchemy-continuum", + icon: "📦", + }, + { + name: "trollius", + icon: "📦", + }, + { + name: "treq", + icon: "📦", + }, + { + name: "ara", + icon: "📦", + }, + { + name: "rocketchat-api", + icon: "📦", + }, + { + name: "hpsklearn", + icon: "📦", + }, + { + name: "envtpl", + icon: "📦", + }, + { + name: "traitsui", + icon: "📦", + }, + { + name: "pytest-vcr", + icon: "📦", + }, + { + name: "codespell", + icon: "📦", + }, + { + name: "fastcache", + icon: "📦", + }, + { + name: "jieba3k", + icon: "📦", + }, + { + name: "matplotlib-venn", + icon: "📦", + }, + { + name: "chameleon", + icon: "📦", + }, + { + name: "colcon-zsh", + icon: "📦", + }, + { + name: "yolk3k", + icon: "📦", + }, + { + name: "dataproperty", + icon: "📦", + }, + { + name: "smdebug", + icon: "📦", + }, + { + name: "django-crum", + icon: "📦", + }, + { + name: "systemd-python", + icon: "📦", + }, + { + name: "torchfile", + icon: "📦", + }, + { + name: "business-duration", + icon: "📦", + }, + { + name: "affinegap", + icon: "📦", + }, + { + name: "timeago", + icon: "📦", + }, + { + name: "parquet", + icon: "📦", + }, + { + name: "pykalman", + icon: "📦", + }, + { + name: "django-test-without-migrations", + icon: "📦", + }, + { + name: "sauceclient", + icon: "📦", + }, + { + name: "requests-opentracing", + icon: "📦", + }, + { + name: "django-statici18n", + icon: "📦", + }, + { + name: "dnspython3", + icon: "📦", + }, + { + name: "anaconda", + icon: "📦", + }, + { + name: "gxformat2", + icon: "📦", + }, + { + name: "traittypes", + icon: "📦", + }, + { + name: "pychromecast", + icon: "📦", + }, + { + name: "datefinder", + icon: "📦", + }, + { + name: "curtsies", + icon: "📦", + }, + { + name: "scrapy-crawlera", + icon: "📦", + }, + { + name: "pydriller", + icon: "📦", + }, + { + name: "traces", + icon: "📦", + }, + { + name: "gluonnlp", + icon: "📦", + }, + { + name: "html", + icon: "📦", + }, + { + name: "flask-shell-ipython", + icon: "📦", + }, + { + name: "notify2", + icon: "📦", + }, + { + name: "dm-xmlsec-binding", + icon: "📦", + }, + { + name: "tesserocr", + icon: "📦", + }, + { + name: "pydevd-pycharm", + icon: "📦", + }, + { + name: "edx-opaque-keys", + icon: "📦", + }, + { + name: "os-win", + icon: "📦", + }, + { + name: "pytest-localserver", + icon: "📦", + }, + { + name: "python-igraph", + icon: "📦", + }, + { + name: "pytest-testrail", + icon: "📦", + }, + { + name: "azureml-interpret", + icon: "📦", + }, + { + name: "docxtpl", + icon: "📦", + }, + { + name: "email-reply-parser", + icon: "📦", + }, + { + name: "paramiko-expect", + icon: "📦", + }, + { + name: "djangocms-admin-style", + icon: "📦", + }, + { + name: "collectfast", + icon: "📦", + }, + { + name: "django-filer", + icon: "📦", + }, + { + name: "visdom", + icon: "📦", + }, + { + name: "towncrier", + icon: "📦", + }, + { + name: "qgrid", + icon: "📦", + }, + { + name: "dvc", + icon: "📦", + }, + { + name: "csvkit", + icon: "📦", + }, + { + name: "offspring", + icon: "📦", + }, + { + name: "colcon-argcomplete", + icon: "📦", + }, + { + name: "xstatic-bootstrap-scss", + icon: "📦", + }, + { + name: "pyobjc-framework-cocoa", + icon: "📦", + }, + { + name: "snitun", + icon: "📦", + }, + { + name: "sparse-dot-topn", + icon: "📦", + }, + { + name: "urlparse3", + icon: "📦", + }, + { + name: "sparkpost", + icon: "📦", + }, + { + name: "jq", + icon: "📦", + }, + { + name: "smtpapi", + icon: "📦", + }, + { + name: "stem", + icon: "📦", + }, + { + name: "df2gspread", + icon: "📦", + }, + { + name: "serpy", + icon: "📦", + }, + { + name: "shippo", + icon: "📦", + }, + { + name: "rq-dashboard", + icon: "📦", + }, + { + name: "slack-webhook", + icon: "📦", + }, + { + name: "python-debian", + icon: "📦", + }, + { + name: "aws-cdk-aws-batch", + icon: "📦", + }, + { + name: "ndjson", + icon: "📦", + }, + { + name: "django-graphql-jwt", + icon: "📦", + }, + { + name: "logger", + icon: "📦", + }, + { + name: "pysolar", + icon: "📦", + }, + { + name: "ipwhois", + icon: "📦", + }, + { + name: "google-endpoints-api-management", + icon: "📦", + }, + { + name: "sphinx-gallery", + icon: "📦", + }, + { + name: "oci-cli", + icon: "📦", + }, + { + name: "ansible-vault", + icon: "📦", + }, + { + name: "gherkin-official", + icon: "📦", + }, + { + name: "pep562", + icon: "📦", + }, + { + name: "grandalf", + icon: "📦", + }, + { + name: "methodtools", + icon: "📦", + }, + { + name: "pycognito", + icon: "📦", + }, + { + name: "impacket", + icon: "📦", + }, + { + name: "drf-jwt", + icon: "📦", + }, + { + name: "pynvim", + icon: "📦", + }, + { + name: "xstatic-jquery", + icon: "📦", + }, + { + name: "pytest-test-groups", + icon: "📦", + }, + { + name: "o365", + icon: "📦", + }, + { + name: "pyang", + icon: "📦", + }, + { + name: "pyxdameraulevenshtein", + icon: "📦", + }, + { + name: "hydra-core", + icon: "📦", + }, + { + name: "flake8-mypy", + icon: "📦", + }, + { + name: "keras-self-attention", + icon: "📦", + }, + { + name: "pymupdf", + icon: "📦", + }, + { + name: "google-cloud-securitycenter", + icon: "📦", + }, + { + name: "bigquery-schema-generator", + icon: "📦", + }, + { + name: "django-templated-mail", + icon: "📦", + }, + { + name: "scrapy-fake-useragent", + icon: "📦", + }, + { + name: "flask-sslify", + icon: "📦", + }, + { + name: "firebirdsql", + icon: "📦", + }, + { + name: "trueskill", + icon: "📦", + }, + { + name: "optimizely-sdk", + icon: "📦", + }, + { + name: "kitchen", + icon: "📦", + }, + { + name: "pytest-github-actions-annotate-failures", + icon: "📦", + }, + { + name: "pdftotext", + icon: "📦", + }, + { + name: "edx-drf-extensions", + icon: "📦", + }, + { + name: "os-brick", + icon: "📦", + }, + { + name: "mapbox-vector-tile", + icon: "📦", + }, + { + name: "python-statsd", + icon: "📦", + }, + { + name: "xstatic", + icon: "📦", + }, + { + name: "conan-package-tools", + icon: "📦", + }, + { + name: "mesh-tensorflow", + icon: "📦", + }, + { + name: "cloudml-hypertune", + icon: "📦", + }, + { + name: "nanotime", + icon: "📦", + }, + { + name: "win-unicode-console", + icon: "📦", + }, + { + name: "alexapy", + icon: "📦", + }, + { + name: "pyramid-debugtoolbar", + icon: "📦", + }, + { + name: "ulid-py", + icon: "📦", + }, + { + name: "django-dotenv", + icon: "📦", + }, + { + name: "georaptor", + icon: "📦", + }, + { + name: "wtforms-json", + icon: "📦", + }, + { + name: "os-ken", + icon: "📦", + }, + { + name: "cbor", + icon: "📦", + }, + { + name: "google-endpoints", + icon: "📦", + }, + { + name: "dbnd", + icon: "📦", + }, + { + name: "gdal", + icon: "📦", + }, + { + name: "aiosqlite", + icon: "📦", + }, + { + name: "django-extra-views", + icon: "📦", + }, + { + name: "python3-logstash", + icon: "📦", + }, + { + name: "dedupe", + icon: "📦", + }, + { + name: "mypy-boto3", + icon: "📦", + }, + { + name: "cymruwhois", + icon: "📦", + }, + { + name: "colorhash", + icon: "📦", + }, + { + name: "backports-lzma", + icon: "📦", + }, + { + name: "aws-logging-handlers", + icon: "📦", + }, + { + name: "binary", + icon: "📦", + }, + { + name: "apispec-webframeworks", + icon: "📦", + }, + { + name: "tinysegmenter", + icon: "📦", + }, + { + name: "south", + icon: "📦", + }, + { + name: "zthreading", + icon: "📦", + }, + { + name: "django-webtest", + icon: "📦", + }, + { + name: "google-cloud-happybase", + icon: "📦", + }, + { + name: "nbdime", + icon: "📦", + }, + { + name: "cheetah", + icon: "📦", + }, + { + name: "newspaper3k", + icon: "📦", + }, + { + name: "doit", + icon: "📦", + }, + { + name: "asyncpool", + icon: "📦", + }, + { + name: "postgres", + icon: "📦", + }, + { + name: "pwntools", + icon: "📦", + }, + { + name: "tensorflowonspark", + icon: "📦", + }, + { + name: "healthcheck", + icon: "📦", + }, + { + name: "transforms3d", + icon: "📦", + }, + { + name: "python-hcl2", + icon: "📦", + }, + { + name: "azureml-automl-runtime", + icon: "📦", + }, + { + name: "inotify", + icon: "📦", + }, + { + name: "dfply", + icon: "📦", + }, + { + name: "jxmlease", + icon: "📦", + }, + { + name: "repoze-who", + icon: "📦", + }, + { + name: "crochet", + icon: "📦", + }, + { + name: "feedfinder2", + icon: "📦", + }, + { + name: "client", + icon: "📦", + }, + { + name: "django-redis-sessions", + icon: "📦", + }, + { + name: "google-cloud-iot", + icon: "📦", + }, + { + name: "bert-tensorflow", + icon: "📦", + }, + { + name: "pyblake2", + icon: "📦", + }, + { + name: "chainmap", + icon: "📦", + }, + { + name: "kinesis-python", + icon: "📦", + }, + { + name: "aws-cdk-aws-dynamodb", + icon: "📦", + }, + { + name: "zstd", + icon: "📦", + }, + { + name: "bpython", + icon: "📦", + }, + { + name: "nose-detecthttp", + icon: "📦", + }, + { + name: "flake8-broken-line", + icon: "📦", + }, + { + name: "jaxlib", + icon: "📦", + }, + { + name: "scrapy-random-useragent", + icon: "📦", + }, + { + name: "altair-data-server", + icon: "📦", + }, + { + name: "wordninja", + icon: "📦", + }, + { + name: "phpserialize", + icon: "📦", + }, + { + name: "django-colorfield", + icon: "📦", + }, + { + name: "dask-glm", + icon: "📦", + }, + { + name: "property-cached", + icon: "📦", + }, + { + name: "rook", + icon: "📦", + }, + { + name: "singer-python", + icon: "📦", + }, + { + name: "python-anticaptcha", + icon: "📦", + }, + { + name: "aws-cdk-aws-kinesis", + icon: "📦", + }, + { + name: "zope-schema", + icon: "📦", + }, + { + name: "keras-transformer", + icon: "📦", + }, + { + name: "braceexpand", + icon: "📦", + }, + { + name: "json-logic", + icon: "📦", + }, + { + name: "humpty", + icon: "📦", + }, + { + name: "delegator-py", + icon: "📦", + }, + { + name: "symspellpy", + icon: "📦", + }, + { + name: "sip", + icon: "📦", + }, + { + name: "levenshtein-search", + icon: "📦", + }, + { + name: "agate-sql", + icon: "📦", + }, + { + name: "envisage", + icon: "📦", + }, + { + name: "altair-viewer", + icon: "📦", + }, + { + name: "dedupe-hcluster", + icon: "📦", + }, + { + name: "sseclient", + icon: "📦", + }, + { + name: "pgpy", + icon: "📦", + }, + { + name: "flask-restless", + icon: "📦", + }, + { + name: "django-cookies-samesite", + icon: "📦", + }, + { + name: "thespian", + icon: "📦", + }, + { + name: "flake8-rst-docstrings", + icon: "📦", + }, + { + name: "agate-dbf", + icon: "📦", + }, + { + name: "ibm-watson", + icon: "📦", + }, + { + name: "cookiejar", + icon: "📦", + }, + { + name: "pytest-postgresql", + icon: "📦", + }, + { + name: "etcd3gw", + icon: "📦", + }, + { + name: "tryme", + icon: "📦", + }, + { + name: "google-cloud-os-login", + icon: "📦", + }, + { + name: "rlr", + icon: "📦", + }, + { + name: "altair-saver", + icon: "📦", + }, + { + name: "subliminal", + icon: "📦", + }, + { + name: "pyexcelerate", + icon: "📦", + }, + { + name: "agate-excel", + icon: "📦", + }, + { + name: "stagger", + icon: "📦", + }, + { + name: "unirest", + icon: "📦", + }, + { + name: "categorical-distance", + icon: "📦", + }, + { + name: "aws-cdk-aws-cognito", + icon: "📦", + }, + { + name: "dai-sgqlc-3-5", + icon: "📦", + }, + { + name: "django-registration", + icon: "📦", + }, + { + name: "dedupe-variable-datetime", + icon: "📦", + }, + { + name: "pytest-flask-sqlalchemy", + icon: "📦", + }, + { + name: "pyinstrument", + icon: "📦", + }, + { + name: "abbyy", + icon: "📦", + }, + { + name: "pyxero", + icon: "📦", + }, + { + name: "lsm-db", + icon: "📦", + }, + { + name: "turicreate", + icon: "📦", + }, + { + name: "weighted-levenshtein", + icon: "📦", + }, + { + name: "pycallgraph", + icon: "📦", + }, + { + name: "edx-django-utils", + icon: "📦", + }, + { + name: "click-spinner", + icon: "📦", + }, + { + name: "azure-appconfiguration", + icon: "📦", + }, + { + name: "certipy", + icon: "📦", + }, + { + name: "azureml-train-automl-runtime", + icon: "📦", + }, + { + name: "c7n", + icon: "📦", + }, + { + name: "rstcheck", + icon: "📦", + }, + { + name: "pytrie", + icon: "📦", + }, + { + name: "svglib", + icon: "📦", + }, + { + name: "face-recognition", + icon: "📦", + }, + { + name: "mojimoji", + icon: "📦", + }, + { + name: "django-safedelete", + icon: "📦", + }, + { + name: "pylbfgs", + icon: "📦", + }, + { + name: "svn", + icon: "📦", + }, + { + name: "mozdebug", + icon: "📦", + }, + { + name: "django-celery-email", + icon: "📦", + }, + { + name: "os-xenapi", + icon: "📦", + }, + { + name: "python-miio", + icon: "📦", + }, + { + name: "guessit", + icon: "📦", + }, + { + name: "edx-enterprise", + icon: "📦", + }, + { + name: "azureml-train-automl", + icon: "📦", + }, + { + name: "gluoncv", + icon: "📦", + }, + { + name: "fudge", + icon: "📦", + }, + { + name: "azure-eventhub-checkpointstoreblob-aio", + icon: "📦", + }, + { + name: "flask-log-request-id", + icon: "📦", + }, + { + name: "git-pylint-commit-hook", + icon: "📦", + }, + { + name: "passwordmeter", + icon: "📦", + }, + { + name: "pygpgme", + icon: "📦", + }, + { + name: "doc-warden", + icon: "📦", + }, + { + name: "boto3-type-annotations-with-docs", + icon: "📦", + }, + { + name: "django-cleanup", + icon: "📦", + }, + { + name: "flask-dance", + icon: "📦", + }, + { + name: "tinycss", + icon: "📦", + }, + { + name: "sphinx-tabs", + icon: "📦", + }, + { + name: "flask-oidc", + icon: "📦", + }, + { + name: "highered", + icon: "📦", + }, + { + name: "pyhacrf-datamade", + icon: "📦", + }, + { + name: "pykube", + icon: "📦", + }, + { + name: "azure-mgmt-synapse", + icon: "📦", + }, + { + name: "simplecosine", + icon: "📦", + }, + { + name: "blockdiag", + icon: "📦", + }, + { + name: "requests-async", + icon: "📦", + }, + { + name: "flake8-pep3101", + icon: "📦", + }, + { + name: "mechanicalsoup", + icon: "📦", + }, + { + name: "frozen-flask", + icon: "📦", + }, + { + name: "datetime-distance", + icon: "📦", + }, + { + name: "webexteamssdk", + icon: "📦", + }, + { + name: "azureml-mlflow", + icon: "📦", + }, + { + name: "caniusepython3", + icon: "📦", + }, + { + name: "tslearn", + icon: "📦", + }, + { + name: "keras-layer-normalization", + icon: "📦", + }, + { + name: "boostedblob", + icon: "📦", + }, + { + name: "django-templated-email", + icon: "📦", + }, + { + name: "cursive", + icon: "📦", + }, + { + name: "securesystemslib", + icon: "📦", + }, + { + name: "segtok", + icon: "📦", + }, + { + name: "sphinxcontrib-svg2pdfconverter", + icon: "📦", + }, + { + name: "pylzma", + icon: "📦", + }, + { + name: "sqlalchemy-views", + icon: "📦", + }, + { + name: "shodan", + icon: "📦", + }, + { + name: "cmake-format", + icon: "📦", + }, + { + name: "pyclustering", + icon: "📦", + }, + { + name: "shortid", + icon: "📦", + }, + { + name: "fixture", + icon: "📦", + }, + { + name: "pyemd", + icon: "📦", + }, + { + name: "edx-rbac", + icon: "📦", + }, + { + name: "json-logging", + icon: "📦", + }, + { + name: "riemann-client", + icon: "📦", + }, + { + name: "esprima", + icon: "📦", + }, + { + name: "wsme", + icon: "📦", + }, + { + name: "html-linter", + icon: "📦", + }, + { + name: "pyramid-arima", + icon: "📦", + }, + { + name: "djrill", + icon: "📦", + }, + { + name: "pynliner", + icon: "📦", + }, + { + name: "django-js-reverse", + icon: "📦", + }, + { + name: "template-remover", + icon: "📦", + }, + { + name: "rstr", + icon: "📦", + }, + { + name: "azureml-explain-model", + icon: "📦", + }, + { + name: "django-revproxy", + icon: "📦", + }, + { + name: "stemming", + icon: "📦", + }, + { + name: "jupyter-telemetry", + icon: "📦", + }, + { + name: "pymp-pypi", + icon: "📦", + }, + { + name: "pyvim", + icon: "📦", + }, + { + name: "junos-eznc", + icon: "📦", + }, + { + name: "pytictoc", + icon: "📦", + }, + { + name: "jenkins-job-builder", + icon: "📦", + }, + { + name: "airflow-exporter", + icon: "📦", + }, + { + name: "pyobjc-framework-quartz", + icon: "📦", + }, + { + name: "django-jsonview", + icon: "📦", + }, + { + name: "face-recognition-models", + icon: "📦", + }, + { + name: "lambda-packages", + icon: "📦", + }, + { + name: "tensorflow-model-optimization", + icon: "📦", + }, + { + name: "pymemoize", + icon: "📦", + }, + { + name: "google-cloud-datalabeling", + icon: "📦", + }, + { + name: "case-conversion", + icon: "📦", + }, + { + name: "pyhaversion", + icon: "📦", + }, + { + name: "pyeapi", + icon: "📦", + }, + { + name: "pysendfile", + icon: "📦", + }, + { + name: "psycopg2-pool", + icon: "📦", + }, + { + name: "in-toto", + icon: "📦", + }, + { + name: "keras-multi-head", + icon: "📦", + }, + { + name: "django-cms", + icon: "📦", + }, + { + name: "pymobiledetect", + icon: "📦", + }, + { + name: "google-cloud-talent", + icon: "📦", + }, + { + name: "petastorm", + icon: "📦", + }, + { + name: "textsearch", + icon: "📦", + }, + { + name: "amqplib", + icon: "📦", + }, + { + name: "polyglot", + icon: "📦", + }, + { + name: "pyexcel-xls", + icon: "📦", + }, + { + name: "elasticsearch2", + icon: "📦", + }, + { + name: "django-sendgrid-v5", + icon: "📦", + }, + { + name: "python-vagrant", + icon: "📦", + }, + { + name: "python-hosts", + icon: "📦", + }, + { + name: "flask-json", + icon: "📦", + }, + { + name: "google-cloud-webrisk", + icon: "📦", + }, + { + name: "python-speech-features", + icon: "📦", + }, + { + name: "bpemb", + icon: "📦", + }, + { + name: "restrictedpython", + icon: "📦", + }, + { + name: "azure-synapse-spark", + icon: "📦", + }, + { + name: "google-cloud-websecurityscanner", + icon: "📦", + }, + { + name: "pydes", + icon: "📦", + }, + { + name: "ics", + icon: "📦", + }, + { + name: "xunitparser", + icon: "📦", + }, + { + name: "pycapnp", + icon: "📦", + }, + { + name: "recurly", + icon: "📦", + }, + { + name: "outcome", + icon: "📦", + }, + { + name: "django-dynamic-fixture", + icon: "📦", + }, + { + name: "robotframework-pythonlibcore", + icon: "📦", + }, + { + name: "keras-pos-embd", + icon: "📦", + }, + { + name: "keras-embed-sim", + icon: "📦", + }, + { + name: "python-rest-client", + icon: "📦", + }, + { + name: "keras-position-wise-feed-forward", + icon: "📦", + }, + { + name: "azure-synapse-accesscontrol", + icon: "📦", + }, + { + name: "openstackdocstheme", + icon: "📦", + }, + { + name: "http", + icon: "📦", + }, + { + name: "neverbounce-sdk", + icon: "📦", + }, + { + name: "aliyun-python-sdk-core-v3", + icon: "📦", + }, + { + name: "janome", + icon: "📦", + }, + { + name: "pytest-allure-adaptor", + icon: "📦", + }, + { + name: "django-jet", + icon: "📦", + }, + { + name: "sq-native", + icon: "📦", + }, + { + name: "libconf", + icon: "📦", + }, + { + name: "parse-accept-language", + icon: "📦", + }, + { + name: "reportportal-client", + icon: "📦", + }, + { + name: "cmreshandler", + icon: "📦", + }, + { + name: "mercurial", + icon: "📦", + }, + { + name: "django-sortedm2m", + icon: "📦", + }, + { + name: "delighted", + icon: "📦", + }, + { + name: "sphinx-autoapi", + icon: "📦", + }, + { + name: "python3-keyczar", + icon: "📦", + }, + { + name: "genshi", + icon: "📦", + }, + { + name: "anytemplate", + icon: "📦", + }, + { + name: "pdoc3", + icon: "📦", + }, + { + name: "cos-python-sdk-v5", + icon: "📦", + }, + { + name: "art", + icon: "📦", + }, + { + name: "colour-runner", + icon: "📦", + }, + { + name: "flexget", + icon: "📦", + }, + { + name: "watchgod", + icon: "📦", + }, + { + name: "ssh2-python", + icon: "📦", + }, + { + name: "pygerrit2", + icon: "📦", + }, + { + name: "microversion-parse", + icon: "📦", + }, + { + name: "flask-sockets", + icon: "📦", + }, + { + name: "socketio-client", + icon: "📦", + }, + { + name: "coincurve", + icon: "📦", + }, + { + name: "ibis-framework", + icon: "📦", + }, + { + name: "cma", + icon: "📦", + }, + { + name: "flake8-formatter-junit-xml", + icon: "📦", + }, + { + name: "sdnotify", + icon: "📦", + }, + { + name: "ryu", + icon: "📦", + }, + { + name: "quart", + icon: "📦", + }, + { + name: "oauth2-client", + icon: "📦", + }, + { + name: "aiocache", + icon: "📦", + }, + { + name: "executor", + icon: "📦", + }, + { + name: "pytest-logbook", + icon: "📦", + }, + { + name: "strsim", + icon: "📦", + }, + { + name: "freetype-py", + icon: "📦", + }, + { + name: "python-qpid-proton", + icon: "📦", + }, + { + name: "backports-datetime-timestamp", + icon: "📦", + }, + { + name: "robotframework-faker", + icon: "📦", + }, + { + name: "sarge", + icon: "📦", + }, + { + name: "janus", + icon: "📦", + }, + { + name: "simpy", + icon: "📦", + }, + { + name: "timedelta", + icon: "📦", + }, + { + name: "django-memoize", + icon: "📦", + }, + { + name: "odo", + icon: "📦", + }, + { + name: "gdown", + icon: "📦", + }, + { + name: "logentries", + icon: "📦", + }, + { + name: "darglint", + icon: "📦", + }, + { + name: "django-admin-tools", + icon: "📦", + }, + { + name: "slugify", + icon: "📦", + }, + { + name: "fs-s3fs", + icon: "📦", + }, + { + name: "cfscrape", + icon: "📦", + }, + { + name: "pep257", + icon: "📦", + }, + { + name: "nbval", + icon: "📦", + }, + { + name: "nmslib", + icon: "📦", + }, + { + name: "awkward", + icon: "📦", + }, + { + name: "rasa", + icon: "📦", + }, + { + name: "hyperloglog", + icon: "📦", + }, + { + name: "voluptuous-serialize", + icon: "📦", + }, + { + name: "ciscoconfparse", + icon: "📦", + }, + { + name: "user-agent", + icon: "📦", + }, + { + name: "mod-wsgi", + icon: "📦", + }, + { + name: "pdfminer3k", + icon: "📦", + }, + { + name: "flufl-enum", + icon: "📦", + }, + { + name: "python-logstash-async", + icon: "📦", + }, + { + name: "l18n", + icon: "📦", + }, + { + name: "sphinx-bootstrap-theme", + icon: "📦", + }, + { + name: "uproot", + icon: "📦", + }, + { + name: "snowflake", + icon: "📦", + }, + { + name: "mohawk", + icon: "📦", + }, + { + name: "netapp-lib", + icon: "📦", + }, + { + name: "pyexecjs", + icon: "📦", + }, + { + name: "edx-proctoring", + icon: "📦", + }, + { + name: "sqlalchemy-utc", + icon: "📦", + }, + { + name: "pytest-helpers-namespace", + icon: "📦", + }, + { + name: "niet", + icon: "📦", + }, + { + name: "python-social-auth", + icon: "📦", + }, + { + name: "domain2idna", + icon: "📦", + }, + { + name: "urlextract", + icon: "📦", + }, + { + name: "aiomysql", + icon: "📦", + }, + { + name: "esrally", + icon: "📦", + }, + { + name: "geospark", + icon: "📦", + }, + { + name: "pretty-bad-protocol", + icon: "📦", + }, + { + name: "keras-bert", + icon: "📦", + }, + { + name: "pygelf", + icon: "📦", + }, + { + name: "uproot-methods", + icon: "📦", + }, + { + name: "py-healthcheck", + icon: "📦", + }, + { + name: "glog", + icon: "📦", + }, + { + name: "spyne", + icon: "📦", + }, + { + name: "cgroupspy", + icon: "📦", + }, + { + name: "dbnd-airflow", + icon: "📦", + }, + { + name: "htpasswd", + icon: "📦", + }, + { + name: "pypowervm", + icon: "📦", + }, + { + name: "dbnd-docker", + icon: "📦", + }, + { + name: "zope-i18nmessageid", + icon: "📦", + }, + { + name: "teradata", + icon: "📦", + }, + { + name: "aws-configure", + icon: "📦", + }, + { + name: "np-utils", + icon: "📦", + }, + { + name: "bashate", + icon: "📦", + }, + { + name: "traits", + icon: "📦", + }, + { + name: "robotframework-httplibrary", + icon: "📦", + }, + { + name: "django-rest-knox", + icon: "📦", + }, + { + name: "bitmath", + icon: "📦", + }, + { + name: "frida", + icon: "📦", + }, + { + name: "databand", + icon: "📦", + }, + { + name: "rest-condition", + icon: "📦", + }, + { + name: "libmagic", + icon: "📦", + }, + { + name: "mozilla-django-oidc", + icon: "📦", + }, + { + name: "a-pytube-fork-for-spotdl-users", + icon: "📦", + }, + { + name: "python-terraform", + icon: "📦", + }, + { + name: "pytorch", + icon: "📦", + }, + { + name: "tap-py", + icon: "📦", + }, + { + name: "rasa-sdk", + icon: "📦", + }, + { + name: "django-hosts", + icon: "📦", + }, + { + name: "pyttsx3", + icon: "📦", + }, + { + name: "dis3", + icon: "📦", + }, + { + name: "faust", + icon: "📦", + }, + { + name: "flask-opentracing", + icon: "📦", + }, + { + name: "tabula-py", + icon: "📦", + }, + { + name: "django-htmlmin", + icon: "📦", + }, + { + name: "robinhood-aiokafka", + icon: "📦", + }, + { + name: "pytest-json", + icon: "📦", + }, + { + name: "dynamodb-encryption-sdk", + icon: "📦", + }, + { + name: "tailer", + icon: "📦", + }, + { + name: "undetected-chromedriver", + icon: "📦", + }, + { + name: "pikepdf", + icon: "📦", + }, + { + name: "git-remote-codecommit", + icon: "📦", + }, + { + name: "django-impersonate", + icon: "📦", + }, + { + name: "code-annotations", + icon: "📦", + }, + { + name: "djangorestframework-recursive", + icon: "📦", + }, + { + name: "tox-gh-actions", + icon: "📦", + }, + { + name: "python-gettext", + icon: "📦", + }, + { + name: "fastcore", + icon: "📦", + }, + { + name: "twitter-common-contextutil", + icon: "📦", + }, + { + name: "mode", + icon: "📦", + }, + { + name: "py-lz4framed", + icon: "📦", + }, + { + name: "zodbpickle", + icon: "📦", + }, + { + name: "django-admin-sortable", + icon: "📦", + }, + { + name: "flask-apscheduler", + icon: "📦", + }, + { + name: "databases", + icon: "📦", + }, + { + name: "hunspell", + icon: "📦", + }, + { + name: "flake8-executable", + icon: "📦", + }, + { + name: "ftputil", + icon: "📦", + }, + { + name: "os-resource-classes", + icon: "📦", + }, + { + name: "testlink-api-python-client", + icon: "📦", + }, + { + name: "tox-monorepo", + icon: "📦", + }, + { + name: "vdms", + icon: "📦", + }, + { + name: "pyftdi", + icon: "📦", + }, + { + name: "jprops", + icon: "📦", + }, + { + name: "antigate", + icon: "📦", + }, + { + name: "lftools", + icon: "📦", + }, + { + name: "looker-sdk", + icon: "📦", + }, + { + name: "flup", + icon: "📦", + }, + { + name: "clearbit", + icon: "📦", + }, + { + name: "alohomora", + icon: "📦", + }, + { + name: "python-saml", + icon: "📦", + }, + { + name: "sanic-jwt", + icon: "📦", + }, + { + name: "django-sass-processor", + icon: "📦", + }, + { + name: "jupyter-server", + icon: "📦", + }, + { + name: "numpy-stl", + icon: "📦", + }, + { + name: "pyobjc-framework-fsevents", + icon: "📦", + }, + { + name: "pyqtgraph", + icon: "📦", + }, + { + name: "sqlalchemy-diff", + icon: "📦", + }, + { + name: "pyspellchecker", + icon: "📦", + }, + { + name: "twitter-common-util", + icon: "📦", + }, + { + name: "cupy-cuda100", + icon: "📦", + }, + { + name: "repoze-sendmail", + icon: "📦", + }, + { + name: "oslo-vmware", + icon: "📦", + }, + { + name: "wtforms-components", + icon: "📦", + }, + { + name: "webhelpers", + icon: "📦", + }, + { + name: "f5-icontrol-rest", + icon: "📦", + }, + { + name: "pid", + icon: "📦", + }, + { + name: "prometheus-async", + icon: "📦", + }, + { + name: "jupyter-kernel-gateway", + icon: "📦", + }, + { + name: "reprint", + icon: "📦", + }, + { + name: "mahotas", + icon: "📦", + }, + { + name: "twitter-common-app", + icon: "📦", + }, + { + name: "twitter-common-string", + icon: "📦", + }, + { + name: "yamlloader", + icon: "📦", + }, + { + name: "base36", + icon: "📦", + }, + { + name: "twitter-common-process", + icon: "📦", + }, + { + name: "glance-store", + icon: "📦", + }, + { + name: "pytest-dotenv", + icon: "📦", + }, + { + name: "nose-html-reporting", + icon: "📦", + }, + { + name: "pyuwsgi", + icon: "📦", + }, + { + name: "pytest-logger", + icon: "📦", + }, + { + name: "pyobjc-framework-systemconfiguration", + icon: "📦", + }, + { + name: "tabledata", + icon: "📦", + }, + { + name: "blaze", + icon: "📦", + }, + { + name: "qiniu", + icon: "📦", + }, + { + name: "django-contrib-comments", + icon: "📦", + }, + { + name: "jsl", + icon: "📦", + }, + { + name: "pybigquery", + icon: "📦", + }, + { + name: "event-tracking", + icon: "📦", + }, + { + name: "pyobjc-framework-cfnetwork", + icon: "📦", + }, + { + name: "xstatic-datatables", + icon: "📦", + }, + { + name: "pyobjc-framework-launchservices", + icon: "📦", + }, + { + name: "django-smtp-ssl", + icon: "📦", + }, + { + name: "ldclient-py", + icon: "📦", + }, + { + name: "xstatic-patternfly-bootstrap-treeview", + icon: "📦", + }, + { + name: "xstatic-patternfly", + icon: "📦", + }, + { + name: "instagramapi", + icon: "📦", + }, + { + name: "django-suit", + icon: "📦", + }, + { + name: "standardjson", + icon: "📦", + }, + { + name: "sphinx-click", + icon: "📦", + }, + { + name: "strif", + icon: "📦", + }, + { + name: "flask-moment", + icon: "📦", + }, + { + name: "bcdoc", + icon: "📦", + }, + { + name: "protobuf-to-dict", + icon: "📦", + }, + { + name: "pyobjc-framework-webkit", + icon: "📦", + }, + { + name: "bcolz", + icon: "📦", + }, + { + name: "flake8-junit-report", + icon: "📦", + }, + { + name: "pygtail", + icon: "📦", + }, + { + name: "lob", + icon: "📦", + }, + { + name: "pytools", + icon: "📦", + }, + { + name: "travis", + icon: "📦", + }, + { + name: "grpclib", + icon: "📦", + }, + { + name: "python-intervals", + icon: "📦", + }, + { + name: "zabbix-api", + icon: "📦", + }, + { + name: "nested-lookup", + icon: "📦", + }, + { + name: "edx-rest-api-client", + icon: "📦", + }, + { + name: "cloudfoundry-client", + icon: "📦", + }, + { + name: "rosdistro", + icon: "📦", + }, + { + name: "pretrainedmodels", + icon: "📦", + }, + { + name: "alphabet-detector", + icon: "📦", + }, + { + name: "instaclone", + icon: "📦", + }, + { + name: "pysmartdl", + icon: "📦", + }, + { + name: "cbapi", + icon: "📦", + }, + { + name: "python-fly", + icon: "📦", + }, + { + name: "bdquaternions", + icon: "📦", + }, + { + name: "edxval", + icon: "📦", + }, + { + name: "robotframework-debuglibrary", + icon: "📦", + }, + { + name: "gssapi", + icon: "📦", + }, + { + name: "aws-cdk-aws-s3-notifications", + icon: "📦", + }, + { + name: "pyghmi", + icon: "📦", + }, + { + name: "dash-daq", + icon: "📦", + }, + { + name: "purl", + icon: "📦", + }, + { + name: "pyobjc-framework-exceptionhandling", + icon: "📦", + }, + { + name: "python-nomad", + icon: "📦", + }, + { + name: "pomegranate", + icon: "📦", + }, + { + name: "razorpay", + icon: "📦", + }, + { + name: "bioblend", + icon: "📦", + }, + { + name: "fbmessenger", + icon: "📦", + }, + { + name: "gitlint", + icon: "📦", + }, + { + name: "django-rosetta", + icon: "📦", + }, + { + name: "flanker", + icon: "📦", + }, + { + name: "aws-cdk-aws-efs", + icon: "📦", + }, + { + name: "python-helpscout-v2", + icon: "📦", + }, + { + name: "adyen", + icon: "📦", + }, + { + name: "pytest-qt", + icon: "📦", + }, + { + name: "allennlp", + icon: "📦", + }, + { + name: "carbon", + icon: "📦", + }, + { + name: "djangocms-text-ckeditor", + icon: "📦", + }, + { + name: "transliterate", + icon: "📦", + }, + { + name: "mail-parser", + icon: "📦", + }, + { + name: "osc-placement", + icon: "📦", + }, + { + name: "docformatter", + icon: "📦", + }, + { + name: "timezonefinderl", + icon: "📦", + }, + { + name: "ebcdic", + icon: "📦", + }, + { + name: "logmatic-python", + icon: "📦", + }, + { + name: "spooky", + icon: "📦", + }, + { + name: "lesscpy", + icon: "📦", + }, + { + name: "fuzzyset", + icon: "📦", + }, + { + name: "flit-core", + icon: "📦", + }, + { + name: "edx-bulk-grades", + icon: "📦", + }, + { + name: "pyobjc-framework-diskarbitration", + icon: "📦", + }, + { + name: "spyder", + icon: "📦", + }, + { + name: "python-xmp-toolkit", + icon: "📦", + }, + { + name: "sure", + icon: "📦", + }, + { + name: "django-prettyjson", + icon: "📦", + }, + { + name: "pysrt", + icon: "📦", + }, + { + name: "python-keycloak-client", + icon: "📦", + }, + { + name: "pyaudioanalysis", + icon: "📦", + }, + { + name: "chainer", + icon: "📦", + }, + { + name: "daemonize", + icon: "📦", + }, + { + name: "faulthandler", + icon: "📦", + }, + { + name: "glob3", + icon: "📦", + }, + { + name: "pypdf", + icon: "📦", + }, + { + name: "morfessor", + icon: "📦", + }, + { + name: "sqlalchemy-repr", + icon: "📦", + }, + { + name: "panda", + icon: "📦", + }, + { + name: "modin", + icon: "📦", + }, + { + name: "zconfig", + icon: "📦", + }, + { + name: "asyncio-nats-streaming", + icon: "📦", + }, + { + name: "mibian", + icon: "📦", + }, + { + name: "fvcore", + icon: "📦", + }, + { + name: "f5-sdk", + icon: "📦", + }, + { + name: "html-text", + icon: "📦", + }, + { + name: "zvmcloudconnector", + icon: "📦", + }, + { + name: "playsound", + icon: "📦", + }, + { + name: "kerberos", + icon: "📦", + }, + { + name: "pyobjc-framework-coreservices", + icon: "📦", + }, + { + name: "efficientnet-pytorch", + icon: "📦", + }, + { + name: "pygaljs", + icon: "📦", + }, + { + name: "slackeventsapi", + icon: "📦", + }, + { + name: "pydictionary", + icon: "📦", + }, + { + name: "pytest-datadir", + icon: "📦", + }, + { + name: "marshmallow-union", + icon: "📦", + }, + { + name: "mattermostwrapper", + icon: "📦", + }, + { + name: "requests-http-signature", + icon: "📦", + }, + { + name: "circus", + icon: "📦", + }, + { + name: "opencensus-correlation", + icon: "📦", + }, + { + name: "kivy-garden", + icon: "📦", + }, + { + name: "setuptools-git-version", + icon: "📦", + }, + { + name: "facepy", + icon: "📦", + }, + { + name: "zope-security", + icon: "📦", + }, + { + name: "bottlenose", + icon: "📦", + }, + { + name: "mandrill-37", + icon: "📦", + }, + { + name: "pyutilib", + icon: "📦", + }, + { + name: "crontab", + icon: "📦", + }, + { + name: "pytest-tornado", + icon: "📦", + }, + { + name: "scaleapi", + icon: "📦", + }, + { + name: "ipinfo", + icon: "📦", + }, + { + name: "python-cjson", + icon: "📦", + }, + { + name: "django-split-settings", + icon: "📦", + }, + { + name: "simhash", + icon: "📦", + }, + { + name: "suds-community", + icon: "📦", + }, + { + name: "pyuca", + icon: "📦", + }, + { + name: "supervisor-checks", + icon: "📦", + }, + { + name: "django-push-notifications", + icon: "📦", + }, + { + name: "netstorageapi", + icon: "📦", + }, + { + name: "librabbitmq", + icon: "📦", + }, + { + name: "django-admin-list-filter-dropdown", + icon: "📦", + }, + { + name: "sphinx-markdown-builder", + icon: "📦", + }, + { + name: "maya", + icon: "📦", + }, + { + name: "django-render-block", + icon: "📦", + }, + { + name: "centrosome", + icon: "📦", + }, + { + name: "lomond", + icon: "📦", + }, + { + name: "zope-configuration", + icon: "📦", + }, + { + name: "djangocms-attributes-field", + icon: "📦", + }, + { + name: "business-rules", + icon: "📦", + }, + { + name: "rosdep", + icon: "📦", + }, + { + name: "ssh-import-id", + icon: "📦", + }, + { + name: "deluge-client", + icon: "📦", + }, + { + name: "pyobjc-framework-coretext", + icon: "📦", + }, + { + name: "dbapi-opentracing", + icon: "📦", + }, + { + name: "jsonfield2", + icon: "📦", + }, + { + name: "trio", + icon: "📦", + }, + { + name: "edx-submissions", + icon: "📦", + }, + { + name: "dockerfile-parse", + icon: "📦", + }, + { + name: "ed25519", + icon: "📦", + }, + { + name: "validator-collection", + icon: "📦", + }, + { + name: "pytils", + icon: "📦", + }, + { + name: "petl", + icon: "📦", + }, + { + name: "tempest", + icon: "📦", + }, + { + name: "m3-cdecimal", + icon: "📦", + }, + { + name: "fuzzysearch", + icon: "📦", + }, + { + name: "torchsummary", + icon: "📦", + }, + { + name: "open3d", + icon: "📦", + }, + { + name: "pytorch-ignite", + icon: "📦", + }, + { + name: "graphene-federation", + icon: "📦", + }, + { + name: "pythainlp", + icon: "📦", + }, + { + name: "zodb", + icon: "📦", + }, + { + name: "remote-pdb", + icon: "📦", + }, + { + name: "celery-once", + icon: "📦", + }, + { + name: "unrar", + icon: "📦", + }, + { + name: "lepl", + icon: "📦", + }, + { + name: "pyangbind", + icon: "📦", + }, + { + name: "mixpanel-api", + icon: "📦", + }, + { + name: "redlock", + icon: "📦", + }, + { + name: "flair", + icon: "📦", + }, + { + name: "django-debug-panel", + icon: "📦", + }, + { + name: "natto-py", + icon: "📦", + }, + { + name: "nose-allure-plugin", + icon: "📦", + }, + { + name: "javabridge", + icon: "📦", + }, + { + name: "pyscss", + icon: "📦", + }, + { + name: "pyobjc-framework-coredata", + icon: "📦", + }, + { + name: "marshmallow-jsonschema", + icon: "📦", + }, + { + name: "pyobjc-framework-screensaver", + icon: "📦", + }, + { + name: "pyobjc-framework-addressbook", + icon: "📦", + }, + { + name: "sparse", + icon: "📦", + }, + { + name: "azure-log-analytics-data-collector-api", + icon: "📦", + }, + { + name: "azureml-widgets", + icon: "📦", + }, + { + name: "pyfunctional", + icon: "📦", + }, + { + name: "extruct", + icon: "📦", + }, + { + name: "cmsis-pack-manager", + icon: "📦", + }, + { + name: "google-cloud-pubsublite", + icon: "📦", + }, + { + name: "captcha", + icon: "📦", + }, + { + name: "pyobjc-framework-syncservices", + icon: "📦", + }, + { + name: "rtslib-fb", + icon: "📦", + }, + { + name: "aws-embedded-metrics", + icon: "📦", + }, + { + name: "canmatrix", + icon: "📦", + }, + { + name: "sqlacodegen", + icon: "📦", + }, + { + name: "pyvisa", + icon: "📦", + }, + { + name: "rootpath", + icon: "📦", + }, + { + name: "slumber", + icon: "📦", + }, + { + name: "smartlingapisdk", + icon: "📦", + }, + { + name: "pyobjc-framework-applescriptkit", + icon: "📦", + }, + { + name: "contexttimer", + icon: "📦", + }, + { + name: "pyobjc-framework-automator", + icon: "📦", + }, + { + name: "zope-container", + icon: "📦", + }, + { + name: "pyobjc-framework-applicationservices", + icon: "📦", + }, + { + name: "smartypants", + icon: "📦", + }, + { + name: "django-url-filter", + icon: "📦", + }, + { + name: "pyobjc-framework-preferencepanes", + icon: "📦", + }, + { + name: "localstack-ext", + icon: "📦", + }, + { + name: "pyhaproxy", + icon: "📦", + }, + { + name: "bx-python", + icon: "📦", + }, + { + name: "lorem", + icon: "📦", + }, + { + name: "pyobjc-framework-installerplugins", + icon: "📦", + }, + { + name: "mws", + icon: "📦", + }, + { + name: "pyobjc-framework-searchkit", + icon: "📦", + }, + { + name: "pyobjc-framework-latentsemanticmapping", + icon: "📦", + }, + { + name: "emcee", + icon: "📦", + }, + { + name: "marshmallow-polyfield", + icon: "📦", + }, + { + name: "calmsize", + icon: "📦", + }, + { + name: "rfc3339", + icon: "📦", + }, + { + name: "nbgitpuller", + icon: "📦", + }, + { + name: "scikit-multilearn", + icon: "📦", + }, + { + name: "edx-when", + icon: "📦", + }, + { + name: "zope-exceptions", + icon: "📦", + }, + { + name: "pyrabbit", + icon: "📦", + }, + { + name: "readerwriterlock", + icon: "📦", + }, + { + name: "pytorch-memlab", + icon: "📦", + }, + { + name: "flexmock", + icon: "📦", + }, + { + name: "pyobjc-framework-scriptingbridge", + icon: "📦", + }, + { + name: "salt", + icon: "📦", + }, + { + name: "aws-cdk-aws-lambda-event-sources", + icon: "📦", + }, + { + name: "salesforce-fuelsdk", + icon: "📦", + }, + { + name: "mox3", + icon: "📦", + }, + { + name: "mnemonic", + icon: "📦", + }, + { + name: "async", + icon: "📦", + }, + { + name: "trufflehogregexes", + icon: "📦", + }, + { + name: "pyobjc-framework-corelocation", + icon: "📦", + }, + { + name: "robotframework-databaselibrary", + icon: "📦", + }, + { + name: "pyobjc-framework-inputmethodkit", + icon: "📦", + }, + { + name: "zerorpc", + icon: "📦", + }, + { + name: "intuit-oauth", + icon: "📦", + }, + { + name: "s3contents", + icon: "📦", + }, + { + name: "azure-keyvault-administration", + icon: "📦", + }, + { + name: "crhelper", + icon: "📦", + }, + { + name: "tpot", + icon: "📦", + }, + { + name: "flask-jwt", + icon: "📦", + }, + { + name: "airspeed", + icon: "📦", + }, + { + name: "pip-review", + icon: "📦", + }, + { + name: "lark", + icon: "📦", + }, + { + name: "glcontext", + icon: "📦", + }, + { + name: "apyori", + icon: "📦", + }, + { + name: "daiquiri", + icon: "📦", + }, + { + name: "rapid-framework", + icon: "📦", + }, + { + name: "arpeggio", + icon: "📦", + }, + { + name: "snorkel", + icon: "📦", + }, + { + name: "pyobjc-framework-servicemanagement", + icon: "📦", + }, + { + name: "pyobjc-framework-collaboration", + icon: "📦", + }, + { + name: "pyobjc-framework-applescriptobjc", + icon: "📦", + }, + { + name: "browserstack-local", + icon: "📦", + }, + { + name: "pyobjc-framework-dictionaryservices", + icon: "📦", + }, + { + name: "requests-credssp", + icon: "📦", + }, + { + name: "atomos", + icon: "📦", + }, + { + name: "pyobjc-framework-corebluetooth", + icon: "📦", + }, + { + name: "pyobjc-framework-instantmessage", + icon: "📦", + }, + { + name: "pyobjc-framework-corewlan", + icon: "📦", + }, + { + name: "django-mock-queries", + icon: "📦", + }, + { + name: "pyobjc-framework-opendirectory", + icon: "📦", + }, + { + name: "pyobjc-framework-imagecapturecore", + icon: "📦", + }, + { + name: "edx-django-release-util", + icon: "📦", + }, + { + name: "image-classifiers", + icon: "📦", + }, + { + name: "userpath", + icon: "📦", + }, + { + name: "python-bioformats", + icon: "📦", + }, + { + name: "zope-lifecycleevent", + icon: "📦", + }, + { + name: "qdarkstyle", + icon: "📦", + }, + { + name: "beautifultable", + icon: "📦", + }, + { + name: "jenkins", + icon: "📦", + }, + { + name: "pyobjc-framework-accounts", + icon: "📦", + }, + { + name: "nplusone", + icon: "📦", + }, + { + name: "helpdev", + icon: "📦", + }, + { + name: "pyobjc-framework-eventkit", + icon: "📦", + }, + { + name: "edx-completion", + icon: "📦", + }, + { + name: "line-bot-sdk", + icon: "📦", + }, + { + name: "snakeviz", + icon: "📦", + }, + { + name: "junit2html", + icon: "📦", + }, + { + name: "django-hashid-field", + icon: "📦", + }, + { + name: "django-test-plus", + icon: "📦", + }, + { + name: "pyobjc-framework-avfoundation", + icon: "📦", + }, + { + name: "pyobjc-framework-avkit", + icon: "📦", + }, + { + name: "pyobjc-framework-social", + icon: "📦", + }, + { + name: "pyupgrade", + icon: "📦", + }, + { + name: "pyobjc-framework-coreaudio", + icon: "📦", + }, + { + name: "dbus-python", + icon: "📦", + }, + { + name: "upyun", + icon: "📦", + }, + { + name: "hashlib", + icon: "📦", + }, + { + name: "pyobjc-framework-scenekit", + icon: "📦", + }, + { + name: "pyobjc-framework-storekit", + icon: "📦", + }, + { + name: "pyobjc-framework-gamecenter", + icon: "📦", + }, + { + name: "pyobjc-framework-calendarstore", + icon: "📦", + }, + { + name: "pyobjc-framework-imserviceplugin", + icon: "📦", + }, + { + name: "pyobjc-framework-mapkit", + icon: "📦", + }, + { + name: "pyobjc-framework-notificationcenter", + icon: "📦", + }, + { + name: "pyobjc-framework-cryptotokenkit", + icon: "📦", + }, + { + name: "pyobjc-framework-multipeerconnectivity", + icon: "📦", + }, + { + name: "pyobjc-framework-spritekit", + icon: "📦", + }, + { + name: "pyobjc-framework-modelio", + icon: "📦", + }, + { + name: "pyobjc-framework-photos", + icon: "📦", + }, + { + name: "pyobjc-framework-networkextension", + icon: "📦", + }, + { + name: "pyobjc-framework-netfs", + icon: "📦", + }, + { + name: "pyobjc-framework-photosui", + icon: "📦", + }, + { + name: "pyobjc-framework-contactsui", + icon: "📦", + }, + { + name: "pyobjc-framework-contacts", + icon: "📦", + }, + { + name: "pycosat", + icon: "📦", + }, + { + name: "django-debug-toolbar-request-history", + icon: "📦", + }, + { + name: "pyobjc-framework-iosurface", + icon: "📦", + }, + { + name: "pyobjc-framework-safariservices", + icon: "📦", + }, + { + name: "pyomo", + icon: "📦", + }, + { + name: "geopyspark", + icon: "📦", + }, + { + name: "json2xml", + icon: "📦", + }, + { + name: "iniparse", + icon: "📦", + }, + { + name: "pypsrp", + icon: "📦", + }, + { + name: "emails", + icon: "📦", + }, + { + name: "condor-git-config", + icon: "📦", + }, + { + name: "pandas-schema", + icon: "📦", + }, + { + name: "zope-cachedescriptors", + icon: "📦", + }, + { + name: "colormath", + icon: "📦", + }, + { + name: "pyobjc-framework-intents", + icon: "📦", + }, + { + name: "irc3-plugins-test", + icon: "📦", + }, + { + name: "pyobjc-framework-cloudkit", + icon: "📦", + }, + { + name: "pyobjc-framework-gamecontroller", + icon: "📦", + }, + { + name: "django-daterange-filter", + icon: "📦", + }, + { + name: "pyexcel-webio", + icon: "📦", + }, + { + name: "pycpfcnpj", + icon: "📦", + }, + { + name: "django-parler", + icon: "📦", + }, + { + name: "pyobjc-framework-mediaaccessibility", + icon: "📦", + }, + { + name: "pyobjc-framework-findersync", + icon: "📦", + }, + { + name: "pyobjc-framework-medialibrary", + icon: "📦", + }, + { + name: "grpcio-opentracing", + icon: "📦", + }, + { + name: "pyobjc-framework-localauthentication", + icon: "📦", + }, + { + name: "contentful", + icon: "📦", + }, + { + name: "prokaryote", + icon: "📦", + }, + { + name: "pyobjc-framework-libdispatch", + icon: "📦", + }, + { + name: "flask-injector", + icon: "📦", + }, + { + name: "flask-classful", + icon: "📦", + }, + { + name: "country-converter", + icon: "📦", + }, + { + name: "zope-dottedname", + icon: "📦", + }, + { + name: "ase", + icon: "📦", + }, + { + name: "zope-testing", + icon: "📦", + }, + { + name: "measurement", + icon: "📦", + }, + { + name: "gpytorch", + icon: "📦", + }, + { + name: "argo-models", + icon: "📦", + }, + { + name: "flask-seasurf", + icon: "📦", + }, + { + name: "python-grpc-prometheus", + icon: "📦", + }, + { + name: "django-config-models", + icon: "📦", + }, + { + name: "pyobjc-framework-mediaplayer", + icon: "📦", + }, + { + name: "pythondialog", + icon: "📦", + }, + { + name: "python-mistralclient", + icon: "📦", + }, + { + name: "aiostream", + icon: "📦", + }, + { + name: "flask-responses", + icon: "📦", + }, + { + name: "osmnx", + icon: "📦", + }, + { + name: "django-choices", + icon: "📦", + }, + { + name: "tensorpack", + icon: "📦", + }, + { + name: "pyobjc-framework-security", + icon: "📦", + }, + { + name: "asyncinit", + icon: "📦", + }, + { + name: "okta", + icon: "📦", + }, + { + name: "robotbackgroundlogger", + icon: "📦", + }, + { + name: "graphql-ws", + icon: "📦", + }, + { + name: "import-expression", + icon: "📦", + }, + { + name: "parameters-validation", + icon: "📦", + }, + { + name: "pyobjc-framework-securityinterface", + icon: "📦", + }, + { + name: "style", + icon: "📦", + }, + { + name: "google-images-download", + icon: "📦", + }, + { + name: "characteristic", + icon: "📦", + }, + { + name: "pyobjc-framework-coreaudiokit", + icon: "📦", + }, + { + name: "pipx", + icon: "📦", + }, + { + name: "pytest-replay", + icon: "📦", + }, + { + name: "prisma", + icon: "📦", + }, + { + name: "sourcery-cli", + icon: "📦", + }, +]; + +const completionSpec: Fig.Spec = { + name: "pip", + description: "Python package manager", + args: {}, + // options: [ + // { + // name: ["-h, --help"], + // description: "Show help.", + // }, + // { + // name: ["--isolated"], + // description: + // "Run pip in an isolated mode, ignoring environment variables and user configuration.", + // }, + // { + // name: ["-v, --verbose"], + // description: + // "Give more output. Option is additive, and can be used up to 3 times.", + // }, + // { + // name: ["-V, --version"], + // description: "Show version and exit.", + // }, + // { + // name: ["-q, --quiet"], + // description: + // "Give less output. Option is additive, and can be used up to 3 times (corresponding to WARNING, ERROR, and CRITICAL logging levels).", + // }, + // { + // name: ["--log"], + // description: "Path to a verbose appending log.", + // args: { + // name: "path", + // template: "filepaths", + // }, + // }, + // { + // name: ["--no-input"], + // description: "Disable prompting for input.", + // }, + // { + // name: ["--proxy"], + // description: + // "Specify a proxy in the form [user:passwd@]proxy.server:port.", + // args: { + // name: "proxy", + // description: "[user:passwd@]proxy.server:port", + // }, + // }, + // { + // name: ["--retries"], + // description: + // "Maximum number of retries each connection should attempt (default 5 times).", + // args: { + // name: "retries", + // }, + // }, + // { + // name: ["--timeout"], + // description: "Set the socket timeout (default 15 seconds).", + // args: { + // name: "sec", + // }, + // }, + // { + // name: ["--exists-action"], + // description: + // "Default action when a path already exists: (s)witch, (i)gnore, (w)ipe, (b)ackup, (a)bort.", + // args: { + // name: "action", + // }, + // }, + // { + // name: ["--trusted-host"], + // description: + // "Mark this host or host:port pair as trusted, even though it does not have valid or any HTTPS.", + // args: { + // name: "hostname", + // }, + // }, + // { + // name: ["--cert"], + // description: "Path to alternate CA bundle.", + // args: { + // name: "path", + // template: "filepaths", + // }, + // }, + // { + // name: ["--client-cert"], + // description: + // "Path to SSL client certificate, a single file containing the private key and the certificate in PEM format.", + // args: { + // name: "path", + // template: "filepaths", + // }, + // }, + // { + // name: ["--cache-dir"], + // description: "Store the cache data in a directory.", + // args: { + // name: "dir", + // template: "folders", + // }, + // }, + // { + // name: ["--no-cache-dir"], + // description: "Disable the cache.", + // }, + // { + // name: ["--disable-pip-version-check"], + // description: + // "Don't periodically check PyPI to determine whether a new version of pip is available for download. Implied with --no-index.", + // }, + // { + // name: ["--no-color"], + // description: "Suppress colored output.", + // }, + // { + // name: ["--no-python-version-warning"], + // description: + // "Silence deprecation warnings for upcoming unsupported Pythons.", + // }, + // { + // name: ["--use-feature"], + // description: + // "Enable new functionality, that may be backward incompatible.", + // args: { + // name: "feature", + // }, + // }, + // { + // name: ["--use-deprecated"], + // description: + // "Enable deprecated functionality, that will be removed in the future.", + // args: { + // name: "feature", + // }, + // }, + // ], + subcommands: [ + { + name: "install", + description: "Install packages", + args: { + name: "package", + description: "Package to install", + suggestions: packageList, + isVariadic: true, + }, + options: [ + // { + // name: ["--compile"], + // description: "Do not compile Python source files to bytecode", + // }, + // { + // name: ["-U", "--upgrade"], + // description: + // "Upgrade all specified packages to the newest available version.", + // }, + // { + // name: ["--upgrade-strategy"], + // description: + // "Determines how dependency upgrading should be handled [default: only-if-needed].", + // }, + // { + // name: ["--no-deps"], + // description: "Don’t install package dependencies.", + // }, + // { + // name: ["--root"], + // description: + // "Install everything relative to this alternate root directory.", + // args: { + // template: "folders", + // }, + // }, + // { + // name: ["--require-hashes"], + // description: + // "Require a hash to check each requirement against, for repeatable installs.", + // }, + // { + // name: ["--prefix"], + // description: + // "Installation prefix where lib, bin and other top-level folders are placed", + // args: { + // template: "folders", + // }, + // }, + // { + // name: ["-t", "--target"], + // description: "Install packages into .", + // args: { + // name: "dir", + // template: "folders", + // }, + // }, + // { + // name: ["--no-compile"], + // description: "Do not compile Python source files to bytecode", + // }, + // { + // name: ["--install-option"], + // description: + // "Extra arguments to be supplied to the setup.py install command", + // }, + // { + // name: ["--no-build-isolation"], + // description: + // "Disable isolation when building a modern source distribution.", + // }, + // { + // name: ["-c", "--constraint"], + // description: + // "Constrain versions using the given constraints file. This option can be used multiple times.", + // }, + { + name: ["-r", "--requirement"], + description: + "Install from the given requirements file. This option can be used multiple times", + isRepeatable: true, + args: { + name: "requirements file", + template: "filepaths", + }, + }, + // { + // name: ["--no-deps"], + // description: "Don’t install package dependencies.", + // }, + // { + // name: ["--global-option"], + // description: + // "Extra global options to be supplied to the setup.py call before the install command.", + // }, + // { + // name: ["--no-binary"], + // description: + // "Constrain versions using the given constraints file. This option can be used multiple times.", + // }, + // { + // name: ["--only-binary"], + // description: "Do not use source packages", + // args: { + // suggestions: [ + // { + // name: ":all:", + // description: "Disable all source packages", + // }, + // { + // name: ":none:", + // description: "Empty the set", + // }, + // ], + // }, + // }, + // { + // name: ["--prefer-binary"], + // description: + // "Prefer older binary packages over newer source packages.", + // }, + // { + // name: ["--src"], + // description: "Directory to check out editable projects into.", + // args: { + // name: "source folder", + // template: "folders", + // }, + // }, + // { + // name: ["--pre"], + // description: + // "Include pre-release and development versions. By default, pip only finds stable versions.", + // }, + // { + // name: ["--require-hashes"], + // description: + // "Require a hash to check each requirement against, for repeatable installs.", + // }, + // { + // name: ["--progress-bar"], + // description: "Specify type of progress to be displayed", + // args: { + // suggestions: [ + // { name: "off" }, + // { name: "on" }, + // { name: "ascii" }, + // { name: "pretty" }, + // { name: "emoji" }, + // ], + // }, + // }, + // { + // name: ["--no-build-isolation"], + // description: + // "Disable isolation when building a modern source distribution.", + // }, + // { + // name: ["--use-pep517"], + // description: "Use PEP 517 for building source distributions", + // }, + // { + // name: ["--ignore-requires-python"], + // description: "Ignore the Requires-Python information.", + // }, + // { + // name: ["-d", "--dest"], + // description: + // "Require a hash to check each requirement against, for repeatable installs.", + // args: { + // name: "dir", + // template: "folders", + // }, + // }, + // { + // name: ["--platform"], + // description: "Only use wheels compatible with platform.", + // args: { name: "platform" }, + // }, + // { + // name: ["--python-version"], + // description: + // "The Python interpreter version to use for wheel and “Requires-Python” compatibility checks.", + // }, + // { + // name: ["--implementation"], + // description: "Only use wheels compatible with Python implementation", + // args: { + // name: "implementation", + // }, + // }, + // { + // name: ["--abi"], + // description: + // "Only use wheels compatible with Python abi , e.g. ‘pypy_41’.", + // args: { + // name: "abi", + // }, + // }, + // { + // name: ["--no-clean"], + // description: "Don’t clean up build directories.", + // }, + // { + // name: ["-i", "--index-url"], + // description: "Base URL of the Python Package Index", + // args: { + // name: "url", + // }, + // }, + // { + // name: ["--no-index"], + // description: + // "Ignore package index (only looking at --find-links URLs instead).", + // }, + // { + // name: ["--extra-index-url"], + // description: + // "Extra URLs of package indexes to use in addition to --index-url. Should follow the same rules as --index-url.", + // }, + // { + // name: ["-f", "--find-links"], + // description: "Look for archives in the directory listing", + // args: { + // name: "url", + // template: "filepaths", + // }, + // }, + ], + }, + { + name: "download", + description: "Download packages", + args: { + name: "path", + template: "filepaths", + }, + options: [ + { + name: ["-c", "--constraint"], + description: + "Constrain versions using the given constraints file. This option can be used multiple times", + isRepeatable: true, + }, + { + name: ["-r", "--requirement"], + description: + "Install from the given requirements file. This option can be used multiple times", + isRepeatable: true, + }, + { + name: "--no-deps", + description: "Don’t install package dependencies", + }, + { + name: "--global-option", + description: + "Extra global options to be supplied to the setup.py call before the install command", + }, + { + name: "--no-binary", + description: + "Constrain versions using the given constraints file. This option can be used multiple times", + isRepeatable: true, + }, + { + name: "--only-binary", + description: "Do not use source packages", + args: { + suggestions: [ + { + name: ":all:", + description: "Disable all source packages", + }, + { + name: ":none:", + description: "Empty the set", + }, + ], + }, + }, + { + name: "--prefer-binary", + description: + "Prefer older binary packages over newer source packages", + }, + { + name: "--src", + description: "Directory to check out editable projects into", + args: { + name: "source folder", + template: "folders", + }, + }, + { + name: "--pre", + description: + "Include pre-release and development versions. By default, pip only finds stable versions", + }, + { + name: "--require-hashes", + description: + "Require a hash to check each requirement against, for repeatable installs", + }, + { + name: "--progress-bar", + description: "Specify type of progress to be displayed", + args: { + suggestions: [ + { name: "off" }, + { name: "on" }, + { name: "ascii" }, + { name: "pretty" }, + { name: "emoji" }, + ], + }, + }, + { + name: "--no-build-isolation", + description: + "Disable isolation when building a modern source distribution", + }, + { + name: "--use-pep517", + description: "Use PEP 517 for building source distributions", + }, + { + name: "--ignore-requires-python", + description: "Ignore the Requires-Python information", + }, + { + name: ["-d", "--dest"], + description: + "Require a hash to check each requirement against, for repeatable installs", + args: { + name: "dir", + template: "folders", + }, + }, + { + name: "--platform", + description: "Only use wheels compatible with platform", + args: { name: "platform" }, + }, + { + name: "--python-version", + description: + "The Python interpreter version to use for wheel and “Requires-Python” compatibility checks", + }, + { + name: "--implementation", + description: "Only use wheels compatible with Python implementation", + args: { + name: "implementation", + }, + }, + { + name: "--abi", + description: + "Only use wheels compatible with Python abi , e.g. ‘pypy_41’", + args: { + name: "abi", + }, + }, + { + name: "--no-clean", + description: "Don’t clean up build directories", + }, + { + name: ["-i", "--index-url"], + description: "Base URL of the Python Package Index", + args: { + name: "url", + }, + }, + { + name: "--no-index", + description: + "Ignore package index (only looking at --find-links URLs instead)", + }, + { + name: "--extra-index-url", + description: + "Extra URLs of package indexes to use in addition to --index-url. Should follow the same rules as --index-url", + }, + { + name: ["-f", "--find-links"], + description: "Look for archives in the directory listing", + args: { + name: "url", + template: "filepaths", + }, + }, + ], + }, + { + name: "uninstall", + description: "Uninstall packages", + args: {}, + }, + { + name: "freeze", + description: "Output installed packages in requirements format", + options: [ + { + name: ["-r", "--requirement"], + description: + "Use the order in the given requirements file and its comments when generating output", + }, + { + name: ["-l", "--local"], + description: + "If in a virtualenv that has global access, do not output globally-installed packages", + }, + { + name: "--user", + description: "Only output packages installed in user-site", + }, + { + name: "--path", + description: + "Restrict to the specified installation path for listing packages (can be used multiple times)", + isRepeatable: true, + }, + { + name: "--all", + description: + "Do not skip these packages in the output: setuptools, distribute, pip, wheel", + }, + { + name: "--exclude-editable", + description: "Exclude editable package from output", + }, + { + name: "--exclude", + description: "Exclude specified package from the output", + args: { + name: "package", + suggestCurrentToken: true, + generators: listPackages, + }, + }, + ], + }, + { + name: "list", + description: "List installed packages", + options: [ + { + name: ["-o", "--outdated"], + description: "List outdated packages", + }, + { + name: ["-u", "--uptodate"], + description: "List uptodate packages", + }, + { + name: ["-e", "--editable"], + description: "List editable projects", + }, + { + name: ["-l", "--local"], + description: + "If in a virtualenv that has global access, do not list globally-installed packages", + }, + { + name: "--user", + description: "Only output packages installed in user-site", + }, + { + name: "--path", + description: + "Restrict to the specified installation path for listing packages (can be used multiple times)", + isRepeatable: true, + args: { + name: "path", + template: "filepaths", + }, + }, + { + name: "--pre", + description: + "Include pre-release and development versions. By default, pip only finds stable versions", + }, + { + name: "--format", + description: + "Select the output format among: columns (default), freeze, or json", + }, + { + name: "--not-required", + description: + "List packages that are not dependencies of installed packages", + }, + { + name: "--exclude-editable", + description: "Exclude editable package from output", + }, + { + name: "--include-editable", + description: "Include editable package from output", + }, + { + name: "--exclude", + description: "Exclude specified package from the output", + args: { + name: "package", + generators: listPackages, + }, + }, + { + name: ["-i", "--index-url"], + description: + "Base URL of the Python Package Index (default https://pypi.org/simple)", + args: {}, + }, + { + name: "--extra-index-url", + description: + "Include pre-release and development versions. By default, pip only finds stable versions", + }, + { + name: "--no-index", + description: + "Ignore package index (only looking at --find-links URLs instead)", + }, + { + name: ["-f", "--find-links"], + description: + "If a URL or path to an html file, then parse for links to archives such as sdist (.tar.gz) or wheel (.whl) files", + args: { + name: "url", + }, + }, + ], + }, + { + name: "show", + description: "Show information about installed packages", + options: [ + { + name: ["-f", "--files"], + }, + ], + }, + { + name: "check", + description: "Verify installed packages have compatible dependencies", + }, + { + name: "config", + description: "Manage local and global configuration", + options: [ + { + name: "--editor", + description: + "Editor to use to edit the file. Uses VISUAL or EDITOR environment variables if not provided", + }, + { + name: "--global", + description: "Use the system-wide configuration file only", + }, + { + name: "--user", + description: "Use the user configuration file only", + }, + { + name: "--site", + description: "Use the current environment configuration file only", + }, + ], + }, + { + name: "search", + description: "Search PyPI for packages", + options: [ + { + name: ["-i", "--index"], + }, + ], + }, + { + name: "cache", + description: "Inspect and manage pip's wheel cache", + }, + { + name: "wheel", + description: "Build wheels from your requirements", + }, + { + name: "hash", + description: "Compute hashes of package archives", + options: [ + { + name: ["-a", "--algorithm"], + description: "The hash algorithm to use", + args: { + suggestions: [ + { name: "sha256" }, + { name: "sha384" }, + { name: "sha512" }, + ], + }, + }, + ], + }, + { + name: "completion", + description: "A helper command used for command completion", + }, + { + name: "debug", + description: "Show information useful for debugging", + options: [ + { + name: "--platform", + description: "Only use wheels compatible with platform", + args: { + name: "platform", + }, + }, + { + name: "--python-version", + description: + "The Python interpreter version to use for wheel and “Requires-Python” compatibility checks", + args: { + name: "python version", + }, + }, + { + name: "--implementation", + description: "Only use wheels compatible with Python implementation", + args: { + name: "implementation", + }, + }, + ], + }, + { + name: "help", + description: "Show help for commands", + }, + ], +}; + +export default completionSpec; diff --git a/extensions/terminal-suggest/src/completions/upstream/ruby.ts b/extensions/terminal-suggest/src/completions/upstream/ruby.ts new file mode 100644 index 00000000000..052053f7830 --- /dev/null +++ b/extensions/terminal-suggest/src/completions/upstream/ruby.ts @@ -0,0 +1,126 @@ +const completionSpec: Fig.Spec = { + name: "ruby", + description: "Interpreted object-oriented scripting language", + options: [ + { + name: "--copyright", + description: "Prints the copyright notice", + }, + { + name: "--version", + description: "Prints the version of Ruby interpreter", + }, + { + name: "-0", + description: + "Specifies the input record separator ($/) as an octal number", + args: { name: "octal" }, + }, + { + name: "-C", + description: "Causes Ruby to switch to the directory", + args: { name: "directory", template: "folders" }, + }, + { + name: "-F", + description: "Specifies input field separator ($;)", + args: { name: "pattern" }, + }, + { + name: "-I", + description: + "Used to tell Ruby where to load the library scripts. Directory path will be added to the load-path variable ($:)", + args: { name: "directory", template: "folders" }, + }, + { + name: "-K", + description: "Specifies KANJI (Japanese) encoding", + args: { name: "kcode" }, + }, + { + name: "-S", + description: + "Makes Ruby use the PATH environment variable to search for script, unless its name begins with a slash. This is used to emulate #! on machines that don't support it, in the following manner: #! /usr/local/bin/ruby # This line makes the next one a comment in Ruby \\ exec /usr/local/bin/ruby -S $0 $*", + }, + { + name: "-T", + description: "Turns on taint checks at the specified level (default 1)", + args: { name: "level" }, + }, + { + name: "-a", + description: "Turns on auto-split mode when used with -n or -p", + }, + { + name: "-c", + description: + "Causes Ruby to check the syntax of the script and exit without executing. If there are no syntax errors, Ruby will print “Syntax OK” to the standard output", + }, + { + name: ["-d", "--debug"], + description: "Turns on debug mode. $DEBUG will be set to true", + }, + { + name: "-e", + description: + "Specifies script from command-line while telling Ruby not to search the rest of arguments for a script file name", + args: { name: "command" }, + }, + { + name: ["-h", "--help"], + description: "Prints a summary of the options", + }, + { + name: "-i", + description: + "Specifies in-place-edit mode. The extension, if specified, is added to old file name to make a backup copy", + args: { name: "extension", isOptional: true }, + }, + { + name: "-l", + description: + "Enables automatic line-ending processing, which means to firstly set $\\ to the value of $/, and secondly chops every line read using chop!", + }, + { + name: "-n", + description: + "Causes Ruby to assume the following loop around your script", + }, + { + name: "-p", + description: `Acts mostly same as -n switch, but print the value of variable $_ at the each end of the loop`, + }, + { + name: "-r", + description: "Causes Ruby to load the library using require", + args: { name: "library" }, + }, + { + name: "-s", + description: + "Enables some switch parsing for switches after script name but before any file name arguments (or before a --)", + }, + { + name: ["-v", "--verbose"], + description: "Enables verbose mode", + }, + { + name: "-w", + description: + "Enables verbose mode without printing version message at the beginning. It sets the $VERBOSE variable to true", + }, + { + name: "-x", + description: + "Tells Ruby that the script is embedded in a message. Leading garbage will be discarded until the first that starts with “#!” and contains the string, “ruby”. Any meaningful switches on that line will applied. The end of script must be specified with either EOF, ^D (control-D), ^Z (control-Z), or reserved word __END__. If the directory name is specified, Ruby will switch to that directory before executing script", + args: { name: "directory", template: "folders" }, + }, + { + name: ["-y", "--yydebug"], + description: + "Turns on compiler debug mode. Ruby will print a bunch of internal state messages during compiling scripts. You don't have to specify this switch, unless you are going to debug the Ruby interpreter", + }, + ], +}; + +export default completionSpec; diff --git a/extensions/terminal-suggest/src/completions/upstream/ruff.ts b/extensions/terminal-suggest/src/completions/upstream/ruff.ts new file mode 100644 index 00000000000..e2ae919c167 --- /dev/null +++ b/extensions/terminal-suggest/src/completions/upstream/ruff.ts @@ -0,0 +1,3049 @@ +const GlobalOptions: Fig.Option[] = [ + { + name: ["-v", "--verbose"], + description: "Enable verbose logging", + }, + { + name: ["-q", "--quiet"], + description: "Print diagnostics, but nothing else", + }, + { + name: ["-s", "--silent"], + description: + 'Disable all logging (but still exit with status code "1" upon detecting diagnostics)', + }, + { + name: "--config", + description: + "Path to the `pyproject.toml` or `ruff.toml` file to use for configuration", + args: { + name: "config", + isOptional: true, + template: "filepaths", + }, + }, + { + name: "--isolated", + description: "Ignore all configuration files", + }, + { + name: "--help", + description: "Print help", + }, +]; + +const checkOptions: Fig.Option[] = [ + { + name: "--fix", + description: "Apply fixes to resolve lint violations", + }, + { + name: "--unsafe-fixes", + description: + "Include fixes that may not retain the original intent of the code", + }, + { + name: "--show-fixes", + description: "Show an enumeration of all fixed lint violations", + }, + { + name: "--diff", + description: + "Avoid writing any fixed files back; instead, output a diff for each changed file to stdout, and exit 0 if there are no diffs. Implies `--fix-only`", + }, + { + name: ["-w", "--watch"], + description: "Run in watch mode by re-running whenever files change", + }, + { + name: "--fix-only", + description: + "Apply fixes to resolve lint violations, but don't report on, or exit non-zero for, leftover violations. Implies `--fix`", + }, + { + name: "--ignore-noqa", + description: "Ignore any `# noqa` comments", + }, + { + name: "--output-format", + description: + "Output serialization format for violations. The default serialization format is 'full'", + args: { + name: "output_format", + isOptional: true, + suggestions: [ + "concise", + "full", + "json", + "json-lines", + "junit", + "grouped", + "github", + "gitlab", + "pylint", + "rdjson", + "azure", + "sarif", + ], + }, + }, + { + name: ["-o", "--output-file"], + description: "Specify file to write the linter output to (default: stdout)", + args: { + name: "output_file", + isOptional: true, + template: "filepaths", + }, + }, + { + name: "--target-version", + description: "The minimum Python version that should be supported", + args: { + name: "target_version", + isOptional: true, + suggestions: ["py37", "py38", "py39", "py310", "py311", "py312", "py313"], + }, + }, + { + name: "--preview", + description: + "Enable preview mode; checks will include unstable rules and fixes", + }, + { + name: "--extension", + description: + "List of mappings from file extension to language (one of `python`, `ipynb`, `pyi`). For example, to treat `.ipy` files as IPython notebooks, use `--extension ipy:ipynb`", + args: { + name: "extension", + isOptional: true, + }, + }, + { + name: "--statistics", + description: "Show counts for every rule with at least one violation", + }, + { + name: "--add-noqa", + description: + "Enable automatic additions of `noqa` directives to failing lines", + }, + { + name: "--show-files", + description: + "See the files Ruff will be run against with the current settings", + }, + { + name: "--show-settings", + description: "See the settings Ruff will use to lint a given Python file", + }, + { + name: ["-h", "--help"], + description: "Print help", + }, + { + name: "--select", + description: + "Comma-separated list of rule codes to enable (or ALL, to enable all rules)", + args: { + name: "select", + isOptional: true, + }, + }, + { + name: "--ignore", + description: "Comma-separated list of rule codes to disable", + args: { + name: "ignore", + isOptional: true, + }, + }, + { + name: "--extend-select", + description: + "Like --select, but adds additional rule codes on top of the selected ones", + args: { + name: "extend_select", + isOptional: true, + }, + }, + { + name: "--per-file-ignores", + description: "List of mappings from file pattern to code to exclude", + args: { + name: "per_file_ignores", + isOptional: true, + }, + }, + { + name: "--extend-per-file-ignores", + description: + "Like `--per-file-ignores`, but adds additional ignores on top of those already specified", + args: { + name: "extend_per_file_ignores", + isOptional: true, + }, + }, + { + name: "--fixable", + description: + "List of rule codes to treat as eligible for fix. Only applicable when fix itself is enabled (e.g., via `--fix`)", + args: { + name: "fixable", + isOptional: true, + }, + }, + { + name: "--unfixable", + description: + "List of rule codes to treat as ineligible for fix. Only applicable when fix itself is enabled (e.g., via `--fix`)", + args: { + name: "unfixable", + isOptional: true, + }, + }, + { + name: "--extend-fixable", + description: + "Like --fixable, but adds additional rule codes on top of those already specified", + args: { + name: "extend_fixable", + isOptional: true, + }, + }, + { + name: "--exclude", + description: + "List of paths, used to omit files and/or directories from analysis", + args: { + name: "exclude", + isOptional: true, + }, + }, + { + name: "--extend-exclude", + description: + "Like --exclude, but adds additional files and directories on top of those already excluded", + args: { + name: "extend_exclude", + isOptional: true, + }, + }, + { + name: "--respect-gitignore", + description: + "Respect file exclusions via `.gitignore` and other standard ignore files", + }, + { + name: "--force-exclude", + description: + "Enforce exclusions, even for paths passed to Ruff directly on the command-line", + }, + { + name: ["-n", "--no-cache"], + description: "Disable cache reads", + }, + { + name: "--cache-dir", + description: "Path to the cache directory", + args: { + name: "cache_dir", + isOptional: true, + template: "filepaths", + }, + }, + { + name: "--stdin-filename", + description: "The name of the file when passing it through stdin", + args: { + name: "stdin_filename", + isOptional: true, + template: "filepaths", + }, + }, + { + name: ["-e", "--exit-zero"], + description: + 'Exit with status code "0", even upon detecting lint violations', + }, + { + name: "--exit-non-zero-on-fix", + description: + "Exit with a non-zero status code if any files were modified via fix, even if no lint violations remain", + }, +]; + +const formatOptions: Fig.Option[] = [ + { + name: "--check", + description: + "Avoid writing any formatted files back; instead, exit with a non-zero status code if any files would have been modified, and zero otherwise", + }, + { + name: "--diff", + description: + "Avoid writing any formatted files back; instead, exit with a non-zero status code and the difference between the current file and how the formatted file would look like", + }, + { + name: "--extension", + description: + "List of mappings from file extension to language (one of `python`, `ipynb`, `pyi`). For example, to treat `.ipy` files as IPython notebooks, use `--extension ipy:ipynb`", + args: { + name: "extension", + isOptional: true, + }, + }, + { + name: "--target-version", + description: "The minimum Python version that should be supported", + args: { + name: "target_version", + isOptional: true, + suggestions: ["py37", "py38", "py39", "py310", "py311", "py312", "py313"], + }, + }, + { + name: "--preview", + description: + "Enable preview mode; enables unstable formatting. Use `--no-preview` to disable", + }, + { + name: ["-n", "--no-cache"], + description: "Disable cache reads (env: RUFF_NO_CACHE=)", + }, + { + name: "--cache-dir", + description: "Path to the cache directory (env: RUFF_CACHE_DIR=)", + args: { + name: "cache_dir", + template: "filepaths", + }, + }, + { + name: "--stdin-filename", + description: "The name of the file when passing it through stdin", + args: { + name: "stdin_filename", + template: "filepaths", + }, + }, + { + name: "--respect-gitignore", + description: + "Respect file exclusions via `.gitignore` and other standard ignore files", + }, + { + name: "--exclude", + description: + "List of paths, used to omit files and/or directories from analysis", + args: { + name: "exclude", + isOptional: true, + }, + }, + { + name: "--force-exclude", + description: + "Enforce exclusions, even for paths passed to Ruff directly on the command-line", + }, + { + name: "--line-length", + description: "Set the line-length", + args: { + name: "line_length", + isOptional: true, + }, + }, + { + name: "--range", + description: + "When specified, Ruff will try to only format the code in the given range", + args: { + name: "range", + isOptional: true, + }, + }, +]; + +const rules: Fig.Suggestion[] = [ + { name: "F401", description: "Unused-import" }, + { name: "F402", description: "Import-shadowed-by-loop-var" }, + { name: "F403", description: "Undefined-local-with-import-star" }, + { name: "F404", description: "Late-future-import" }, + { name: "F405", description: "Undefined-local-with-import-star-usage" }, + { + name: "F406", + description: "Undefined-local-with-nested-import-star-usage", + }, + { name: "F407", description: "Future-feature-not-defined" }, + { name: "F501", description: "Percent-format-invalid-format" }, + { name: "F502", description: "Percent-format-expected-mapping" }, + { name: "F503", description: "Percent-format-expected-sequence" }, + { name: "F504", description: "Percent-format-extra-named-arguments" }, + { name: "F505", description: "Percent-format-missing-argument" }, + { + name: "F506", + description: "Percent-format-mixed-positional-and-named", + }, + { name: "F507", description: "Percent-format-positional-count-mismatch" }, + { name: "F508", description: "Percent-format-star-requires-sequence" }, + { + name: "F509", + description: "Percent-format-unsupported-format-character", + }, + { name: "F521", description: "String-dot-format-invalid-format" }, + { name: "F522", description: "String-dot-format-extra-named-arguments" }, + { + name: "F523", + description: "String-dot-format-extra-positional-arguments", + }, + { name: "F524", description: "String-dot-format-missing-arguments" }, + { name: "F525", description: "String-dot-format-mixing-automatic" }, + { name: "F541", description: "F-string-missing-placeholders" }, + { name: "F601", description: "Multi-value-repeated-key-literal" }, + { name: "F602", description: "Multi-value-repeated-key-variable" }, + { name: "F621", description: "Expressions-in-star-assignment" }, + { name: "F622", description: "Multiple-starred-expressions" }, + { name: "F631", description: "Assert-tuple" }, + { name: "F632", description: "Is-literal" }, + { name: "F633", description: "Invalid-print-syntax" }, + { name: "F634", description: "If-tuple" }, + { name: "F701", description: "Break-outside-loop" }, + { name: "F702", description: "Continue-outside-loop" }, + { name: "F704", description: "Yield-outside-function" }, + { name: "F706", description: "Return-outside-function" }, + { name: "F707", description: "Default-except-not-last" }, + { name: "F722", description: "Forward-annotation-syntax-error" }, + { name: "F811", description: "Redefined-while-unused" }, + { name: "F821", description: "Undefined-name" }, + { name: "F822", description: "Undefined-export" }, + { name: "F823", description: "Undefined-local" }, + { name: "F841", description: "Unused-variable" }, + { name: "F842", description: "Unused-annotation" }, + { name: "F901", description: "Raise-not-implemented" }, + { name: "E101", description: "Mixed-spaces-and-tabs" }, + { name: "E111", description: "Indentation-with-invalid-multiple" }, + { name: "E112", description: "No-indented-block" }, + { name: "E113", description: "Unexpected-indentation" }, + { + name: "E114", + description: "Indentation-with-invalid-multiple-comment", + }, + { name: "E115", description: "No-indented-block-comment" }, + { name: "E116", description: "Unexpected-indentation-comment" }, + { name: "E117", description: "Over-indented" }, + { name: "E201", description: "Whitespace-after-open-bracket" }, + { name: "E202", description: "Whitespace-before-close-bracket" }, + { name: "E203", description: "Whitespace-before-punctuation" }, + { name: "E204", description: "Whitespace-after-decorator" }, + { name: "E211", description: "Whitespace-before-parameters" }, + { name: "E221", description: "Multiple-spaces-before-operator" }, + { name: "E222", description: "Multiple-spaces-after-operator" }, + { name: "E223", description: "Tab-before-operator" }, + { name: "E224", description: "Tab-after-operator" }, + { name: "E225", description: "Missing-whitespace-around-operator" }, + { + name: "E226", + description: "Missing-whitespace-around-arithmetic-operator", + }, + { + name: "E227", + description: "Missing-whitespace-around-bitwise-or-shift-operator", + }, + { + name: "E228", + description: "Missing-whitespace-around-modulo-operator", + }, + { name: "E231", description: "Missing-whitespace" }, + { name: "E241", description: "Multiple-spaces-after-comma" }, + { name: "E242", description: "Tab-after-comma" }, + { + name: "E251", + description: "Unexpected-spaces-around-keyword-parameter-equals", + }, + { + name: "E252", + description: "Missing-whitespace-around-parameter-equals", + }, + { name: "E261", description: "Too-few-spaces-before-inline-comment" }, + { name: "E262", description: "No-space-after-inline-comment" }, + { name: "E265", description: "No-space-after-block-comment" }, + { + name: "E266", + description: "Multiple-leading-hashes-for-block-comment", + }, + { name: "E271", description: "Multiple-spaces-after-keyword" }, + { name: "E272", description: "Multiple-spaces-before-keyword" }, + { name: "E273", description: "Tab-after-keyword" }, + { name: "E274", description: "Tab-before-keyword" }, + { name: "E275", description: "Missing-whitespace-after-keyword" }, + { name: "E301", description: "Blank-line-between-methods" }, + { name: "E302", description: "Blank-lines-top-level" }, + { name: "E303", description: "Too-many-blank-lines" }, + { name: "E304", description: "Blank-line-after-decorator" }, + { name: "E305", description: "Blank-lines-after-function-or-class" }, + { name: "E306", description: "Blank-lines-before-nested-definition" }, + { name: "E401", description: "Multiple-imports-on-one-line" }, + { name: "E402", description: "Module-import-not-at-top-of-file" }, + { name: "E501", description: "Line-too-long" }, + { name: "E502", description: "Redundant-backslash" }, + { name: "E701", description: "Multiple-statements-on-one-line-colon" }, + { + name: "E702", + description: "Multiple-statements-on-one-line-semicolon", + }, + { name: "E703", description: "Useless-semicolon" }, + { name: "E711", description: "None-comparison" }, + { name: "E712", description: "True-false-comparison" }, + { name: "E713", description: "Not-in-test" }, + { name: "E714", description: "Not-is-test" }, + { name: "E721", description: "Type-comparison" }, + { name: "E722", description: "Bare-except" }, + { name: "E731", description: "Lambda-assignment" }, + { name: "E741", description: "Ambiguous-variable-name" }, + { name: "E742", description: "Ambiguous-class-name" }, + { name: "E743", description: "Ambiguous-function-name" }, + { name: "E902", description: "Io-error" }, + { name: "W191", description: "Tab-indentation" }, + { name: "W291", description: "Trailing-whitespace" }, + { name: "W292", description: "Missing-newline-at-end-of-file" }, + { name: "W293", description: "Blank-line-with-whitespace" }, + { name: "W391", description: "Too-many-newlines-at-end-of-file" }, + { name: "W505", description: "Doc-line-too-long" }, + { name: "W605", description: "Invalid-escape-sequence" }, + { name: "C901", description: "Complex-structure" }, + { name: "N801", description: "Invalid-class-name" }, + { name: "N802", description: "Invalid-function-name" }, + { name: "N803", description: "Invalid-argument-name" }, + { + name: "N804", + description: "Invalid-first-argument-name-for-class-method", + }, + { name: "N805", description: "Invalid-first-argument-name-for-method" }, + { name: "N806", description: "Non-lowercase-variable-in-function" }, + { name: "N807", description: "Dunder-function-name" }, + { name: "N811", description: "Constant-imported-as-non-constant" }, + { name: "N812", description: "Lowercase-imported-as-non-lowercase" }, + { name: "N813", description: "Camelcase-imported-as-lowercase" }, + { name: "N814", description: "Camelcase-imported-as-constant" }, + { name: "N815", description: "Mixed-case-variable-in-class-scope" }, + { name: "N816", description: "Mixed-case-variable-in-global-scope" }, + { name: "N817", description: "Camelcase-imported-as-acronym" }, + { name: "N818", description: "Error-suffix-on-exception-name" }, + { name: "N999", description: "Invalid-module-name" }, + { name: "D100", description: "Undocumented-public-module" }, + { name: "D101", description: "Undocumented-public-class" }, + { name: "D102", description: "Undocumented-public-method" }, + { name: "D103", description: "Undocumented-public-function" }, + { name: "D104", description: "Undocumented-public-package" }, + { name: "D105", description: "Undocumented-magic-method" }, + { name: "D106", description: "Undocumented-public-nested-class" }, + { name: "D107", description: "Undocumented-public-init" }, + { name: "D200", description: "Fits-on-one-line" }, + { name: "D201", description: "No-blank-line-before-function" }, + { name: "D202", description: "No-blank-line-after-function" }, + { name: "D203", description: "One-blank-line-before-class" }, + { name: "D204", description: "One-blank-line-after-class" }, + { name: "D205", description: "Blank-line-after-summary" }, + { name: "D206", description: "Indent-with-spaces" }, + { name: "D207", description: "Under-indentation" }, + { name: "D208", description: "Over-indentation" }, + { name: "D209", description: "New-line-after-last-paragraph" }, + { name: "D210", description: "Surrounding-whitespace" }, + { name: "D211", description: "Blank-line-before-class" }, + { name: "D212", description: "Multi-line-summary-first-line" }, + { name: "D213", description: "Multi-line-summary-second-line" }, + { name: "D214", description: "Section-not-over-indented" }, + { name: "D215", description: "Section-underline-not-over-indented" }, + { name: "D300", description: "Triple-single-quotes" }, + { name: "D301", description: "Escape-sequence-in-docstring" }, + { name: "D400", description: "Ends-in-period" }, + { name: "D401", description: "Non-imperative-mood" }, + { name: "D402", description: "No-signature" }, + { name: "D403", description: "First-line-capitalized" }, + { name: "D404", description: "Docstring-starts-with-this" }, + { name: "D405", description: "Capitalize-section-name" }, + { name: "D406", description: "New-line-after-section-name" }, + { name: "D407", description: "Dashed-underline-after-section" }, + { name: "D408", description: "Section-underline-after-name" }, + { name: "D409", description: "Section-underline-matches-section-length" }, + { name: "D410", description: "No-blank-line-after-section" }, + { name: "D411", description: "No-blank-line-before-section" }, + { name: "D412", description: "Blank-lines-between-header-and-content" }, + { name: "D413", description: "Blank-line-after-last-section" }, + { name: "D414", description: "Empty-docstring-section" }, + { name: "D415", description: "Ends-in-punctuation" }, + { name: "D416", description: "Section-name-ends-in-colon" }, + { name: "D417", description: "Undocumented-param" }, + { name: "D418", description: "Overload-with-docstring" }, + { name: "D419", description: "Empty-docstring" }, + { name: "I001", description: "Unsorted-imports" }, + { name: "I002", description: "Missing-required-import" }, + { name: "UP001", description: "Useless-metaclass-type" }, + { name: "UP003", description: "Type-of-primitive" }, + { name: "UP004", description: "Useless-object-inheritance" }, + { name: "UP005", description: "Deprecated-unittest-alias" }, + { name: "UP006", description: "Non-pep585-annotation" }, + { name: "UP007", description: "Non-pep604-annotation" }, + { name: "UP008", description: "Super-call-with-parameters" }, + { name: "UP009", description: "Utf8-encoding-declaration" }, + { name: "UP010", description: "Unnecessary-future-import" }, + { name: "UP011", description: "Lru-cache-without-parameters" }, + { name: "UP012", description: "Unnecessary-encode-utf8" }, + { name: "UP013", description: "Convert-typed-dict-functional-to-class" }, + { name: "UP014", description: "Convert-named-tuple-functional-to-class" }, + { name: "UP015", description: "Redundant-open-modes" }, + { name: "UP017", description: "Datetime-timezone-utc" }, + { name: "UP018", description: "Native-literals" }, + { name: "UP019", description: "Typing-text-str-alias" }, + { name: "UP020", description: "Open-alias" }, + { name: "UP021", description: "Replace-universal-newlines" }, + { name: "UP022", description: "Replace-stdout-stderr" }, + { name: "UP023", description: "Deprecated-c-element-tree" }, + { name: "UP024", description: "Os-error-alias" }, + { name: "UP025", description: "Unicode-kind-prefix" }, + { name: "UP026", description: "Deprecated-mock-import" }, + { name: "UP027", description: "Unpacked-list-comprehension" }, + { name: "UP028", description: "Yield-in-for-loop" }, + { name: "UP029", description: "Unnecessary-builtin-import" }, + { name: "UP030", description: "Format-literals" }, + { name: "UP031", description: "Printf-string-formatting" }, + { name: "UP032", description: "F-string" }, + { name: "UP033", description: "Lru-cache-with-maxsize-none" }, + { name: "UP034", description: "Extraneous-parentheses" }, + { name: "UP035", description: "Deprecated-import" }, + { name: "UP036", description: "Outdated-version-block" }, + { name: "UP037", description: "Quoted-annotation" }, + { name: "UP038", description: "Non-pep604-isinstance" }, + { name: "UP039", description: "Unnecessary-class-parentheses" }, + { name: "UP040", description: "Non-pep695-type-alias" }, + { name: "UP041", description: "Timeout-error-alias" }, + { name: "UP042", description: "Replace-str-enum" }, + { name: "UP043", description: "Unnecessary-default-type-args" }, + { name: "UP044", description: "Non-pep646-unpack" }, + { name: "YTT101", description: "Sys-version-slice3" }, + { name: "YTT102", description: "Sys-version2" }, + { name: "YTT103", description: "Sys-version-cmp-str3" }, + { name: "YTT201", description: "Sys-version-info0-eq3" }, + { name: "YTT202", description: "Six-py3" }, + { name: "YTT203", description: "Sys-version-info1-cmp-int" }, + { name: "YTT204", description: "Sys-version-info-minor-cmp-int" }, + { name: "YTT301", description: "Sys-version0" }, + { name: "YTT302", description: "Sys-version-cmp-str10" }, + { name: "YTT303", description: "Sys-version-slice1" }, + { name: "ANN001", description: "Missing-type-function-argument" }, + { name: "ANN002", description: "Missing-type-args" }, + { name: "ANN003", description: "Missing-type-kwargs" }, + { + name: "ANN201", + description: "Missing-return-type-undocumented-public-function", + }, + { name: "ANN202", description: "Missing-return-type-private-function" }, + { name: "ANN204", description: "Missing-return-type-special-method" }, + { name: "ANN205", description: "Missing-return-type-static-method" }, + { name: "ANN206", description: "Missing-return-type-class-method" }, + { name: "ANN401", description: "Any-type" }, + { name: "ASYNC100", description: "Cancel-scope-no-checkpoint" }, + { name: "ASYNC105", description: "Trio-sync-call" }, + { name: "ASYNC109", description: "Async-function-with-timeout" }, + { name: "ASYNC110", description: "Async-busy-wait" }, + { name: "ASYNC115", description: "Async-zero-sleep" }, + { name: "ASYNC116", description: "Long-sleep-not-forever" }, + { name: "ASYNC210", description: "Blocking-http-call-in-async-function" }, + { name: "ASYNC220", description: "Create-subprocess-in-async-function" }, + { name: "ASYNC221", description: "Run-process-in-async-function" }, + { name: "ASYNC222", description: "Wait-for-process-in-async-function" }, + { name: "ASYNC230", description: "Blocking-open-call-in-async-function" }, + { name: "ASYNC251", description: "Blocking-sleep-in-async-function" }, + { name: "S101", description: "Assert" }, + { name: "S102", description: "Exec-builtin" }, + { name: "S103", description: "Bad-file-permissions" }, + { name: "S104", description: "Hardcoded-bind-all-interfaces" }, + { name: "S105", description: "Hardcoded-password-string" }, + { name: "S106", description: "Hardcoded-password-func-arg" }, + { name: "S107", description: "Hardcoded-password-default" }, + { name: "S108", description: "Hardcoded-temp-file" }, + { name: "S110", description: "Try-except-pass" }, + { name: "S112", description: "Try-except-continue" }, + { name: "S113", description: "Request-without-timeout" }, + { name: "S201", description: "Flask-debug-true" }, + { name: "S202", description: "Tarfile-unsafe-members" }, + { name: "S301", description: "Suspicious-pickle-usage" }, + { name: "S302", description: "Suspicious-marshal-usage" }, + { name: "S303", description: "Suspicious-insecure-hash-usage" }, + { name: "S304", description: "Suspicious-insecure-cipher-usage" }, + { name: "S305", description: "Suspicious-insecure-cipher-mode-usage" }, + { name: "S306", description: "Suspicious-mktemp-usage" }, + { name: "S307", description: "Suspicious-eval-usage" }, + { name: "S308", description: "Suspicious-mark-safe-usage" }, + { name: "S310", description: "Suspicious-url-open-usage" }, + { + name: "S311", + description: "Suspicious-non-cryptographic-random-usage", + }, + { name: "S312", description: "Suspicious-telnet-usage" }, + { name: "S313", description: "Suspicious-xmlc-element-tree-usage" }, + { name: "S314", description: "Suspicious-xml-element-tree-usage" }, + { name: "S315", description: "Suspicious-xml-expat-reader-usage" }, + { name: "S316", description: "Suspicious-xml-expat-builder-usage" }, + { name: "S317", description: "Suspicious-xml-sax-usage" }, + { name: "S318", description: "Suspicious-xml-mini-dom-usage" }, + { name: "S319", description: "Suspicious-xml-pull-dom-usage" }, + { name: "S320", description: "Suspicious-xmle-tree-usage" }, + { name: "S321", description: "Suspicious-ftp-lib-usage" }, + { name: "S323", description: "Suspicious-unverified-context-usage" }, + { name: "S324", description: "Hashlib-insecure-hash-function" }, + { name: "S401", description: "Suspicious-telnetlib-import" }, + { name: "S402", description: "Suspicious-ftplib-import" }, + { name: "S403", description: "Suspicious-pickle-import" }, + { name: "S404", description: "Suspicious-subprocess-import" }, + { name: "S405", description: "Suspicious-xml-etree-import" }, + { name: "S406", description: "Suspicious-xml-sax-import" }, + { name: "S407", description: "Suspicious-xml-expat-import" }, + { name: "S408", description: "Suspicious-xml-minidom-import" }, + { name: "S409", description: "Suspicious-xml-pulldom-import" }, + { name: "S410", description: "Suspicious-lxml-import" }, + { name: "S411", description: "Suspicious-xmlrpc-import" }, + { name: "S412", description: "Suspicious-httpoxy-import" }, + { name: "S413", description: "Suspicious-pycrypto-import" }, + { name: "S415", description: "Suspicious-pyghmi-import" }, + { name: "S501", description: "Request-with-no-cert-validation" }, + { name: "S502", description: "Ssl-insecure-version" }, + { name: "S503", description: "Ssl-with-bad-defaults" }, + { name: "S504", description: "Ssl-with-no-version" }, + { name: "S505", description: "Weak-cryptographic-key" }, + { name: "S506", description: "Unsafe-yaml-load" }, + { name: "S507", description: "Ssh-no-host-key-verification" }, + { name: "S508", description: "Snmp-insecure-version" }, + { name: "S509", description: "Snmp-weak-cryptography" }, + { name: "S601", description: "Paramiko-call" }, + { name: "S602", description: "Subprocess-popen-with-shell-equals-true" }, + { name: "S603", description: "Subprocess-without-shell-equals-true" }, + { name: "S604", description: "Call-with-shell-equals-true" }, + { name: "S605", description: "Start-process-with-a-shell" }, + { name: "S606", description: "Start-process-with-no-shell" }, + { name: "S607", description: "Start-process-with-partial-path" }, + { name: "S608", description: "Hardcoded-sql-expression" }, + { name: "S609", description: "Unix-command-wildcard-injection" }, + { name: "S610", description: "Django-extra" }, + { name: "S611", description: "Django-raw-sql" }, + { name: "S612", description: "Logging-config-insecure-listen" }, + { name: "S701", description: "Jinja2-autoescape-false" }, + { name: "S702", description: "Mako-templates" }, + { name: "BLE001", description: "Do not catch blind exception" }, + { name: "B002", description: "Unary-prefix-increment-decrement" }, + { name: "B003", description: "Assignment-to-os-environ" }, + { name: "B004", description: "Unreliable-callable-check" }, + { name: "B005", description: "Strip-with-multi-characters" }, + { name: "B006", description: "Mutable-argument-default" }, + { name: "B007", description: "Unused-loop-control-variable" }, + { name: "B008", description: "Function-call-in-default-argument" }, + { name: "B009", description: "Get-attr-with-constant" }, + { name: "B010", description: "Set-attr-with-constant" }, + { name: "B011", description: "Assert-false" }, + { name: "B012", description: "Jump-statement-in-finally" }, + { name: "B013", description: "Redundant-tuple-in-exception-handler" }, + { name: "B014", description: "Duplicate-handler-exception" }, + { name: "B015", description: "Useless-comparison" }, + { name: "B016", description: "Raise-literal" }, + { name: "B017", description: "Assert-raises-exception" }, + { name: "B018", description: "Useless-expression" }, + { name: "B019", description: "Cached-instance-method" }, + { name: "B020", description: "Loop-variable-overrides-iterator" }, + { name: "B021", description: "F-string-docstring" }, + { name: "B022", description: "Useless-contextlib-suppress" }, + { name: "B023", description: "Function-uses-loop-variable" }, + { + name: "B024", + description: "Abstract-base-class-without-abstract-method", + }, + { name: "B025", description: "Duplicate-try-block-exception" }, + { name: "B026", description: "Star-arg-unpacking-after-keyword-arg" }, + { name: "B027", description: "Empty-method-without-abstract-decorator" }, + { name: "B028", description: "No-explicit-stacklevel" }, + { name: "B029", description: "Except-with-empty-tuple" }, + { name: "B030", description: "Except-with-non-exception-classes" }, + { name: "B031", description: "Reuse-of-groupby-generator" }, + { name: "B032", description: "Unintentional-type-annotation" }, + { name: "B033", description: "Duplicate-value" }, + { name: "B034", description: "Re-sub-positional-args" }, + { name: "B035", description: "Static-key-dict-comprehension" }, + { name: "B039", description: "Mutable-contextvar-default" }, + { name: "B901", description: "Return-in-generator" }, + { name: "B904", description: "Raise-without-from-inside-except" }, + { name: "B905", description: "Zip-without-explicit-strict" }, + { name: "B909", description: "Loop-iterator-mutation" }, + { + name: "FBT001", + description: "Boolean-typed positional argument in function definition", + }, + { + name: "FBT002", + description: "Boolean default positional argument in function definition", + }, + { + name: "FBT003", + description: "Boolean positional value in function call", + }, + { + name: "A001", + description: "Builtin-variable-shadowing", + }, + { + name: "A002", + description: "Builtin-argument-shadowing", + }, + { + name: "A003", + description: "Builtin-attribute-shadowing", + }, + { + name: "A004", + description: "Builtin-import-shadowing", + }, + { + name: "A005", + description: "Builtin-module-shadowing", + }, + { + name: "A006", + description: "Builtin-lambda-argument-shadowing", + }, + { + name: "COM812", + description: "Missing-trailing-comma", + }, + { + name: "COM818", + description: "Trailing-comma-on-bare-tuple", + }, + { + name: "COM819", + description: "Prohibited-trailing-comma", + }, + { + name: "CPY001", + description: "Missing-copyright-notice", + }, + { + name: "C400", + description: "Unnecessary-generator-list", + }, + { + name: "C401", + description: "Unnecessary-generator-set", + }, + { + name: "C402", + description: "Unnecessary-generator-dict", + }, + { + name: "C403", + description: "Unnecessary-list-comprehension-set", + }, + { + name: "C404", + description: "Unnecessary-list-comprehension-dict", + }, + { + name: "C405", + description: "Unnecessary-literal-set", + }, + { + name: "C406", + description: "Unnecessary-literal-dict", + }, + { + name: "C408", + description: "Unnecessary-collection-call", + }, + { + name: "C409", + description: "Unnecessary-literal-within-tuple-call", + }, + { + name: "C410", + description: "Unnecessary-literal-within-list-call", + }, + { + name: "C411", + description: "Unnecessary-list-call", + }, + { + name: "C413", + description: "Unnecessary-call-around-sorted", + }, + { + name: "C414", + description: "Unnecessary-double-cast-or-process", + }, + { + name: "C415", + description: "Unnecessary-subscript-reversal", + }, + { + name: "C416", + description: "Unnecessary-comprehension", + }, + { + name: "C417", + description: "Unnecessary-map", + }, + { + name: "C418", + description: "Unnecessary-literal-within-dict-call", + }, + { + name: "C419", + description: "Unnecessary-comprehension-in-call", + }, + { + name: "C420", + description: "Unnecessary-dict-comprehension-for-iterable", + }, + { + name: "DTZ001", + description: "Call-datetime-without-tzinfo", + }, + { + name: "DTZ002", + description: "Call-datetime-today", + }, + { + name: "DTZ003", + description: "Call-datetime-utcnow", + }, + { + name: "DTZ004", + description: "Call-datetime-utcfromtimestamp", + }, + { + name: "DTZ005", + description: "Call-datetime-now-without-tzinfo", + }, + { + name: "DTZ006", + description: "Call-datetime-fromtimestamp", + }, + { + name: "DTZ007", + description: "Call-datetime-strptime-without-zone", + }, + { + name: "DTZ011", + description: "Call-date-today", + }, + { + name: "DTZ012", + description: "Call-date-fromtimestamp", + }, + { + name: "DTZ901", + description: "Datetime-min-max", + }, + { + name: "DJ001", + description: "Django-nullable-model-string-field", + }, + { + name: "DJ003", + description: "Django-locals-in-render-function", + }, + { + name: "DJ006", + description: "Django-exclude-with-model-form", + }, + { + name: "DJ007", + description: "Django-all-with-model-form", + }, + { + name: "DJ008", + description: "Django-model-without-dunder-str", + }, + { + name: "DJ012", + description: "Django-unordered-body-content-in-model", + }, + { + name: "DJ013", + description: "Django-non-leading-receiver-decorator", + }, + { + name: "EM101", + description: "Raw-string-in-exception", + }, + { + name: "EM102", + description: "F-string-in-exception", + }, + { + name: "EM103", + description: "Dot-format-in-exception", + }, + { + name: "EXE001", + description: "Shebang-not-executable", + }, + { + name: "EXE002", + description: "Shebang-missing-executable-file", + }, + { + name: "EXE003", + description: "Shebang-missing-python", + }, + { + name: "EXE004", + description: "Shebang-leading-whitespace", + }, + { + name: "EXE005", + description: "Shebang-not-first-line", + }, + { + name: "FA100", + description: "Future-rewritable-type-annotation", + }, + { + name: "FA102", + description: "Future-required-type-annotation", + }, + { + name: "ISC001", + description: "Single-line-implicit-string-concatenation", + }, + { + name: "ISC002", + description: "Multi-line-implicit-string-concatenation", + }, + { + name: "ISC003", + description: "Explicit-string-concatenation", + }, + { + name: "ICN001", + description: "Unconventional-import-alias", + }, + { + name: "ICN002", + description: "Banned-import-alias", + }, + { + name: "ICN003", + description: "Banned-import-from", + }, + { + name: "LOG001", + description: "Direct-logger-instantiation", + }, + { + name: "LOG002", + description: "Invalid-get-logger-argument", + }, + { + name: "LOG007", + description: "Exception-without-exc-info", + }, + { + name: "LOG009", + description: "Undocumented-warn", + }, + { + name: "LOG015", + description: "Root-logger-call", + }, + { + name: "G001", + description: "Logging-string-format", + }, + { + name: "G002", + description: "Logging-percent-format", + }, + { + name: "G003", + description: "Logging-string-concat", + }, + { + name: "G004", + description: "Logging-f-string", + }, + { + name: "G010", + description: "Logging-warn", + }, + { + name: "G101", + description: "Logging-extra-attr-clash", + }, + { + name: "G201", + description: "Logging-exc-info", + }, + { + name: "G202", + description: "Logging-redundant-exc-info", + }, + { + name: "INP001", + description: "Implicit-namespace-package", + }, + { + name: "PIE790", + description: "Unnecessary-placeholder", + }, + { + name: "PIE794", + description: "Duplicate-class-field-definition", + }, + { + name: "PIE796", + description: "Non-unique-enums", + }, + { + name: "PIE800", + description: "Unnecessary-spread", + }, + { + name: "PIE804", + description: "Unnecessary-dict-kwargs", + }, + { + name: "PIE807", + description: "Reimplemented-container-builtin", + }, + { + name: "PIE808", + description: "Unnecessary-range-start", + }, + { + name: "PIE810", + description: "Multiple-starts-ends-with", + }, + { + name: "T201", + description: "Print", + }, + { + name: "T203", + description: "P-print", + }, + { + name: "PYI001", + description: "Unprefixed-type-param", + }, + { + name: "PYI002", + description: "Complex-if-statement-in-stub", + }, + { + name: "PYI003", + description: "Unrecognized-version-info-check", + }, + { + name: "PYI004", + description: "Patch-version-comparison", + }, + { + name: "PYI005", + description: "Wrong-tuple-length-version-comparison", + }, + { + name: "PYI006", + description: "Bad-version-info-comparison", + }, + { + name: "PYI007", + description: "Unrecognized-platform-check", + }, + { + name: "PYI008", + description: "Unrecognized-platform-name", + }, + { + name: "PYI009", + description: "Pass-statement-stub-body", + }, + { + name: "PYI010", + description: "Non-empty-stub-body", + }, + { + name: "PYI011", + description: "Typed-argument-default-in-stub", + }, + { + name: "PYI012", + description: "Pass-in-class-body", + }, + { + name: "PYI013", + description: "Ellipsis-in-non-empty-class-body", + }, + { + name: "PYI014", + description: "Argument-default-in-stub", + }, + { + name: "PYI015", + description: "Assignment-default-in-stub", + }, + { + name: "PYI016", + description: "Duplicate-union-member", + }, + { + name: "PYI017", + description: "Complex-assignment-in-stub", + }, + { + name: "PYI018", + description: "Unused-private-type-var", + }, + { + name: "PYI019", + description: "Custom-type-var-return-type", + }, + { + name: "PYI020", + description: "Quoted-annotation-in-stub", + }, + { + name: "PYI021", + description: "Docstring-in-stub", + }, + { + name: "PYI024", + description: "Collections-named-tuple", + }, + { + name: "PYI025", + description: "Unaliased-collections-abc-set-import", + }, + { + name: "PYI026", + description: "Type-alias-without-annotation", + }, + { + name: "PYI029", + description: "Str-or-repr-defined-in-stub", + }, + { + name: "PYI030", + description: "Unnecessary-literal-union", + }, + { + name: "PYI032", + description: "Any-eq-ne-annotation", + }, + { + name: "PYI033", + description: "Type-comment-in-stub", + }, + { + name: "PYI034", + description: "Non-self-return-type", + }, + { + name: "PYI035", + description: "Unassigned-special-variable-in-stub", + }, + { + name: "PYI036", + description: "Bad-exit-annotation", + }, + { + name: "PYI041", + description: "Redundant-numeric-union", + }, + { + name: "PYI042", + description: "Snake-case-type-alias", + }, + { + name: "PYI043", + description: "T-suffixed-type-alias", + }, + { + name: "PYI044", + description: "Future-annotations-in-stub", + }, + { + name: "PYI045", + description: "Iter-method-return-iterable", + }, + { + name: "PYI046", + description: "Unused-private-protocol", + }, + { + name: "PYI047", + description: "Unused-private-type-alias", + }, + { + name: "PYI048", + description: "Stub-body-multiple-statements", + }, + { + name: "PYI049", + description: "Unused-private-typed-dict", + }, + { + name: "PYI050", + description: "No-return-argument-annotation-in-stub", + }, + { + name: "PYI051", + description: "Redundant-literal-union", + }, + { + name: "PYI052", + description: "Unannotated-assignment-in-stub", + }, + { + name: "PYI053", + description: "String-or-bytes-too-long", + }, + { + name: "PYI054", + description: "Numeric-literal-too-long", + }, + { + name: "PYI055", + description: "Unnecessary-type-union", + }, + { + name: "PYI056", + description: "Unsupported-method-call-on-all", + }, + { + name: "PYI057", + description: "Byte-string-usage", + }, + { + name: "PYI058", + description: "Generator-return-from-iter-method", + }, + { + name: "PYI059", + description: "Generic-not-last-base-class", + }, + { + name: "PYI061", + description: "Redundant-none-literal", + }, + { + name: "PYI062", + description: "Duplicate-literal-member", + }, + { + name: "PYI063", + description: "Pep484-style-positional-only-parameter", + }, + { + name: "PYI064", + description: "Redundant-final-literal", + }, + { + name: "PYI066", + description: "Bad-version-info-order", + }, + { + name: "PT001", + description: "Pytest-fixture-incorrect-parentheses-style", + }, + { + name: "PT002", + description: "Pytest-fixture-positional-args", + }, + { + name: "PT003", + description: "Pytest-extraneous-scope-function", + }, + { + name: "PT004", + description: "Pytest-missing-fixture-name-underscore", + }, + { + name: "PT005", + description: "Pytest-incorrect-fixture-name-underscore", + }, + { + name: "PT006", + description: "Pytest-parametrize-names-wrong-type", + }, + { + name: "PT007", + description: "Pytest-parametrize-values-wrong-type", + }, + { + name: "PT008", + description: "Pytest-patch-with-lambda", + }, + { + name: "PT009", + description: "Pytest-unittest-assertion", + }, + { + name: "PT010", + description: "Pytest-raises-without-exception", + }, + { + name: "PT011", + description: "Pytest-raises-too-broad", + }, + { + name: "PT012", + description: "Pytest-raises-with-multiple-statements", + }, + { + name: "PT013", + description: "Pytest-incorrect-pytest-import", + }, + { + name: "PT014", + description: "Pytest-duplicate-parametrize-test-cases", + }, + { + name: "PT015", + description: "Pytest-assert-always-false", + }, + { + name: "PT016", + description: "Pytest-fail-without-message", + }, + { + name: "PT017", + description: "Pytest-assert-in-except", + }, + { + name: "PT018", + description: "Pytest-composite-assertion", + }, + { + name: "PT019", + description: "Pytest-fixture-param-without-value", + }, + { + name: "PT020", + description: "Pytest-deprecated-yield-fixture", + }, + { + name: "PT021", + description: "Pytest-fixture-finalizer-callback", + }, + { + name: "PT022", + description: "Pytest-useless-yield-fixture", + }, + { + name: "PT023", + description: "Pytest-incorrect-mark-parentheses-style", + }, + { + name: "PT024", + description: "Pytest-unnecessary-asyncio-mark-on-fixture", + }, + { + name: "PT025", + description: "Pytest-erroneous-use-fixtures-on-fixture", + }, + { + name: "PT026", + description: "Pytest-use-fixtures-without-parameters", + }, + { + name: "PT027", + description: "Pytest-unittest-raises-assertion", + }, + { + name: "Q000", + description: "Bad-quotes-inline-string", + }, + { + name: "Q001", + description: "Bad-quotes-multiline-string", + }, + { + name: "Q002", + description: "Bad-quotes-docstring", + }, + { + name: "Q003", + description: "Avoidable-escaped-quote", + }, + { + name: "Q004", + description: "Unnecessary-escaped-quote", + }, + { + name: "RSE102", + description: "Unnecessary-paren-on-raise-exception", + }, + { + name: "RET501", + description: "Unnecessary-return-none", + }, + { + name: "RET502", + description: "Implicit-return-value", + }, + { + name: "RET503", + description: "Implicit-return", + }, + { + name: "RET504", + description: "Unnecessary-assign", + }, + { + name: "RET505", + description: "Superfluous-else-return", + }, + { + name: "RET506", + description: "Superfluous-else-raise", + }, + { + name: "RET507", + description: "Superfluous-else-continue", + }, + { + name: "RET508", + description: "Superfluous-else-break", + }, + { + name: "SLF001", + description: "Private-member-access", + }, + { + name: "SLOT000", + description: "No-slots-in-str-subclass", + }, + { + name: "SLOT001", + description: "No-slots-in-tuple-subclass", + }, + { + name: "SLOT002", + description: "No-slots-in-namedtuple-subclass", + }, + { + name: "SIM101", + description: "Duplicate-isinstance-call", + }, + { + name: "SIM102", + description: "Collapsible-if", + }, + { + name: "SIM103", + description: "Needless-bool", + }, + { + name: "SIM105", + description: "Suppressible-exception", + }, + { + name: "SIM107", + description: "Return-in-try-except-finally", + }, + { + name: "SIM108", + description: "If-else-block-instead-of-if-exp", + }, + { + name: "SIM109", + description: "Compare-with-tuple", + }, + { + name: "SIM110", + description: "Reimplemented-builtin", + }, + { + name: "SIM112", + description: "Uncapitalized-environment-variables", + }, + { + name: "SIM113", + description: "Enumerate-for-loop", + }, + { + name: "SIM114", + description: "If-with-same-arms", + }, + { + name: "SIM115", + description: "Open-file-with-context-handler", + }, + { + name: "SIM116", + description: "If-else-block-instead-of-dict-lookup", + }, + { + name: "SIM117", + description: "Multiple-with-statements", + }, + { + name: "SIM118", + description: "In-dict-keys", + }, + { + name: "SIM201", + description: "Negate-equal-op", + }, + { + name: "SIM202", + description: "Negate-not-equal-op", + }, + { + name: "SIM208", + description: "Double-negation", + }, + { + name: "SIM210", + description: "If-expr-with-true-false", + }, + { + name: "SIM211", + description: "If-expr-with-false-true", + }, + { + name: "SIM212", + description: "If-expr-with-twisted-arms", + }, + { + name: "SIM220", + description: "Expr-and-not-expr", + }, + { + name: "SIM221", + description: "Expr-or-not-expr", + }, + { + name: "SIM222", + description: "Expr-or-true", + }, + { + name: "SIM223", + description: "Expr-and-false", + }, + { + name: "SIM300", + description: "Yoda-conditions", + }, + { + name: "SIM401", + description: "If-else-block-instead-of-dict-get", + }, + { + name: "SIM905", + description: "Split-static-string", + }, + { + name: "SIM910", + description: "Dict-get-with-none-default", + }, + { + name: "SIM911", + description: "Zip-dict-keys-and-values", + }, + { + name: "TID251", + description: "Banned-api", + }, + { + name: "TID252", + description: "Relative-imports", + }, + { + name: "TID253", + description: "Banned-module-level-imports", + }, + { + name: "TC001", + description: "Typing-only-first-party-import", + }, + { + name: "TC002", + description: "Typing-only-third-party-import", + }, + { + name: "TC003", + description: "Typing-only-standard-library-import", + }, + { + name: "TC004", + description: "Runtime-import-in-type-checking-block", + }, + { + name: "TC005", + description: "Empty-type-checking-block", + }, + { + name: "TC006", + description: "Runtime-cast-value", + }, + { + name: "TC007", + description: "Unquoted-type-alias", + }, + { + name: "TC008", + description: "Quoted-type-alias", + }, + { + name: "TC010", + description: "Runtime-string-union", + }, + { + name: "INT001", + description: "F-string-in-get-text-func-call", + }, + { + name: "INT002", + description: "Format-in-get-text-func-call", + }, + { + name: "INT003", + description: "Printf-in-get-text-func-call", + }, + { + name: "ARG001", + description: "Unused-function-argument", + }, + { + name: "ARG002", + description: "Unused-method-argument", + }, + { + name: "ARG003", + description: "Unused-class-method-argument", + }, + { + name: "ARG004", + description: "Unused-static-method-argument", + }, + { + name: "ARG005", + description: "Unused-lambda-argument", + }, + { + name: "PTH100", + description: "Os-path-abspath", + }, + { + name: "PTH101", + description: "Os-chmod", + }, + { + name: "PTH102", + description: "Os-mkdir", + }, + { + name: "PTH103", + description: "Os-makedirs", + }, + { + name: "PTH104", + description: "Os-rename", + }, + { + name: "PTH105", + description: "Os-replace", + }, + { + name: "PTH106", + description: "Os-rmdir", + }, + { + name: "PTH107", + description: "Os-remove", + }, + { + name: "PTH108", + description: "Os-unlink", + }, + { + name: "PTH109", + description: "Os-getcwd", + }, + { + name: "PTH110", + description: "Os-path-exists", + }, + { + name: "PTH111", + description: "Os-path-expanduser", + }, + { + name: "PTH112", + description: "Os-path-isdir", + }, + { + name: "PTH113", + description: "Os-path-isfile", + }, + { + name: "PTH114", + description: "Os-path-islink", + }, + { + name: "PTH115", + description: "Os-readlink", + }, + { + name: "PTH116", + description: "Os-stat", + }, + { + name: "PTH117", + description: "Os-path-isabs", + }, + { + name: "PTH118", + description: "Os-path-join", + }, + { + name: "PTH119", + description: "Os-path-basename", + }, + { + name: "PTH120", + description: "Os-path-dirname", + }, + { + name: "PTH121", + description: "Os-path-samefile", + }, + { + name: "PTH122", + description: "Os-path-splitext", + }, + { + name: "PTH123", + description: "Builtin-open", + }, + { + name: "PTH124", + description: "Py-path", + }, + { + name: "PTH201", + description: "Path-constructor-current-directory", + }, + { + name: "PTH202", + description: "Os-path-getsize", + }, + { + name: "PTH203", + description: "Os-path-getatime", + }, + { + name: "PTH204", + description: "Os-path-getmtime", + }, + { + name: "PTH205", + description: "Os-path-getctime", + }, + { + name: "PTH206", + description: "Os-sep-split", + }, + { + name: "PTH207", + description: "Glob", + }, + { + name: "PTH208", + description: "Os-listdir", + }, + { + name: "TD001", + description: "Invalid-todo-tag", + }, + { + name: "TD002", + description: "Missing-todo-author", + }, + { + name: "TD003", + description: "Missing-todo-link", + }, + { + name: "TD004", + description: "Missing-todo-colon", + }, + { + name: "TD005", + description: "Missing-todo-description", + }, + { + name: "TD006", + description: "Invalid-todo-capitalization", + }, + { + name: "TD007", + description: "Missing-space-after-todo-colon", + }, + { + name: "FIX001", + description: "Line-contains-fixme", + }, + { + name: "FIX002", + description: "Line-contains-todo", + }, + { + name: "FIX003", + description: "Line-contains-xxx", + }, + { + name: "FIX004", + description: "Line-contains-hack", + }, + { + name: "ERA001", + description: "Commented-out-code", + }, + { + name: "PD002", + description: "Pandas-use-of-inplace-argument", + }, + { + name: "PD003", + description: "Pandas-use-of-dot-is-null", + }, + { + name: "PD004", + description: "Pandas-use-of-dot-not-null", + }, + { + name: "PD007", + description: "Pandas-use-of-dot-ix", + }, + { + name: "PD008", + description: "Pandas-use-of-dot-at", + }, + { + name: "PD009", + description: "Pandas-use-of-dot-iat", + }, + { + name: "PD010", + description: "Pandas-use-of-dot-pivot-or-unstack", + }, + { + name: "PD011", + description: "Pandas-use-of-dot-values", + }, + { + name: "PD012", + description: "Pandas-use-of-dot-read-table", + }, + { + name: "PD013", + description: "Pandas-use-of-dot-stack", + }, + { + name: "PD015", + description: "Pandas-use-of-pd-merge", + }, + { + name: "PD101", + description: "Pandas-nunique-constant-series-check", + }, + { + name: "PD901", + description: "Pandas-df-variable-name", + }, + { + name: "PGH001", + description: "Eval", + }, + { + name: "PGH002", + description: "Deprecated-log-warn", + }, + { + name: "PGH003", + description: "Blanket-type-ignore", + }, + { + name: "PGH004", + description: "Blanket-noqa", + }, + { + name: "PGH005", + description: "Invalid-mock-access", + }, + { + name: "PLC0105", + description: "Type-name-incorrect-variance", + }, + { + name: "PLC0131", + description: "Type-bivariance", + }, + { + name: "PLC0132", + description: "Type-param-name-mismatch", + }, + { + name: "PLC0205", + description: "Single-string-slots", + }, + { + name: "PLC0206", + description: "Dict-index-missing-items", + }, + { + name: "PLC0208", + description: "Iteration-over-set", + }, + { + name: "PLC0414", + description: "Useless-import-alias", + }, + { + name: "PLC0415", + description: "Import-outside-top-level", + }, + { + name: "PLC1802", + description: "Len-test", + }, + { + name: "PLC1901", + description: "Compare-to-empty-string", + }, + { + name: "PLC2401", + description: "Non-ascii-name", + }, + { + name: "PLC2403", + description: "Non-ascii-import-name", + }, + { + name: "PLC2701", + description: "Import-private-name", + }, + { + name: "PLC2801", + description: "Unnecessary-dunder-call", + }, + { + name: "PLC3002", + description: "Unnecessary-direct-lambda-call", + }, + { + name: "PLE0100", + description: "Yield-in-init", + }, + { + name: "PLE0101", + description: "Return-in-init", + }, + { + name: "PLE0115", + description: "Nonlocal-and-global", + }, + { + name: "PLE0116", + description: "Continue-in-finally", + }, + { + name: "PLE0117", + description: "Nonlocal-without-binding", + }, + { + name: "PLE0118", + description: "Load-before-global-declaration", + }, + { + name: "PLE0237", + description: "Non-slot-assignment", + }, + { + name: "PLE0241", + description: "Duplicate-bases", + }, + { + name: "PLE0302", + description: "Unexpected-special-method-signature", + }, + { + name: "PLE0303", + description: "Invalid-length-return-type", + }, + { + name: "PLE0304", + description: "Invalid-bool-return-type", + }, + { + name: "PLE0305", + description: "Invalid-index-return-type", + }, + { + name: "PLE0307", + description: "Invalid-str-return-type", + }, + { + name: "PLE0308", + description: "Invalid-bytes-return-type", + }, + { + name: "PLE0309", + description: "Invalid-hash-return-type", + }, + { + name: "PLE0604", + description: "Invalid-all-object", + }, + { + name: "PLE0605", + description: "Invalid-all-format", + }, + { + name: "PLE0643", + description: "Potential-index-error", + }, + { + name: "PLE0704", + description: "Misplaced-bare-raise", + }, + { + name: "PLE1132", + description: "Repeated-keyword-argument", + }, + { + name: "PLE1141", + description: "Dict-iter-missing-items", + }, + { + name: "PLE1142", + description: "Await-outside-async", + }, + { + name: "PLE1205", + description: "Logging-too-many-args", + }, + { + name: "PLE1206", + description: "Logging-too-few-args", + }, + { + name: "PLE1300", + description: "Bad-string-format-character", + }, + { + name: "PLE1307", + description: "Bad-string-format-type", + }, + { + name: "PLE1310", + description: "Bad-str-strip-call", + }, + { + name: "PLE1507", + description: "Invalid-envvar-value", + }, + { + name: "PLE1519", + description: "Singledispatch-method", + }, + { + name: "PLE1520", + description: "Singledispatchmethod-function", + }, + { + name: "PLE1700", + description: "Yield-from-in-async-function", + }, + { + name: "PLE2502", + description: "Bidirectional-unicode", + }, + { + name: "PLE2510", + description: "Invalid-character-backspace", + }, + { + name: "PLE2512", + description: "Invalid-character-sub", + }, + { + name: "PLE2513", + description: "Invalid-character-esc", + }, + { + name: "PLE2514", + description: "Invalid-character-nul", + }, + { + name: "PLE2515", + description: "Invalid-character-zero-width-space", + }, + { + name: "PLE4703", + description: "Modified-iterating-set", + }, + { + name: "PLR0124", + description: "Comparison-with-itself", + }, + { + name: "PLR0133", + description: "Comparison-of-constant", + }, + { + name: "PLR0202", + description: "No-classmethod-decorator", + }, + { + name: "PLR0203", + description: "No-staticmethod-decorator", + }, + { + name: "PLR0206", + description: "Property-with-parameters", + }, + { + name: "PLR0402", + description: "Manual-from-import", + }, + { + name: "PLR0904", + description: "Too-many-public-methods", + }, + { + name: "PLR0911", + description: "Too-many-return-statements", + }, + { + name: "PLR0912", + description: "Too-many-branches", + }, + { + name: "PLR0913", + description: "Too-many-arguments", + }, + { + name: "PLR0914", + description: "Too-many-locals", + }, + { + name: "PLR0915", + description: "Too-many-statements", + }, + { + name: "PLR0916", + description: "Too-many-boolean-expressions", + }, + { + name: "PLR0917", + description: "Too-many-positional-arguments", + }, + { + name: "PLR1701", + description: "Repeated-isinstance-calls", + }, + { + name: "PLR1702", + description: "Too-many-nested-blocks", + }, + { + name: "PLR1704", + description: "Redefined-argument-from-local", + }, + { + name: "PLR1706", + description: "And-or-ternary", + }, + { + name: "PLR1711", + description: "Useless-return", + }, + { + name: "PLR1714", + description: "Repeated-equality-comparison", + }, + { + name: "PLR1716", + description: "Boolean-chained-comparison", + }, + { + name: "PLR1722", + description: "Sys-exit-alias", + }, + { + name: "PLR1730", + description: "If-stmt-min-max", + }, + { + name: "PLR1733", + description: "Unnecessary-dict-index-lookup", + }, + { + name: "PLR1736", + description: "Unnecessary-list-index-lookup", + }, + { + name: "PLR2004", + description: "Magic-value-comparison", + }, + { + name: "PLR2044", + description: "Empty-comment", + }, + { + name: "PLR5501", + description: "Collapsible-else-if", + }, + { + name: "PLR6104", + description: "Non-augmented-assignment", + }, + { + name: "PLR6201", + description: "Literal-membership", + }, + { + name: "PLR6301", + description: "No-self-use", + }, + { + name: "PLW0108", + description: "Unnecessary-lambda", + }, + { + name: "PLW0120", + description: "Useless-else-on-loop", + }, + { + name: "PLW0127", + description: "Self-assigning-variable", + }, + { + name: "PLW0128", + description: "Redeclared-assigned-name", + }, + { + name: "PLW0129", + description: "Assert-on-string-literal", + }, + { + name: "PLW0131", + description: "Named-expr-without-context", + }, + { + name: "PLW0133", + description: "Useless-exception-statement", + }, + { + name: "PLW0177", + description: "Nan-comparison", + }, + { + name: "PLW0211", + description: "Bad-staticmethod-argument", + }, + { + name: "PLW0245", + description: "Super-without-brackets", + }, + { + name: "PLW0406", + description: "Import-self", + }, + { + name: "PLW0602", + description: "Global-variable-not-assigned", + }, + { + name: "PLW0603", + description: "Global-statement", + }, + { + name: "PLW0604", + description: "Global-at-module-level", + }, + { + name: "PLW0642", + description: "Self-or-cls-assignment", + }, + { + name: "PLW0711", + description: "Binary-op-exception", + }, + { + name: "PLW1501", + description: "Bad-open-mode", + }, + { + name: "PLW1507", + description: "Shallow-copy-environ", + }, + { + name: "PLW1508", + description: "Invalid-envvar-default", + }, + { + name: "PLW1509", + description: "Subprocess-popen-preexec-fn", + }, + { + name: "PLW1510", + description: "Subprocess-run-without-check", + }, + { + name: "PLW1514", + description: "Unspecified-encoding", + }, + { + name: "PLW1641", + description: "Eq-without-hash", + }, + { + name: "PLW2101", + description: "Useless-with-lock", + }, + { + name: "PLW2901", + description: "Redefined-loop-name", + }, + { + name: "PLW3201", + description: "Bad-dunder-method-name", + }, + { + name: "PLW3301", + description: "Nested-min-max", + }, + { + name: "TRY002", + description: "Raise-vanilla-class", + }, + { + name: "TRY003", + description: "Raise-vanilla-args", + }, + { + name: "TRY004", + description: "Type-check-without-type-error", + }, + { + name: "TRY200", + description: "Reraise-no-cause", + }, + { + name: "TRY201", + description: "Verbose-raise", + }, + { + name: "TRY203", + description: "Useless-try-except", + }, + { + name: "TRY300", + description: "Try-consider-else", + }, + { + name: "TRY301", + description: "Raise-within-try", + }, + { + name: "TRY400", + description: "Error-instead-of-exception", + }, + { + name: "TRY401", + description: "Verbose-log-message", + }, + { + name: "FLY002", + description: "Static-join-to-f-string", + }, + { + name: "NPY001", + description: "Numpy-deprecated-type-alias", + }, + { + name: "NPY002", + description: "Numpy-legacy-random", + }, + { + name: "NPY003", + description: "Numpy-deprecated-function", + }, + { + name: "NPY201", + description: "Numpy2-deprecation", + }, + { + name: "FAST001", + description: "Fast-api-redundant-response-model", + }, + { + name: "FAST002", + description: "Fast-api-non-annotated-dependency", + }, + { + name: "FAST003", + description: "Fast-api-unused-path-parameter", + }, + { + name: "AIR001", + description: "Airflow-variable-name-task-id-mismatch", + }, + { + name: "AIR301", + description: "Airflow-dag-no-schedule-argument", + }, + { + name: "AIR302", + description: "Airflow3-removal", + }, + { + name: "PERF101", + description: "Unnecessary-list-cast", + }, + { + name: "PERF102", + description: "Incorrect-dict-iterator", + }, + { + name: "PERF203", + description: "Try-except-in-loop", + }, + { + name: "PERF401", + description: "Manual-list-comprehension", + }, + { + name: "PERF402", + description: "Manual-list-copy", + }, + { + name: "PERF403", + description: "Manual-dict-comprehension", + }, + { + name: "FURB101", + description: "Read-whole-file", + }, + { + name: "FURB103", + description: "Write-whole-file", + }, + { + name: "FURB105", + description: "Print-empty-string", + }, + { + name: "FURB110", + description: "If-exp-instead-of-or-operator", + }, + { + name: "FURB113", + description: "Repeated-append", + }, + { + name: "FURB116", + description: "F-string-number-format", + }, + { + name: "FURB118", + description: "Reimplemented-operator", + }, + { + name: "FURB129", + description: "Readlines-in-for", + }, + { + name: "FURB131", + description: "Delete-full-slice", + }, + { + name: "FURB132", + description: "Check-and-remove-from-set", + }, + { + name: "FURB136", + description: "If-expr-min-max", + }, + { + name: "FURB140", + description: "Reimplemented-starmap", + }, + { + name: "FURB142", + description: "For-loop-set-mutations", + }, + { + name: "FURB145", + description: "Slice-copy", + }, + { + name: "FURB148", + description: "Unnecessary-enumerate", + }, + { + name: "FURB152", + description: "Math-constant", + }, + { + name: "FURB154", + description: "Repeated-global", + }, + { + name: "FURB156", + description: "Hardcoded-string-charset", + }, + { + name: "FURB157", + description: "Verbose-decimal-constructor", + }, + { + name: "FURB161", + description: "Bit-count", + }, + { + name: "FURB163", + description: "Redundant-log-base", + }, + { + name: "FURB164", + description: "Unnecessary-from-float", + }, + { + name: "FURB166", + description: "Int-on-sliced-str", + }, + { + name: "FURB167", + description: "Regex-flag-alias", + }, + { + name: "FURB168", + description: "Isinstance-type-none", + }, + { + name: "FURB169", + description: "Type-none-comparison", + }, + { + name: "FURB171", + description: "Single-item-membership-test", + }, + { + name: "FURB177", + description: "Implicit-cwd", + }, + { + name: "FURB180", + description: "Meta-class-abc-meta", + }, + { + name: "FURB181", + description: "Hashlib-digest-hex", + }, + { + name: "FURB187", + description: "List-reverse-copy", + }, + { + name: "FURB188", + description: "Slice-to-remove-prefix-or-suffix", + }, + { + name: "FURB189", + description: "Subclass-builtin", + }, + { + name: "FURB192", + description: "Sorted-min-max", + }, + { + name: "DOC201", + description: "Docstring-missing-returns", + }, + { + name: "DOC202", + description: "Docstring-extraneous-returns", + }, + { + name: "DOC402", + description: "Docstring-missing-yields", + }, + { + name: "DOC403", + description: "Docstring-extraneous-yields", + }, + { + name: "DOC501", + description: "Docstring-missing-exception", + }, + { + name: "DOC502", + description: "Docstring-extraneous-exception", + }, + { + name: "RUF001", + description: "Ambiguous-unicode-character-string", + }, + { + name: "RUF002", + description: "Ambiguous-unicode-character-docstring", + }, + { + name: "RUF003", + description: "Ambiguous-unicode-character-comment", + }, + { + name: "RUF005", + description: "Collection-literal-concatenation", + }, + { + name: "RUF006", + description: "Asyncio-dangling-task", + }, + { + name: "RUF007", + description: "Zip-instead-of-pairwise", + }, + { + name: "RUF008", + description: "Mutable-dataclass-default", + }, + { + name: "RUF009", + description: "Function-call-in-dataclass-default-argument", + }, + { + name: "RUF010", + description: "Explicit-f-string-type-conversion", + }, + { + name: "RUF011", + description: "Ruff-static-key-dict-comprehension", + }, + { + name: "RUF012", + description: "Mutable-class-default", + }, + { + name: "RUF013", + description: "Implicit-optional", + }, + { + name: "RUF015", + description: "Unnecessary-iterable-allocation-for-first-element", + }, + { + name: "RUF016", + description: "Invalid-index-type", + }, + { + name: "RUF017", + description: "Quadratic-list-summation", + }, + { + name: "RUF018", + description: "Assignment-in-assert", + }, + { + name: "RUF019", + description: "Unnecessary-key-check", + }, + { + name: "RUF020", + description: "Never-union", + }, + { + name: "RUF021", + description: "Parenthesize-chained-operators", + }, + { + name: "RUF022", + description: "Unsorted-dunder-all", + }, + { + name: "RUF023", + description: "Unsorted-dunder-slots", + }, + { + name: "RUF024", + description: "Mutable-fromkeys-value", + }, + { + name: "RUF026", + description: "Default-factory-kwarg", + }, + { + name: "RUF027", + description: "Missing-f-string-syntax", + }, + { + name: "RUF028", + description: "Invalid-formatter-suppression-comment", + }, + { + name: "RUF029", + description: "Unused-async", + }, + { + name: "RUF030", + description: "Assert-with-print-message", + }, + { + name: "RUF031", + description: "Incorrectly-parenthesized-tuple-in-subscript", + }, + { + name: "RUF032", + description: "Decimal-from-float-literal", + }, + { + name: "RUF033", + description: "Post-init-default", + }, + { + name: "RUF034", + description: "Useless-if-else", + }, + { + name: "RUF035", + description: "Unsafe-markup-use", + }, + { + name: "RUF036", + description: "None-not-at-end-of-union", + }, + { + name: "RUF038", + description: "Redundant-bool-literal", + }, + { + name: "RUF039", + description: "Unraw-re-pattern", + }, + { + name: "RUF040", + description: "Invalid-assert-message-literal-argument", + }, + { + name: "RUF041", + description: "Unnecessary-nested-literal", + }, + { + name: "RUF046", + description: "Unnecessary-cast-to-int", + }, + { + name: "RUF048", + description: "Map-int-version-parsing", + }, + { + name: "RUF052", + description: "Used-dummy-variable", + }, + { + name: "RUF055", + description: "Unnecessary-regular-expression", + }, + { + name: "RUF100", + description: "Unused-noqa", + }, + { + name: "RUF101", + description: "Redirected-noqa", + }, + { + name: "RUF200", + description: "Invalid-pyproject-toml", + }, +]; + +const subCommands: Fig.Subcommand[] = [ + { + name: "check", + description: "Run Ruff on the given files or directories", + options: checkOptions, + args: { + name: "Path", + template: "filepaths", + description: "The path to use for the project/script", + default: ".", + isVariadic: true, + }, + }, + { + name: "rule", + description: "Explain a rule (or all rules)", + args: { + name: "rule", + description: "Rule(s) to explain", + suggestions: [ + ...rules, + { name: "--all", description: "Explain all rules", displayName: "all" }, + ], + }, + options: [ + { + name: "--all", + description: "Explain all rules", + }, + { + name: "--output-format", + description: "Output format [default: text]", + args: { + name: "output-format", + suggestions: ["text", "json"], + }, + }, + ], + }, + { + name: "config", + description: "List or describe the available configuration options", + options: [ + { + name: "--output-format", + description: "Output format [default: text]", + args: { + name: "output-format", + suggestions: ["text", "json"], + }, + }, + ], + }, + { + name: "linter", + description: "List all supported upstream linters", + options: [ + { + name: "--output-format", + description: "Output format", + args: { name: "output-format", suggestions: ["text", "json"] }, + }, + ], + }, + { + name: "clean", + description: + "Clear any caches in the current directory and any subdirectories", + }, + { + name: "format", + description: "Run the Ruff formatter on the given files or directories", + options: formatOptions, + args: { + name: "Path", + template: "filepaths", + description: "List of files or directories to format [default: .]", + default: ".", + isVariadic: true, + }, + }, + { + name: "server", + description: "Run the language server", + options: [ + { + name: "--preview", + description: "Enable preview mode. Use `--no-preview` to disable", + }, + { + name: "--no-preview", + description: "Disable preview mode", + }, + ], + }, + { + name: "analyze", + description: "Run analysis over Python source code", + subcommands: [ + { + name: "graph", + description: "Generate a map of Python file dependencies or dependents", + options: [ + { + name: "--direction", + description: + "The direction of the import map. By default, generates a dependency map, i.e., a map from file to files that it depends on. Use `--direction dependents` to generate a map from file to files that depend on it", + args: { + name: "DIRECTION", + suggestions: ["dependencies", "dependents"], + }, + }, + { + name: "--detect-string-imports", + description: "Attempt to detect imports from string literals", + }, + { + name: "--preview", + description: "Enable preview mode. Use `--no-preview` to disable", + }, + { + name: "--no-preview", + description: "Disable preview mode", + }, + { + name: "--target-version", + description: "The minimum Python version that should be supported", + args: { + name: "TARGET_VERSION", + suggestions: [ + "py37", + "py38", + "py39", + "py310", + "py311", + "py312", + "py313", + ], + }, + }, + ], + args: { + name: "Path", + template: "filepaths", + description: "The path to use for the project/script", + default: ".", + isVariadic: true, + }, + }, + ], + }, + { + name: "version", + description: "Display Ruff's version", + options: [ + { + name: "--output-format", + description: "Output format", + args: { name: "output-format", suggestions: ["text", "json"] }, + }, + ], + }, + { + name: "help", + description: "Print this message or the help of the given subcommand(s)", + }, +]; + +const completion: Fig.Spec = { + name: "ruff", + description: "Ruff: An extremely fast Python linter", + subcommands: subCommands, + options: GlobalOptions.map((option) => ({ ...option, isPersistent: true })), +}; + +export default completion; diff --git a/extensions/terminal-suggest/src/completions/upstream/yo.ts b/extensions/terminal-suggest/src/completions/upstream/yo.ts new file mode 100644 index 00000000000..d9cf3e533b5 --- /dev/null +++ b/extensions/terminal-suggest/src/completions/upstream/yo.ts @@ -0,0 +1,101 @@ +function toTitleCase(str: string): string { + return str + .trim() + .replace( + /\w\S*/g, + (txt) => txt.charAt(0).toUpperCase() + txt.slice(1).toLowerCase() + ); +} + +const suggestions: Fig.Suggestion[] = [ + { + name: "doctor", + description: "Running sanity checks on your system", + icon: "fig://icon?type=alert", + }, + { + name: "completion", + description: "To enable shell completion for the yo command", + icon: "fig://icon?type=asterisk", + }, +]; + +// GENERATORS +const yeomanGeneratorList: Fig.Generator = { + script: ["yo", "--generators"], + postProcess: function (out) { + try { + return out + .split("\n") + .filter((item) => item.trim() && item !== "Available Generators:") + .map( + (item) => + ({ + name: item.trim(), + icon: "https://avatars.githubusercontent.com/u/1714870?v=4", + displayName: toTitleCase(item), + description: `${toTitleCase(item)} Generator`, + priority: 100, + options: [ + { + name: "--help", + description: `Help of "${toTitleCase(item)}" generator`, + }, + ], + }) as Fig.Suggestion + ) as Fig.Suggestion[]; + } catch (e) { + console.error(e); + return []; + } + }, +}; + +const completionSpec: Fig.Spec = { + name: "yo", + description: "Yeoman generator", + args: { + name: "generator", + generators: yeomanGeneratorList, + suggestions: [...suggestions], + isCommand: true, + isOptional: true, + }, + options: [ + { + name: "--help", + description: "Print info and generator's options and usage", + }, + { + name: ["-f", "--force"], + description: "Overwrite files that already exist", + isDangerous: true, + }, + { + name: "--version", + description: "Print version", + }, + { + name: "--no-color", + description: "Disable color", + }, + { + name: "--insight", + description: "Enable anonymous tracking", + }, + { + name: "--no-insight", + description: "Disable anonymous tracking", + }, + { + name: "--generators", + description: "Print available generators", + }, + { + name: "--local-only", + description: "Disable lookup of globally-installed generators", + }, + ], +}; + +export default completionSpec; diff --git a/extensions/terminal-suggest/src/constants.ts b/extensions/terminal-suggest/src/constants.ts index 25b4c0bf139..4e5ccfcee80 100644 --- a/extensions/terminal-suggest/src/constants.ts +++ b/extensions/terminal-suggest/src/constants.ts @@ -4,9 +4,7 @@ *--------------------------------------------------------------------------------------------*/ export const upstreamSpecs = [ - 'apt', 'basename', - 'brew', 'cat', 'chmod', 'chown', @@ -44,7 +42,6 @@ export const upstreamSpecs = [ 'more', 'mount', 'mv', - 'nano', 'nl', 'od', 'passwd', @@ -64,7 +61,6 @@ export const upstreamSpecs = [ 'sort', 'source', 'split', - 'ssh', 'stat', 'su', 'sudo', @@ -92,14 +88,47 @@ export const upstreamSpecs = [ 'xxd', 'zip', + // OS package management + 'apt', + 'brew', + + // Editors + 'nano', + 'vim', + + // Shells + 'ssh', + + // Android + 'adb', + + // Docker + 'docker', + 'docker-compose', + + // Dotnet + 'dotnet', + + // Go + 'go', + + // JavaScript / TypeScript + 'node', 'npm', + 'nvm', + 'pnpm', 'yarn', + 'yo', + + // Python + 'pip', 'python', 'python3', - 'pnpm', - 'node', - 'nvm', - 'vim', + 'ruff', + + // Ruby + 'bundle', + 'ruby', ]; diff --git a/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/runInTerminalToolTelemetry.ts b/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/runInTerminalToolTelemetry.ts index 51576ef347b..3eebdf7c11d 100644 --- a/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/runInTerminalToolTelemetry.ts +++ b/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/runInTerminalToolTelemetry.ts @@ -423,6 +423,7 @@ const commandAllowList: ReadonlySet = new Set([ 'p4', // Devtools, languages, package manager + 'adb', 'ansible', 'apk', 'apt-get',