From affe98efc2e9bb0c23040e7ab8fbd8d46abee053 Mon Sep 17 00:00:00 2001 From: Andreas Gerler Date: Sun, 22 Dec 2024 13:20:45 +0100 Subject: [PATCH] update terraform-doc Signed-off-by: Andreas Gerler --- .../terraform-doc-autoloads.el | 27 --- .../terraform-doc-pkg.el | 2 - .../terraform-doc.el | 167 ------------- .../terraform-doc-autoloads.el | 32 +++ .../terraform-doc-pkg.el | 13 + .../terraform-doc.el | 228 ++++++++++++++++++ 6 files changed, 273 insertions(+), 196 deletions(-) delete mode 100644 elpa/terraform-doc-20230521.849/terraform-doc-autoloads.el delete mode 100644 elpa/terraform-doc-20230521.849/terraform-doc-pkg.el delete mode 100644 elpa/terraform-doc-20230521.849/terraform-doc.el create mode 100644 elpa/terraform-doc-20240714.418/terraform-doc-autoloads.el create mode 100644 elpa/terraform-doc-20240714.418/terraform-doc-pkg.el create mode 100644 elpa/terraform-doc-20240714.418/terraform-doc.el diff --git a/elpa/terraform-doc-20230521.849/terraform-doc-autoloads.el b/elpa/terraform-doc-20230521.849/terraform-doc-autoloads.el deleted file mode 100644 index d0567054..00000000 --- a/elpa/terraform-doc-20230521.849/terraform-doc-autoloads.el +++ /dev/null @@ -1,27 +0,0 @@ -;;; terraform-doc-autoloads.el --- automatically extracted autoloads -*- lexical-binding: t -*- -;; -;;; Code: - -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) - - -;;;### (autoloads nil "terraform-doc" "terraform-doc.el" (0 0 0 0)) -;;; Generated autoloads from terraform-doc.el - -(autoload 'terraform-doc "terraform-doc" "\ -Look up PROVIDER. - -\(fn &optional PROVIDER)" t nil) - -(register-definition-prefixes "terraform-doc" '("terraform-doc-")) - -;;;*** - -;; Local Variables: -;; version-control: never -;; no-byte-compile: t -;; no-update-autoloads: t -;; coding: utf-8 -;; End: -;;; terraform-doc-autoloads.el ends here diff --git a/elpa/terraform-doc-20230521.849/terraform-doc-pkg.el b/elpa/terraform-doc-20230521.849/terraform-doc-pkg.el deleted file mode 100644 index fa05dc69..00000000 --- a/elpa/terraform-doc-20230521.849/terraform-doc-pkg.el +++ /dev/null @@ -1,2 +0,0 @@ -;;; Generated package description from terraform-doc.el -*- no-byte-compile: t -*- -(define-package "terraform-doc" "20230521.849" "Look up terraform documentation on the fly" '((emacs "24.4")) :commit "8a6ffd5ac133ced5afd07b9d963272e4208f8b1e" :authors '(("Giap Tran" . "txgvnn@gmail.com")) :maintainers '(("Giap Tran" . "txgvnn@gmail.com")) :maintainer '("Giap Tran" . "txgvnn@gmail.com") :keywords '("comm") :url "https://github.com/TxGVNN/terraform-doc") diff --git a/elpa/terraform-doc-20230521.849/terraform-doc.el b/elpa/terraform-doc-20230521.849/terraform-doc.el deleted file mode 100644 index f0b505c0..00000000 --- a/elpa/terraform-doc-20230521.849/terraform-doc.el +++ /dev/null @@ -1,167 +0,0 @@ -;;; terraform-doc.el --- Look up terraform documentation on the fly -*- lexical-binding: t -*- - -;; Copyright (C) 2019 Giap Tran - -;; Author: Giap Tran -;; URL: https://github.com/TxGVNN/terraform-doc -;; Package-Version: 20230521.849 -;; Package-Commit: 8a6ffd5ac133ced5afd07b9d963272e4208f8b1e -;; Version: 1.2.0 -;; Package-Requires: ((emacs "24.4")) -;; Keywords: comm - -;; This file is NOT part of GNU Emacs. - -;; This file is free software; you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 3, or (at your option) -;; any later version. - -;; This program is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; For a full copy of the GNU General Public License -;; see . - -;;; Commentary: -;; M-x terraform-doc - -;;; Code: - -(require 'shr) - -(defgroup terraform nil - "Major mode of `terraform-doc' file." - :group 'languages - :prefix "terraform-doc-") - -(defcustom terraform-doc-hook nil - "*Hook run by `terraform-doc'." - :type 'hook - :group 'terraform) - -(defcustom terraform-doc-name "Terraform-Doc" - "*Modeline of `terraform-doc'." - :type 'string - :group 'terraform) - -(defcustom terraform-doc-markdown-mode-function 'markdown-mode - "*Function to use for markdown rendering in `terraform-doc', e.g. `markdown-mode' or `gfm-view-mode'." - :type 'function - :group 'terraform) - -(defvar terraform-doc-mode-map - (let ((keymap (make-sparse-keymap))) - (define-key keymap (kbd "o") 'terraform-doc-at-point) - (define-key keymap (kbd "RET") 'terraform-doc-at-point) - (define-key keymap (kbd "") 'shr-next-link) - (define-key keymap (kbd "TAB") 'shr-next-link) - (define-key keymap (kbd "n") 'next-line) - (define-key keymap (kbd "p") 'previous-line) - keymap) - "Keymap for Terraform-Doc major mode.") - - -(defvar terraform-doc-providers - '(("ACME" . "acme") ("Akamai" . "akamai") ("Alibaba Cloud" . "alicloud") ("Archive" . "archive") ("Arukas" . "arukas") ("Auth0" . "auth0") ("Avi Vantage" . "avi") ("Aviatrix" . "aviatrix") ("AWS" . "aws") ("Azure" . "azurerm") ("Azure Active Directory" . "azuread") ("Azure DevOps" . "azuredevops") ("Azure Stack" . "azurestack") ("A10 Networks" . "vthunder") ("BaiduCloud" . "baiducloud") ("Bitbucket" . "bitbucket") ("Brightbox" . "brightbox") ("CenturyLinkCloud" . "clc") ("Check Point" . "checkpoint") ("Chef" . "chef") ("CherryServers" . "cherryservers") ("Circonus" . "circonus") ("Cisco ASA" . "ciscoasa") ("Cisco ACI" . "aci") ("Cisco MSO" . "mso") ("CloudAMQP" . "cloudamqp") ("Cloudflare" . "cloudflare") ("Cloud-init" . "cloudinit") ("CloudScalech" . "cloudscale") ("CloudStack" . "cloudstack") ("Cobbler" . "cobbler") ("Cohesity" . "cohesity") ("Constellix" . "constellix") ("Consul" . "consul") - ("Datadog" . "datadog") ("DigitalOcean" . "do") ("DNS" . "dns") ("DNSimple" . "dnsimple") ("DNSMadeEasy" . "dme") ("Docker" . "docker") ("Dome9" . "dome9") ("Dyn" . "dyn") ("EnterpriseCloud" . "ecl") ("Exoscale" . "exoscale") ("External" . "external") ("F5 BIG-IP" . "bigip") ("Fastly" . "fastly") ("FlexibleEngine" . "flexibleengine") ("FortiOS" . "fortios") ("Genymotion" . "genymotion") ("GitHub" . "github") ("GitLab" . "gitlab") ("Google Cloud Platform" . "google") ("Grafana" . "grafana") ("Gridscale" . "gridscale") ("Hedvig" . "hedvig") ("Helm" . "helm") ("Heroku" . "heroku") ("Hetzner Cloud" . "hcloud") ("HTTP" . "http") ("HuaweiCloud" . "huaweicloud") ("HuaweiCloudStack" . "huaweicloudstack") ("Icinga2" . "icinga2") - ("Ignition" . "ignition") ("Incapsula" . "incapsula") ("InfluxDB" . "influxdb") ("Infoblox" . "infoblox") ("JDCloud" . "jdcloud") ("KingsoftCloud" . "ksyun") ("Kubernetes" . "kubernetes") ("Lacework" . "lacework") ("LaunchDarkly" . "launchdarkly") ("Librato" . "librato") ("Linode" . "linode") ("Local" . "local") ("Logentries" . "logentries") ("LogicMonitor" . "logicmonitor") ("Mailgun" . "mailgun") ("MetalCloud" . "metalcloud") ("MongoDB Atlas" . "mongodbatlas") ("MySQL" . "mysql") ("Naver Cloud" . "ncloud") ("Netlify" . "netlify") ("Nomad" . "nomad") ("NS1" . "ns1") ("Nutanix" . "nutanix") ("1 & 1" . "oneandone") ("Okta" . "okta") ("Okta Advanced Server Access" . "oktaasa") ("OpenNebula" . "opennebula") ("OpenStack" . "openstack") ("OpenTelekomCloud" . "opentelekomcloud") ("OpsGenie" . "opsgenie") - ("Oracle Cloud Infrastructure" . "oci") ("Oracle Cloud Platform" . "oraclepaas") ("Oracle Public Cloud" . "opc") ("OVH" . "ovh") ("Packet" . "packet") ("PagerDuty" . "pagerduty") ("Palo Alto Networks PANOS" . "panos") ("Palo Alto Networks PrismaCloud" . "prismacloud") ("PostgreSQL" . "postgresql") ("PowerDNS" . "powerdns") ("ProfitBricks" . "profitbricks") ("Pureport" . "pureport") ("RabbitMQ" . "rabbitmq") ("Rancher" . "rancher") ("Rancher2" . "rancher2") ("RightScale" . "rightscale") ("Rubrik" . "rubrik") ("Rundeck" . "rundeck") ("RunScope" . "runscope") ("Scaleway" . "scaleway") ("Selectel" . "selectel") ("SignalFx" . "signalfx") ("Skytap" . "skytap") - ("SoftLayer" . "softlayer") ("Spotinst" . "spotinst") ("StackPath" . "stackpath") ("StatusCake" . "statuscake") ("Sumo Logic" . "sumologic") ("TelefonicaOpenCloud" . "telefonicaopencloud") ("Template" . "template") ("TencentCloud" . "tencentcloud") ("Terraform" . "terraform") ("Terraform Cloud" . "tfe") ("Time" . "time") ("TLS" . "tls") ("Triton" . "triton") ("Turbot" . "turbot") ("UCloud" . "ucloud") ("UltraDNS" . "ultradns") ("Vault" . "vault") ("Venafi" . "venafi") ("VMware Cloud" . "vmc") ("VMware NSX-T" . "nsxt") ("VMware vCloud Director" . "vcd") ("VMware vRA7" . "vra7") ("VMware vSphere" . "vsphere") ("Vultr" . "vultr") ("Wavefront" . "wavefront") ("Yandex" . "yandex"))) - -;;;###autoload -(defun terraform-doc (&optional provider) - "Look up PROVIDER." - (interactive (list - (assoc (completing-read - "Provider: " - (mapcar (lambda (x) (car x)) terraform-doc-providers)) - terraform-doc-providers))) - (if (member provider terraform-doc-providers) - (terraform-doc--render-tree (cdr provider) (format "*Terraform:%s*" (cdr provider))) - (message "%s" (propertize "Provider is not valid")))) - -(defun terraform-doc-at-point() - "Render url by 'terraform-doc--render-object." - (interactive) - (if (get-text-property (point) 'shr-url) - (let* ((url (get-text-property (point) 'shr-url)) - (buffer-name (string-join (last (split-string url "/") 2) "/")) - (provider (replace-regexp-in-string ".*terraform-provider-\\(.+?\\)/.*" "\\1" url))) - (terraform-doc--render-object url (format "*Terraform:%s:%s*" provider buffer-name))))) - -(defun terraform-doc--render-tree (provider buffer-name) - "Render the PROVIDER and rename to BUFFER-NAME." - (if (get-buffer buffer-name) - (switch-to-buffer buffer-name) - (with-current-buffer (get-buffer-create buffer-name) - (insert (format "Provider
" provider)) - (let ((content)) - (dolist (url '("d" "r")) - (with-current-buffer - (url-retrieve-synchronously - (format "https://github.com/terraform-providers/terraform-provider-%s/file-list/HEAD/website/docs/%s" provider url)) - (goto-char (point-min)) - (search-forward-regexp "\n\n" ) - (delete-region (point) (point-min)) - (let* ((html-dom-tree (libxml-parse-html-region (point-min) (point-max))) - (dives (dom-elements html-dom-tree 'role "rowheader")) - (j 0) (div nil) (file nil) (url_type nil) (formatted_str nil)) - (erase-buffer) - (while (< j (length dives)) - (setq div (elt dives j)) - (setq file (dom-by-class div "Link--primary")) - (unless (not file) - (setq url_type (if (string= "d" url) "data" "resource")) - (setq formatted_str (car (split-string (dom-text file) "\\."))) - (setcdr (cdr (car file)) (list (format "%s/%s" url_type formatted_str))) - (xml-print file) - (insert "
")) - (setq j (+ j 1)))) - (setq content (buffer-string))) - (insert content)) - (goto-char (point-min)) - (while (re-search-forward "href=\"" nil t) - (replace-match "href=\"https://raw.githubusercontent.com" nil nil)) - (goto-char (point-min)) - (while (re-search-forward "/blob" nil t) - (replace-match "" nil nil)) - (shr-render-region (point-min) (point-max)) - (terraform-doc-mode-on) - (switch-to-buffer (current-buffer)))))) - -(defun terraform-doc--render-object (url buffer-name) - "Render the URL and rename to BUFFER-NAME." - (if (get-buffer buffer-name) - (switch-to-buffer buffer-name) - (url-retrieve - url - (lambda (arg) - (cond - ((equal :error (car arg)) - (message arg)) - (t - (goto-char (point-min)) - (search-forward-regexp "\n\n" ) - (delete-region (point) (point-min)) - (rename-buffer buffer-name) - (if (fboundp terraform-doc-markdown-mode-function) - (funcall terraform-doc-markdown-mode-function)) - (setq buffer-read-only t) - (switch-to-buffer (current-buffer)))))))) - -(defun terraform-doc-mode-on () - "Render and switch to ‘terraform-doc’ mode." - (goto-char (point-min)) - (terraform-doc-mode)) - -(define-derived-mode terraform-doc-mode special-mode terraform-doc-name - "Major mode for looking up terraform documentation on the fly." - (local-set-key [remap shr-browse-url] 'terraform-doc-at-point) - (setq buffer-auto-save-file-name nil - buffer-read-only t)) - -(provide 'terraform-doc) -;;; terraform-doc.el ends here diff --git a/elpa/terraform-doc-20240714.418/terraform-doc-autoloads.el b/elpa/terraform-doc-20240714.418/terraform-doc-autoloads.el new file mode 100644 index 00000000..e5207bea --- /dev/null +++ b/elpa/terraform-doc-20240714.418/terraform-doc-autoloads.el @@ -0,0 +1,32 @@ +;;; terraform-doc-autoloads.el --- automatically extracted autoloads (do not edit) -*- lexical-binding: t -*- +;; Generated by the `loaddefs-generate' function. + +;; This file is part of GNU Emacs. + +;;; Code: + +(add-to-list 'load-path (or (and load-file-name (directory-file-name (file-name-directory load-file-name))) (car load-path))) + + + +;;; Generated autoloads from terraform-doc.el + +(autoload 'terraform-doc "terraform-doc" "\ +Look up PROVIDER@VERSION. + +(fn &optional PROVIDER VERSION)" t) +(register-definition-prefixes "terraform-doc" '("terraform-")) + +;;; End of scraped data + +(provide 'terraform-doc-autoloads) + +;; Local Variables: +;; version-control: never +;; no-byte-compile: t +;; no-update-autoloads: t +;; no-native-compile: t +;; coding: utf-8-emacs-unix +;; End: + +;;; terraform-doc-autoloads.el ends here diff --git a/elpa/terraform-doc-20240714.418/terraform-doc-pkg.el b/elpa/terraform-doc-20240714.418/terraform-doc-pkg.el new file mode 100644 index 00000000..4ff55b03 --- /dev/null +++ b/elpa/terraform-doc-20240714.418/terraform-doc-pkg.el @@ -0,0 +1,13 @@ +;; -*- no-byte-compile: t; lexical-binding: nil -*- +(define-package "terraform-doc" "20240714.418" + "Look up terraform documentation on the fly." + '((emacs "25.1") + (request "0.3.0") + (promise "1.1") + (org "9.2")) + :url "https://github.com/TxGVNN/terraform-doc" + :commit "26a6674fcf6f16e4865ff5e6600bb273fdc77779" + :revdesc "26a6674fcf6f" + :keywords '("comm" "docs" "tools" "terraform") + :authors '(("Giap Tran" . "txgvnn@gmail.com")) + :maintainers '(("Giap Tran" . "txgvnn@gmail.com"))) diff --git a/elpa/terraform-doc-20240714.418/terraform-doc.el b/elpa/terraform-doc-20240714.418/terraform-doc.el new file mode 100644 index 00000000..f0ffb96d --- /dev/null +++ b/elpa/terraform-doc-20240714.418/terraform-doc.el @@ -0,0 +1,228 @@ +;;; terraform-doc.el --- Look up terraform documentation on the fly -*- lexical-binding: t -*- + +;; Copyright (C) 2019 Giap Tran + +;; Author: Giap Tran +;; URL: https://github.com/TxGVNN/terraform-doc +;; Package-Version: 20240714.418 +;; Package-Revision: 26a6674fcf6f +;; Package-Requires: ((emacs "25.1") (request "0.3.0") (promise "1.1") (org "9.2")) +;; Keywords: comm, docs, tools, terraform + +;; This file is NOT part of GNU Emacs. + +;; This file is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3, or (at your option) +;; any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; For a full copy of the GNU General Public License +;; see . + +;;; Commentary: +;; M-x terraform-doc + +;;; Code: + +(require 'request) +(require 'promise) +(require 'cl-lib) +(require 'org) + +(defgroup terraform nil + "Major mode of `terraform-doc' file." + :group 'languages + :prefix "terraform-doc-") + +(defcustom terraform-doc-markdown-mode-function 'markdown-mode + "Function to use for markdown rendering, e.g. `markdown-mode' or `gfm-view-mode'." + :type 'function + :group 'terraform) + +(defvar terraform-doc-providers + '("1Password/onepassword" "AppViewX/appviewx" "AviatrixSystems/aviatrix" "Azure/alz" "Azure/azapi" + "Azure/modtm" "Backblaze/b2" "BetterStackHQ/better-uptime" "BetterStackHQ/logtail" "CheckPointSW/checkpoint" + "CheckPointSW/infinity-next" "CiscoDevNet/aci" "CiscoDevNet/catalystcenter" "CiscoDevNet/cdo" + "CiscoDevNet/ciscoasa" "CiscoDevNet/ciscomcd" "CiscoDevNet/cml2" "CiscoDevNet/dcnm" "CiscoDevNet/fmc" + "CiscoDevNet/intersight" "CiscoDevNet/iosxe" "CiscoDevNet/iosxr" "CiscoDevNet/ise" "CiscoDevNet/mso" + "CiscoDevNet/nso" "CiscoDevNet/nxos" "CiscoDevNet/sdwan" "CiscoDevNet/secureworkload" + "CiscoDevNet/tetration" "ClickHouse/clickhouse" "Commvault/commvault" "ConsenSys/quorum" + "Constellix/constellix" "CrunchyData/crunchybridge" "DNSMadeEasy/dme" "DataDog/datadog" + "DevCycleHQ/devcycle" "EnterpriseDB/biganimal" "F5Networks/bigip" "F5Networks/f5os" "Flagsmith/flagsmith" + "G-Core/gcore" "G-Core/gcorelabs" "HPE/hpegl" "HewlettPackard/oneview" "Icinga/icinga2" "Juniper/apstra" + "Juniper/junos-vsrx" "JupiterOne/jupiterone" "Keeper-Security/keeper" "Keeper-Security/secretsmanager" + "LumenTech/lumen" "MaterializeInc/materialize" "MyPureCloud/genesyscloud" "NaverCloudPlatform/ncloud" + "NetApp/netapp-cloudmanager" "NetApp/netapp-elementsw" "NetApp/netapp-gcp" "NetApp/netapp-ontap" + "OctopusDeployLabs/octopusdeploy" "OpenNebula/opennebula" "OpsLevel/opslevel" "PacketFabric/packetfabric" + "PagerDuty/pagerduty" "PaloAltoNetworks/bridgecrew" "PaloAltoNetworks/cloudngfwaws" "PaloAltoNetworks/panos" + "PaloAltoNetworks/prismacloud" "PaloAltoNetworks/prismacloud-waas" "PaloAltoNetworks/prismacloudcompute" + "PaloAltoNetworks/scm" "PrefectHQ/prefect" "PureStorage-OpenConnect/cbs" "PureStorage-OpenConnect/fusion" + "RafaySystems/rafay" "RedisLabs/rediscloud" "SUSE/susepubliccloud" "SamsungSDSCloud/samsungcloudplatform" + "SatoriCyber/satori" "ScpDevTerra/scp" "Seagate/lyvecloud" "Seeweb/seeweb" "Snowflake-Labs/snowflake" + "StatusCakeDev/statuscake" "SumoLogic/sumologic" "SyntropyNet/syntropystack" "ThalesGroup/ciphertrust" + "Traceableai/awsapigateway" "Traceableai/lambdabased" "UpCloudLtd/upcloud" "Venafi/venafi" + "Venafi/venafi-token" "a10networks/thunder" "a10networks/vthunder" "abbeylabs/abbey" "ably/ably" + "accuknox/accuknox" "advancedhosting/ah" "airbytehq/airbyte" "aiven/aiven" "akamai/akamai" + "alertmixer/amixr" "aliyun/alibabacloudstack" "aliyun/alicloud" "alkiranet/alkira" "anexia-it/anxcloud" + "aquasecurity/aquasec" "ariga/atlas" "aristanetworks/cloudeos" "aristanetworks/cloudvision" "aruba/aoscx" + "assistanz/stackbill" "auth0/auth0" "aztfmod/azurecaf" "barracudanetworks/barracudawaf" + "bluecatlabs/bluecat" "brightbox/brightbox" "britive/britive" "buddy/buddy" "buildkite/buildkite" + "castai/castai" "chainguard-dev/apko" "chainguard-dev/chainguard" "chainguard-dev/cosign" + "chainguard-dev/imagetest" "chainguard-dev/ko" "chainguard-dev/oci" "checkly/checkly" + "circonus-labs/circonus" "citrix/citrix" "citrix/citrixadc" "civo/civo" "cloudera/cdp" + "cloudflare/cloudflare" "cloudscale-ch/cloudscale" "cloudsigma/cloudsigma" "cloudsmith-io/cloudsmith" + "cloudtamer-io/cloudtamerio" "clumio-code/clumio" "cockroachdb/cockroach" "codefresh-io/codefresh" + "coder/coder" "cohesity/cohesity" "cohesive/cohesivenet" "configcat/configcat" "confluentinc/confluent" + "controlplane-com/cpln" "coralogix/coralogix" "couchbasecloud/couchbase-capella" + "couchbasecloud/couchbasecapella" "databricks/databricks" "datastax/astra" "dell/apex" "dell/ome" + "dell/powerflex" "dell/powermax" "dell/powerscale" "dell/powerstore" "dell/redfish" + "delphix-integrations/delphix" "digitalocean/digitalocean" "dnsimple/dnsimple" "dome9/dome9" + "dynatrace-oss/dynatrace" "elastic/ec" "elastic/elasticstack" "equinix/equinix" "equinix/metal" + "exoscale/exoscale" "fastly/fastly" "firehydrant/firehydrant" "fivetran/fivetran" "fortanix/dsm" + "fortinetdev/fortiadc" "fortinetdev/fortianalyzer" "fortinetdev/fortiflexvm" "fortinetdev/fortimanager" + "fortinetdev/fortios" "fortinetdev/fortiswitch" "genesiscloud/genesiscloud" "gitlabhq/gitlab" + "gocachebr/gocache" "grafana/grafana" "gridscale/gridscale" "harness/harness" "hashicorp/ad" + "hashicorp/archive" "hashicorp/aws" "hashicorp/awscc" "hashicorp/azuread" "hashicorp/azurerm" + "hashicorp/azurestack" "hashicorp/boundary" "hashicorp/cloudinit" "hashicorp/consul" "hashicorp/dns" + "hashicorp/external" "hashicorp/google" "hashicorp/google-beta" "hashicorp/googleworkspace" "hashicorp/hcp" + "hashicorp/hcs" "hashicorp/helm" "hashicorp/http" "hashicorp/kubernetes" "hashicorp/local" "hashicorp/nomad" + "hashicorp/null" "hashicorp/opc" "hashicorp/oraclepaas" "hashicorp/random" "hashicorp/salesforce" + "hashicorp/template" "hashicorp/tfe" "hashicorp/time" "hashicorp/tls" "hashicorp/vault" "hashicorp/vsphere" + "hashicorp/waypoint" "heroku/heroku" "hetznercloud/hcloud" "hivelocity/hivelocity" "honeycombio/honeycombio" + "hundio/hund" "iLert/ilert" "illumio/illumio-core" "indykite/indykite" "infobloxopen/b1ddi" + "infobloxopen/infoblox" "infracost/infracost" "infrahq/infra" "instaclustr/instaclustr" + "integrations/github" "ionos-cloud/ionoscloud" "ionos-cloud/profitbricks" "ionos-developer/ionosdeveloper" + "iterative/iterative" "itglobalcom/serverspace" "jfrog/artifactory" "jfrog/pipeline" "jfrog/platform" + "jfrog/project" "jfrog/xray" "joyent/triton" "kaleido-io/kaleido" "kentik/kentik-cloudexport" + "kentik/kentik-synthetics" "kestra-io/kestra" "keyfactor-pub/keyfactor" "kionsoftware/kion" "koyeb/koyeb" + "lacework/lacework" "latitudesh/latitudesh" "launchdarkly/launchdarkly" "lightstep/lightstep" + "linode/linode" "llnw/limelight" "logicmonitor/logicmonitor" "logzio/logzio" "mariadb-corporation/skysql" + "mariadb-corporation/skysql-beta" "metalsoft-io/metalcloud" "microsoft/azuredevops" "mondoohq/mondoo" + "mongodb/mongodbatlas" "multycloud/multy" "netactuate/netactuate" "netooze/netooze" "netrisai/netris" + "netskopeoss/netskope" "netskopeoss/netskopebwan" "newrelic/newrelic" "ngrok/ngrok" "nhn-cloud/nhncloud" + "nirmata/nirmata" "nobl9/nobl9" "ns1-terraform/ns1" "nttcom/ecl" "nttcom/fic" "nullstone-io/dockerless" + "nullstone-io/ns" "nutanix/nutanix" "nutanix/nutanixkps" "okta/okta" "oktadeveloper/oktaasa" + "onelogin/onelogin" "opalsecurity/opal" "oracle/oci" "orcasecurity/orcasecurity" "outscale/outscale" + "ovh/ovh" "panther-labs/panther" "phoenixnap/pnap" "pingidentity/davinci" "pingidentity/pingdirectory" + "pingidentity/pingfederate" "pingidentity/pingone" "prosimo-io/prosimo" "rackn/drp" "rancher/rancher2" + "rancher/rke" "rockset/rockset" "rollbar/rollbar" "rubrikinc/polaris" "rundeck/rundeck" "scaleway/scaleway" + "sematext/sematext" "shipa-corp/shipa" "shorelinesoftware/shoreline" "siderolabs/talos" + "signalsciences/sigsci" "singlestore-labs/singlestoredb" "site24x7/site24x7" "skytap/skytap" + "snyk-terraform-assets/snyk" "spectrocloud/spectrocloud" "splunk/artifacts" "splunk/splunk" + "splunk/splunkconfig" "splunk/synthetics" "splunk/victorops" "splunk-terraform/signalfx" "spotinst/spotinst" + "squaredup/squaredup" "stackpath/stackpath" "streamkap-com/streamkap" "strongdm/sdm" "symopsio/sym" + "sysdiglabs/sysdig" "temporalio/temporalcloud" "tencentcloudstack/tencentcloud" "terraform-redhat/rhcs" + "thousandeyes/thousandeyes" "tidbcloud/tidbcloud" "timeplus-io/timeplus" "timescale/timescale" + "transloadit/transloadit" "turbot/pipes" "turbot/steampipecloud" "turbot/turbot" "ultradns/ultradns" + "valtix-security/valtix" "vantage-sh/vantage" "vercel/vercel" "versa-networks/versadirector" "vmware/avi" + "vmware/nsxt" "vmware/nsxt-virtual-private-cloud" "vmware/tanzu-mission-control" "vmware/vcd" "vmware/vcda" + "vmware/vcf" "vmware/vmc" "vmware/vra" "vmware/vra7" "vmware/wavefront" "vmware-tanzu/carvel" + "volterraedge/volterra" "vultr/vultr" "wallix/waapm" "zededa/zedcloud" "zenlayer/zenlayercloud" + "zentralopensource/zentral" "zerotier/zerotier" "zitadel/zitadel" "zscaler/zia" "zscaler/zpa")) + +(defun terraform-doc--get-version(full-name) + "Get tags of the provider FULL-NAME." + ;; { "type": "provider-versions","id": "32928","attributes": { "version": "v2.4.0"}} + ;; return a set of (tag . id) + (mapcar + (lambda (x) + (cons + (cdr (assoc 'version (cdr (assoc 'attributes x)))) + (cdr (assoc 'id x)))) + (with-temp-buffer + (url-insert-file-contents (format "https://registry.terraform.io/v2/providers/%s?include=provider-versions" full-name)) + (cdr (assoc 'included (json-read)))))) + +;;;###autoload +(defun terraform-doc (&optional provider version) + "Look up PROVIDER@VERSION." + (interactive (list + (completing-read + "Provider: " + terraform-doc-providers) + nil)) + (let ((version-list (terraform-doc--get-version provider))) + (unless version + (setq version (completing-read "Version: " version-list nil nil nil nil (car version-list)))) + (terraform-doc--render-tree provider version (cdr (assoc version version-list))))) + +(defun terraform--prepare-buffer (buf &optional msg) + "Print MSG message and prepare window for BUF buffer." + (when (not (equal (window-buffer) buf)) + (switch-to-buffer-other-window buf)) + (with-current-buffer buf + (read-only-mode -1) + (erase-buffer) + (insert (if msg msg "Loading..."))) buf) + +(defun terraform-doc--render-tree (provider version id) + "Render the PROVIDER@VERSION(ID)." + (let ((url (format "https://registry.terraform.io/v2/provider-versions/%s?include=provider-docs" id)) + (buffer-name (format "*Terraform:%s@%s*" provider version))) + (terraform--prepare-buffer (get-buffer-create buffer-name)) + (promise-chain (terraform--promise-dom url) + (then (lambda (result) + (terraform--print-frontpage result provider version))) + (promise-catch (lambda (reason) + (message "catch error in promise prontpage: %s" reason)))))) + + +(defun terraform--promise-dom (url) + "Promise (url . dom) from URL with curl." + (promise-new + (lambda (resolve reject) + (request url + :parser (lambda () (json-read)) + :error (cl-function (lambda (&rest args &key error-thrown &allow-other-keys) + (funcall reject error-thrown))) + :success (cl-function (lambda (&key data &allow-other-keys) + (funcall resolve data))))))) + +(defun terraform--print-frontpage-item (thing) + "Print THING of PROVIDER." + (let* ((provider (cdr (assoc 'provider thing))) + (version (cdr (assoc 'version thing))) + ;; (title (cdr (assoc 'title (cdr (assoc 'attributes thing))))) + (path (cdr (assoc 'path (cdr (assoc 'attributes thing))))) + (url (format "https://registry.terraform.io/v2/provider-docs/%s" (cdr (assoc 'id thing))))) + (insert (format "[[elisp:(terraform-doc--render-object \"%s\" \"*Terraform:%s@%s:%s\")][%s]]\n" + url + provider version path + path)))) + +(defun terraform-doc--render-object (url buffer-name) + "Render data of URL into BUFFER-NAME buffer." + (terraform--prepare-buffer buffer-name) + (promise-chain (terraform--promise-dom url) + (then (lambda (result) + (let ((buf (get-buffer-create buffer-name))) + (with-current-buffer buf + (read-only-mode -1) + (erase-buffer) + (insert (format "%s" (cdr (assoc 'content (cdr (assoc 'attributes (cdr (assoc 'data result)))))))) + (if (fboundp terraform-doc-markdown-mode-function) + (funcall terraform-doc-markdown-mode-function)) + (switch-to-buffer buf))))) + (promise-catch (lambda (reason) + (message "catch error in promise prontpage: %s" reason))))) + +(defun terraform--print-frontpage (dom provider version) + "Parse DOM and render on buffer of PROVIDER@VERSION." + (with-current-buffer (get-buffer-create (format "*Terraform:%s@%s*" provider version)) + (read-only-mode -1) + (erase-buffer) + (let* ((items (cdr (assoc 'included dom))) + ;; push provider and version to data element + (data (mapcar (lambda (x) (append x (list (cons 'provider provider) (cons 'version version)))) items))) + (cl-mapcar #'terraform--print-frontpage-item data)) + (org-mode) + (setq-local org-link-elisp-confirm-function nil) + (goto-char (point-min)))) + +(provide 'terraform-doc) +;;; terraform-doc.el ends here -- 2.47.3