slither: implement shell completions with `shtab`

These can be generated by running e.g. `slither --print-completion zsh`
and installed as usual.

Closes #2055
dev-autocompletion
Emilio López 9 months ago
parent 9fa8e8ea1f
commit b2b1c5a88b
  1. 1
      setup.py
  2. 16
      slither/__main__.py
  3. 3
      slither/tools/doctor/__main__.py
  4. 3
      slither/tools/documentation/__main__.py
  5. 8
      slither/tools/erc_conformance/__main__.py
  6. 10
      slither/tools/flattening/__main__.py
  7. 3
      slither/tools/interface/__main__.py
  8. 5
      slither/tools/kspec_coverage/__main__.py
  9. 5
      slither/tools/mutator/__main__.py
  10. 3
      slither/tools/possible_paths/__main__.py
  11. 3
      slither/tools/properties/__main__.py
  12. 5
      slither/tools/read_storage/__main__.py
  13. 11
      slither/tools/similarity/__main__.py
  14. 5
      slither/tools/slither_format/__main__.py
  15. 7
      slither/tools/upgradeability/__main__.py

@ -21,6 +21,7 @@ setup(
"eth-abi>=4.0.0",
"eth-typing>=3.0.0",
"eth-utils>=2.1.0",
"shtab>=1.6.5",
],
extras_require={
"lint": [

@ -18,6 +18,7 @@ from crytic_compile import cryticparser, CryticCompile
from crytic_compile.platform.standard import generate_standard_export
from crytic_compile.platform.etherscan import SUPPORTED_NETWORK
from crytic_compile import compile_all, is_supported
import shtab
from slither.detectors import all_detectors
from slither.detectors.abstract_detector import AbstractDetector, DetectorClassification
@ -290,6 +291,8 @@ def parse_args(
usage=usage,
)
shtab.add_argument_to(parser)
parser.add_argument("filename", help=argparse.SUPPRESS)
cryticparser.init(parser)
@ -465,28 +468,28 @@ def parse_args(
help='Export the results as a JSON file ("--json -" to export to stdout)',
action="store",
default=defaults_flag_in_config["json"],
)
).complete = shtab.FILE
group_misc.add_argument(
"--sarif",
help='Export the results as a SARIF JSON file ("--sarif -" to export to stdout)',
action="store",
default=defaults_flag_in_config["sarif"],
)
).complete = shtab.FILE
group_misc.add_argument(
"--sarif-input",
help="Sarif input (beta)",
action="store",
default=defaults_flag_in_config["sarif_input"],
)
).complete = shtab.FILE
group_misc.add_argument(
"--sarif-triage",
help="Sarif triage (beta)",
action="store",
default=defaults_flag_in_config["sarif_triage"],
)
).complete = shtab.FILE
group_misc.add_argument(
"--json-types",
@ -502,13 +505,14 @@ def parse_args(
help="Export the results as a zipped JSON file",
action="store",
default=defaults_flag_in_config["zip"],
)
).complete = shtab.FILE
group_misc.add_argument(
"--zip-type",
help=f'Zip compression type. One of {",".join(ZIP_TYPES_ACCEPTED.keys())}. Default lzma',
action="store",
default=defaults_flag_in_config["zip_type"],
choices=list(ZIP_TYPES_ACCEPTED.keys()),
)
group_misc.add_argument(
@ -540,7 +544,7 @@ def parse_args(
action="store",
dest="config_file",
default=None,
)
).complete = shtab.FILE
group_misc.add_argument(
"--change-line-prefix",

@ -3,6 +3,7 @@ import logging
import sys
from crytic_compile import cryticparser
import shtab
from slither.tools.doctor.utils import report_section
from slither.tools.doctor.checks import ALL_CHECKS
@ -18,6 +19,8 @@ def parse_args() -> argparse.Namespace:
usage="slither-doctor project",
)
shtab.add_argument_to(parser)
parser.add_argument("project", help="The codebase to be tested.")
# Add default arguments from crytic-compile

