return {
	-- automatic docstring creation for a variety of languages
	{
		"danymat/neogen",
		dependencies = "nvim-treesitter/nvim-treesitter",
		opts = {
			snippet_engine = "luasnip",
		},
		cmd = {
			"Neogen",
		},
		keys = {
			{
				"<localleader>lg",
				function()
					require("neogen").generate()
				end,
				silent = true,
				desc = "generate docstring",
			},
		},
	},

	-- testing setup
	{
		"nvim-neotest/neotest",
		dependencies = {
			"nvim-lua/plenary.nvim",
			"nvim-neotest/nvim-nio",
			"nvim-treesitter/nvim-treesitter",
			"antoinemadec/FixCursorHold.nvim",

			"nvim-neotest/neotest-python",
		},
		config = function()
			require("neotest").setup({
				adapters = {
					require("neotest-python")({
						-- with coverage requires coverage.py and pytest-cov installed
						args = { "--cov", "--doctest-modules" },
					}),
				},
			})
			if require("core.util").is_available("which-key") then
				require("which-key").add({ "<localleader>t", group = "test" })
			end
		end,
		ft = { "python" },
		keys = {
			{
				"<leader>st",
				[[<cmd>lua require('neotest').summary.toggle()<cr>]],
				desc = "toggle test list",
				silent = true,
			},
			{
				"<leader>sT",
				[[<cmd>lua require('neotest').output_panel.toggle()<cr>]],
				desc = "toggle test output",
				silent = true,
			},
			{
				"<localleader>to",
				[[<cmd>lua require('neotest').output.open()<cr>]],
				desc = "toggle test output",
				silent = true,
			},
			{
				"<localleader>tt",
				[[<cmd>lua require('neotest').run.run()<cr>]],
				desc = "run nearest test",
				silent = true,
			},
			{
				"<localleader>td",
				[[<cmd>lua require('neotest').run.run({strategy = "dap"})<cr>]],
				desc = "debug nearest test",
				silent = true,
			}, -- REQUIRES DAP
			{
				"<localleader>tT",
				[[<cmd>lua require('neotest').run.run(vim.fn.expand("%"))<cr>]],
				desc = "test current file",
				silent = true,
			},
			{
				"<localleader>tr",
				[[<cmd>lua require('neotest').run.run_last()<cr>]],
				desc = "re-run last test",
				silent = true,
			},
			{
				"<localleader>tw",
				[[<cmd>lua require('neotest').watch.toggle()<cr>]],
				desc = "watch current test",
				silent = true,
			},
			{
				"<localleader>tW",
				[[<cmd>lua require('neotest').watch.toggle(vim.fn.expand("%"))<cr>]],
				desc = "watch current file",
				silent = true,
			},
		},
	},
	-- TODO: needs to pick up poetry env for python,
	-- currently just hard-codes running through poetry
	{
		"andythigpen/nvim-coverage",
		dependencies = {
			"nvim-lua/plenary.nvim",
		},
		config = function()
			require("coverage").setup({
				lang = { python = { coverage_command = "poetry run coverage json -q -o -" } },
			})
		end,
		ft = { "python" },
		cmd = {
			"Coverage",
			"CoverageLoad",
			"CoverageLoadLcov",
			"CoverageShow",
			"CoverageHide",
			"CoverageToggle",
			"CoverageClear",
			"CoverageSummary",
		},
		keys = {
			{
				"<localleader>tp",
				[[<cmd>Coverage<cr>]],
				desc = "show coverage report",
				silent = true,
			},
			{
				"<localleader>tP",
				[[<cmd>CoverageToggle<cr>]],
				desc = "toggle coverage gutter",
				silent = true,
			},
			{
				"<localleader>ts",
				[[<cmd>CoverageSummary<cr>]],
				desc = "show coverage summary",
				silent = true,
			},
		},
	},
}
