Skip to main content

Cfn Lsp Extra

Project description

Cfn Lsp Extra

Python Version PyPI codecov

An experimental cloudformation language server (with support for SAM templates) built on top of cfn-lint and the Cloudformation user guide, aiming to provide hovering, completion, etc. YAML and JSON are supported, though YAML has more features currently implemented (for example snippets) and will give a better experience. Trust me.

https://user-images.githubusercontent.com/17688577/176939586-df1d9ed8-5ec6-46d5-9f26-7222644047bd.mp4

Features

Method Status
textDocument/hover Done for resources (in particular, required properties for a resource will be auto-expanded), resource properties, subproperties, !Refs and intrinsic functions.
textDocument/completion Done for resources, resource properties, subproperties, property values (for enums), refs, !GetAtts and intrinsic functions. TODO Fn::GetAtt.
textDocument/definition Done for !Refs and !GetAtts. TODO mappings.
textDocument/publishDiagnostics Done through cfnlint.

Also checkout the changelog.

Installation

First install the executable, pipx is recommended, but you can use pip instead if you like to live dangerously:

pipx install cfn-lsp-extra

Or get the bleeding edge from source:

pipx install git+https://github.com/laurencewarne/cfn-lsp-extra.git@$(git ls-remote git@github.com:laurencewarne/cfn-lsp-extra.git | head -1 | cut -f1)

Updating:

pipx upgrade cfn-lsp-extra

Emacs

Install the lsp-cfn.el package.

Neovim

Make sure you're running at least 0.8, then add the following in ~/.config/nvim/filetype.lua:

vim.filetype.add {
  pattern = {
    ['.*'] = {
      priority = math.huge,
      function(path, bufnr)
        local line1 = vim.filetype.getlines(bufnr, 1)
        local line2 = vim.filetype.getlines(bufnr, 2)
        if vim.filetype.matchregex(line1, [[^AWSTemplateFormatVersion]] ) or
           vim.filetype.matchregex(line1, [[AWS::Serverless-2016-10-31]] ) then
          return 'yaml.cloudformation'
        elseif vim.filetype.matchregex(line1, [[["']AWSTemplateFormatVersion]] ) or
           vim.filetype.matchregex(line2, [[["']AWSTemplateFormatVersion]] ) or
           vim.filetype.matchregex(line1, [[AWS::Serverless-2016-10-31]] ) or
           vim.filetype.matchregex(line2, [[AWS::Serverless-2016-10-31]] ) then
          return 'json.cloudformation'
        end
      end,
    },
  },
}

Then you can use one of:

  1. Neovim's built-in LSP client:
require('lspconfig.configs').cfn_lsp = {
  default_config = {
    cmd = { os.getenv("HOME") .. '/.local/bin/cfn-lsp-extra' },
    filetypes = { 'yaml.cloudformation', 'json.cloudformation' },
    root_dir = function(fname)
      return require('lspconfig').util.find_git_ancestor(fname) or vim.fn.getcwd()
    end,
    settings = {
      documentFormatting = false,
    },
  },
}
require('lspconfig').cfn_lsp.setup{}
  1. LanguageClient-neovim:
let g:LanguageClient_serverCommands = {
    \ 'yaml.cloudformation': ['~/.local/bin/cfn-lsp-extra'],
    \ 'json.cloudformation': ['~/.local/bin/cfn-lsp-extra']
    \ }

Patches documenting integration for other editors are very welcome!

Development

cfn-lsp-extra uses nox for virtualenv management and poetry for dependency management. You can install both of them using:

pipx install nox
pipx install poetry

And then run tests, linting, etc (switching 3.9 for whichever Python version):

nox --session tests-3.9              # unit tests
nox --session integration-tests-3.9  # integration tests
nox --session lint-3.9               # flake8 lints
nox --session mypy-3.9               # mypy checks

Alternatives

vscode-cfn-lint

cfn-lint

Note this is used by cfn-lsp-extra under the hood to generate diagnostics. One difference with cfn-lsp-extra is that diagnostics will be refreshed every time you make a change to the document, in other words you don't need to save the file.

yamlls

You can use yamlls in conjunction with the Cloudformation schema at https://www.schemastore.org/json/ as an alternative. For Emacs, lsp-mode can install yamlls for you, from there you could do something like:

(defun my-yamlls-cloudformation-setup ()
  ;; There's also one for serverless
  (lsp-yaml-set-buffer-schema "https://raw.githubusercontent.com/awslabs/goformation/master/schema/cloudformation.schema.json")
  (setq-local
   lsp-yaml-custom-tags
   ["!And"
    "!Base64"
    "!Cidr"
    "!Equals"
    "!FindInMap sequence"
    "!GetAZs"
    "!GetAtt"
    "!If"
    "!ImportValue"
    "!Join sequence"
    "!Not"
    "!Or"
    "!Ref Scalar"
    "!Ref"
    "!Select"
    "!Split"
    "!Sub"
    "!fn"]))

;; Using the mode defined by https://www.emacswiki.org/emacs/CfnLint
(add-hook 'cfn-yaml-mode-hook #'my-yamlls-cloudformation-setup)
(add-hook 'cfn-yaml-mode-hook #'lsp-deferred)

This will give you completions (and some support for value completions?), though no hover documentation.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

cfn_lsp_extra-0.7.0.tar.gz (2.7 MB view details)

Uploaded Source

Built Distribution

cfn_lsp_extra-0.7.0-py3-none-any.whl (2.8 MB view details)

Uploaded Python 3

File details

Details for the file cfn_lsp_extra-0.7.0.tar.gz.

File metadata

  • Download URL: cfn_lsp_extra-0.7.0.tar.gz
  • Upload date:
  • Size: 2.7 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.0 CPython/3.12.5

File hashes

Hashes for cfn_lsp_extra-0.7.0.tar.gz
Algorithm Hash digest
SHA256 d769ea9557b6c8883b46f59694c25657c849afacb8262aa68cda17265cf041ec
MD5 d9882e6873bde65a51c00c1ba51ce890
BLAKE2b-256 543c417d6ae7445b79e8d7a076224eafc106c2d506a4ab14a8f8ac07b6bdcd3a

See more details on using hashes here.

File details

Details for the file cfn_lsp_extra-0.7.0-py3-none-any.whl.

File metadata

File hashes

Hashes for cfn_lsp_extra-0.7.0-py3-none-any.whl
Algorithm Hash digest
SHA256 911751b9e7a54838c9b8c474a6bbc3dbd1e6b99ebc5aa29a7e83013f224a7862
MD5 c17511e3f95c15b936ce79272b38fe8f
BLAKE2b-256 0fa133292982f1a96d476f1ebb2a20a1d603add9cbc256ad1a3737565eeb6e3c

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page