@ -3,6 +3,7 @@ import logging
import uuid
from typing import Optional, Dict, List
from crytic_compile import cryticparser
import shtab
from slither import Slither
from slither.core.compilation_unit import SlitherCompilationUnit
from slither.core.declarations import Function
@ -26,6 +27,8 @@ def parse_args() -> argparse.Namespace:
usage="slither-documentation filename",
)
shtab.add_argument_to(parser)
parser.add_argument("project", help="The target directory/Solidity file.")
parser.add_argument(

@ -4,6 +4,7 @@ from collections import defaultdict
from typing import Any, Dict, List, Callable
from crytic_compile import cryticparser
import shtab
from slither import Slither
from slither.core.declarations import Contract
@ -42,6 +43,8 @@ def parse_args() -> argparse.Namespace:
usage="slither-check-erc project contractName",
)
shtab.add_argument_to(parser)
parser.add_argument("project", help="The codebase to be tested.")
parser.add_argument(
@ -53,7 +56,8 @@ def parse_args() -> argparse.Namespace:
"--erc",
help=f"ERC to be tested, available {','.join(ERCS.keys())} (default ERC20)",
action="store",
default="erc20",
default="ERC20",
choices=list(ERCS.keys()),
)
parser.add_argument(
@ -61,7 +65,7 @@ def parse_args() -> argparse.Namespace:
help='Export the results as a JSON file ("--json -" to export to stdout)',
action="store",
default=False,
)
).complete = shtab.FILE
# Add default arguments from crytic-compile
cryticparser.init(parser)

@ -4,6 +4,7 @@ import sys
from crytic_compile import cryticparser
from crytic_compile.utils.zip import ZIP_TYPES_ACCEPTED
import shtab
from slither import Slither
from slither.tools.flattening.flattening import (
@ -28,6 +29,8 @@ def parse_args() -> argparse.Namespace:
usage="slither-flat filename",
)
shtab.add_argument_to(parser)
parser.add_argument("filename", help="The filename of the contract or project to analyze.")
parser.add_argument("--contract", help="Flatten one contract.", default=None)
@ -44,27 +47,28 @@ def parse_args() -> argparse.Namespace:
"--dir",
help=f"Export directory (default: {DEFAULT_EXPORT_PATH}).",
default=None,
)
).complete = shtab.DIRECTORY
group_export.add_argument(
"--json",
help='Export the results as a JSON file ("--json -" to export to stdout)',
action="store",
default=None,
)
).complete = shtab.FILE
parser.add_argument(
"--zip",
help="Export all the files to a zip file",
action="store",
default=None,
)
).complete = shtab.FILE
parser.add_argument(
"--zip-type",
help=f"Zip compression type. One of {','.join(ZIP_TYPES_ACCEPTED.keys())}. Default lzma",
action="store",
default=None,
choices=list(ZIP_TYPES_ACCEPTED.keys()),
)
group_patching = parser.add_argument_group("Patching options")

@ -3,6 +3,7 @@ import logging
from pathlib import Path
from crytic_compile import cryticparser
import shtab
from slither import Slither
from slither.utils.code_generation import generate_interface
@ -22,6 +23,8 @@ def parse_args() -> argparse.Namespace:
usage=("slither-interface <ContractName> <source file or deployment address>"),
)
shtab.add_argument_to(parser)
parser.add_argument(
"contract_source",
help="The name of the contract (case sensitive) followed by the deployed contract address if verified on etherscan or project directory/filename for local contracts.",

@ -2,6 +2,7 @@ import sys
import logging
import argparse
from crytic_compile import cryticparser
import shtab
from slither.tools.kspec_coverage.kspec_coverage import kspec_coverage
logging.basicConfig()
@ -26,6 +27,8 @@ def parse_args() -> argparse.Namespace:
usage="slither-kspec-coverage contract.sol kspec.md",
)
shtab.add_argument_to(parser)
parser.add_argument(
"contract", help="The filename of the contract or truffle directory to analyze."
)
@ -45,7 +48,7 @@ def parse_args() -> argparse.Namespace:
help='Export the results as a JSON file ("--json -" to export to stdout)',
action="store",
default=False,
)
).complete = shtab.FILE
cryticparser.init(parser)

@ -6,6 +6,7 @@ import os
import shutil
from typing import Type, List, Any, Optional
from crytic_compile import cryticparser
import shtab
from slither import Slither
from slither.tools.mutator.mutators import all_mutators
from slither.utils.colors import yellow, magenta
@ -38,6 +39,8 @@ def parse_args() -> argparse.Namespace:
usage="slither-mutate <codebase> --test-cmd <test command> <options>",
)
shtab.add_argument_to(parser)
parser.add_argument("codebase", help="Codebase to analyze (.sol file, project directory, ...)")
parser.add_argument(
@ -63,7 +66,7 @@ def parse_args() -> argparse.Namespace:
# output directory argument
parser.add_argument(
"--output-dir", help="Name of output directory (by default 'mutation_campaign')"
)
).complete = shtab.DIRECTORY
# to print just all the mutants
parser.add_argument(

@ -4,6 +4,7 @@ import logging
from argparse import ArgumentParser, Namespace
from crytic_compile import cryticparser
import shtab
from slither import Slither
from slither.core.declarations import FunctionContract
from slither.utils.colors import red
@ -27,6 +28,8 @@ def parse_args() -> Namespace:
usage="possible_paths.py filename [contract.function targets]",
)
shtab.add_argument_to(parser)
parser.add_argument(
"filename", help="The filename of the contract or truffle directory to analyze."
)

