Skip to content

Commit

Permalink
slither: implement shell completions with shtab
Browse files Browse the repository at this point in the history
These can be generated by running e.g. `slither --print-completion zsh`
and installed as usual.

Closes #2055
  • Loading branch information
elopez committed Feb 20, 2024
1 parent 9fa8e8e commit 5a3a2f8
Show file tree
Hide file tree
Showing 15 changed files with 66 additions and 19 deletions.
1 change: 1 addition & 0 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
"eth-abi>=4.0.0",
"eth-typing>=3.0.0",
"eth-utils>=2.1.0",
"shtab>=1.6.5",
],
extras_require={
"lint": [
Expand Down
16 changes: 10 additions & 6 deletions slither/__main__.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
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
Expand Down Expand Up @@ -290,6 +291,8 @@ def parse_args(
usage=usage,
)

shtab.add_argument_to(parser)

parser.add_argument("filename", help=argparse.SUPPRESS)

cryticparser.init(parser)
Expand Down Expand Up @@ -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",
Expand All @@ -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(
Expand Down Expand Up @@ -540,7 +544,7 @@ def parse_args(
action="store",
dest="config_file",
default=None,
)
).complete = shtab.FILE

group_misc.add_argument(
"--change-line-prefix",
Expand Down
3 changes: 3 additions & 0 deletions slither/tools/doctor/__main__.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
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
Expand All @@ -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
Expand Down
3 changes: 3 additions & 0 deletions slither/tools/documentation/__main__.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
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
Expand All @@ -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(
Expand Down
5 changes: 4 additions & 1 deletion slither/tools/erc_conformance/__main__.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
from typing import Any, Dict, List, Callable

from crytic_compile import cryticparser
import shtab

from slither import Slither
from slither.core.declarations import Contract
Expand Down Expand Up @@ -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(
Expand All @@ -61,7 +64,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)
Expand Down
10 changes: 7 additions & 3 deletions slither/tools/flattening/__main__.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

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 (
Expand All @@ -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)
Expand All @@ -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")
Expand Down
3 changes: 3 additions & 0 deletions slither/tools/interface/__main__.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
from pathlib import Path

from crytic_compile import cryticparser
import shtab

from slither import Slither
from slither.utils.code_generation import generate_interface
Expand All @@ -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.",
Expand Down
5 changes: 4 additions & 1 deletion slither/tools/kspec_coverage/__main__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
import logging
import argparse
from crytic_compile import cryticparser
import shtab
from slither.tools.kspec_coverage.kspec_coverage import kspec_coverage

logging.basicConfig()
Expand All @@ -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."
)
Expand All @@ -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)

Expand Down
5 changes: 4 additions & 1 deletion slither/tools/mutator/__main__.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
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
Expand Down Expand Up @@ -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(
Expand All @@ -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(
Expand Down
3 changes: 3 additions & 0 deletions slither/tools/possible_paths/__main__.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
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
Expand All @@ -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."
)
Expand Down
3 changes: 3 additions & 0 deletions slither/tools/properties/__main__.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
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
Expand Down Expand Up @@ -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."
)
Expand Down
5 changes: 4 additions & 1 deletion slither/tools/read_storage/__main__.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import argparse

from crytic_compile import cryticparser
import shtab

from slither import Slither
from slither.exceptions import SlitherError
Expand All @@ -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.",
Expand Down Expand Up @@ -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",
Expand Down
11 changes: 8 additions & 3 deletions slither/tools/similarity/__main__.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import sys

from crytic_compile import cryticparser
import shtab

from slither.tools.similarity.info import info
from slither.tools.similarity.test import test
Expand All @@ -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")

Expand All @@ -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",
Expand Down
5 changes: 4 additions & 1 deletion slither/tools/slither_format/__main__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
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
Expand Down Expand Up @@ -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."
)
Expand Down Expand Up @@ -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(
Expand Down
Loading

0 comments on commit 5a3a2f8

Please sign in to comment.