@ -4,6 +4,7 @@ import sys
from typing import Any
from crytic_compile import cryticparser
import shtab
from slither import Slither
from slither.tools.properties.properties.erc20 import generate_erc20, ERC20_PROPERTIES
@ -73,6 +74,8 @@ def parse_args() -> argparse.Namespace:
formatter_class=argparse.RawDescriptionHelpFormatter,
)
shtab.add_argument_to(parser)
parser.add_argument(
"filename", help="The filename of the contract or project directory to analyze."
)

@ -5,6 +5,7 @@ import json
import argparse
from crytic_compile import cryticparser
import shtab
from slither import Slither
from slither.exceptions import SlitherError
@ -29,6 +30,8 @@ def parse_args() -> argparse.Namespace:
),
)
shtab.add_argument_to(parser)
parser.add_argument(
"contract_source",
help="The deployed contract address if verified on etherscan. Prepend project directory for unverified contracts.",
@ -77,7 +80,7 @@ def parse_args() -> argparse.Namespace:
"--json",
action="store",
help="Save the result in a JSON file.",
)
).complete = shtab.FILE
parser.add_argument(
"--value",

@ -5,6 +5,7 @@ import logging
import sys
from crytic_compile import cryticparser
import shtab
from slither.tools.similarity.info import info
from slither.tools.similarity.test import test
@ -22,11 +23,15 @@ def parse_args() -> argparse.Namespace:
description="Code similarity detection tool. For usage, see https://github.com/crytic/slither/wiki/Code-Similarity-detector"
)
parser.add_argument("mode", help="|".join(modes))
shtab.add_argument_to(parser)
parser.add_argument("mode", help="|".join(modes), choices=modes)
parser.add_argument("model", help="model.bin")
parser.add_argument("--filename", action="store", dest="filename", help="contract.sol")
parser.add_argument(
"--filename", action="store", dest="filename", help="contract.sol"
).complete = shtab.FILE
parser.add_argument("--fname", action="store", dest="fname", help="Target function")
@ -51,7 +56,7 @@ def parse_args() -> argparse.Namespace:
parser.add_argument(
"--input", action="store", dest="input", help="File or directory used as input"
)
).complete = shtab.FILE
parser.add_argument(
"--version",

@ -2,6 +2,7 @@ import sys
import argparse
import logging
from crytic_compile import cryticparser
import shtab
from slither import Slither
from slither.utils.command_line import read_config_file
from slither.tools.slither_format.slither_format import slither_format
@ -30,6 +31,8 @@ def parse_args() -> argparse.Namespace:
"""
parser = argparse.ArgumentParser(description="slither_format", usage="slither_format filename")
shtab.add_argument_to(parser)
parser.add_argument(
"filename", help="The filename of the contract or truffle directory to analyze."
)
@ -60,7 +63,7 @@ def parse_args() -> argparse.Namespace:
action="store",
dest="config_file",
default="slither.config.json",
)
).complete = shtab.FILE
group_detector = parser.add_argument_group("Detectors")
group_detector.add_argument(

@ -6,6 +6,7 @@ import sys
from typing import List, Any, Type, Dict, Tuple, Union, Sequence, Optional
from crytic_compile import cryticparser
import shtab
from slither import Slither
@ -36,6 +37,8 @@ def parse_args(check_classes: List[Type[AbstractCheck]]) -> argparse.Namespace:
usage="slither-check-upgradeability contract.sol ContractName",
)
shtab.add_argument_to(parser)
group_checks = parser.add_argument_group("Checks")
parser.add_argument("contract.sol", help="Codebase to analyze")
@ -47,14 +50,14 @@ def parse_args(check_classes: List[Type[AbstractCheck]]) -> argparse.Namespace:
parser.add_argument("--new-contract-name", help="New contract name (if changed)")
parser.add_argument(
"--new-contract-filename", help="New implementation filename (if different)"
)
).complete = shtab.FILE
parser.add_argument(
"--json",
help='Export the results as a JSON file ("--json -" to export to stdout)',
action="store",
default=False,
)
).complete = shtab.FILE
group_checks.add_argument(
"--detect",

Loading…
Cancel
Save