Skip to content

Commit

Permalink
Display metrics and launch report when called with no arguments
Browse files Browse the repository at this point in the history
  • Loading branch information
jacebrowning committed Dec 29, 2020
1 parent 8911d77 commit b14d142
Show file tree
Hide file tree
Showing 6 changed files with 55 additions and 30 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Expand Up @@ -3,6 +3,7 @@
# 4.0 (alpha)

- **BREAKING:** Removed `<owner/repo>` CLI argument in favor of automatic detection.
- Updated the default CLI command to display metrics and launch the report.

## 3.1.1 (2020-02-01)

Expand Down
47 changes: 31 additions & 16 deletions coveragespace/cli.py
@@ -1,6 +1,7 @@
"""Update project metrics on The Coverage Space.
Usage:
coveragespace [--verbose]
coveragespace set <metric> [<value>] [--verbose] [--exit-code]
coveragespace reset [--verbose]
coveragespace view [--verbose]
Expand Down Expand Up @@ -40,32 +41,46 @@ def main():
success = view()
else:
slug = repository.get_slug()
success = call(
slug,
arguments["<metric>"],
arguments["<value>"],
arguments["reset"],
arguments["--verbose"],
arguments["--exit-code"],
)
if arguments["set"]:
success = call(
slug,
arguments["<metric>"],
arguments["<value>"],
verbose=arguments["--verbose"],
hardfail=arguments["--exit-code"],
)
elif arguments["reset"]:
success = call(slug, reset=True)
else:
success = call(slug, launch=True)

if not success and arguments["--exit-code"]:
sys.exit(1)


def call(slug, metric, value, reset=False, verbose=False, hardfail=False):
def call(
slug: str,
metric: str = "overall",
value: float = 0,
*,
reset: bool = False,
launch: bool = False,
verbose: bool = False,
hardfail: bool = False,
):
"""Call the API and display errors."""
url = "{}/{}".format(API, slug)
if reset:
data = {metric: None}
response = client.delete(url, data)
response = client.delete(url)
else:
data = {metric: value or coverage.get_coverage()}
response = client.get(url, data)
data = {metric: value or coverage.get_coverage(always=launch)}
response = client.put(url, data)

if response.status_code == 200:
if verbose:
display("coverage increased", response.json(), colorama.Fore.GREEN)
if verbose or launch:
display("coverage updated", response.json(), colorama.Fore.GREEN)
if launch:
coverage.launch_report(always=True)
return True

if response.status_code == 202:
Expand All @@ -77,7 +92,7 @@ def call(slug, metric, value, reset=False, verbose=False, hardfail=False):
data = response.json()
data["help"] = "To reset metrics, run: ^coveragespace reset$" # type: ignore
display("coverage decreased", data, color)
coverage.launch_report()
coverage.launch_report(always=launch)
return False

try:
Expand Down
10 changes: 5 additions & 5 deletions coveragespace/client.py
Expand Up @@ -11,8 +11,8 @@
cache = Cache()


def get(url, data):
log.info("Getting %s: %s", url, data)
def put(url, data):
log.info("PUT %s: %s", url, data)

response = cache.get((url, data))
if response is None:
Expand All @@ -29,11 +29,11 @@ def get(url, data):
return response


def delete(url, data):
log.info("Deleting %s: %s", url, data)
def delete(url):
log.info("DELETE %s", url)

for delay in [1, 3, 5]:
response = requests.delete(url, data=data)
response = requests.delete(url)
if response.status_code == 500:
time.sleep(delay)
continue
Expand Down
14 changes: 8 additions & 6 deletions coveragespace/coverage.py
Expand Up @@ -45,13 +45,15 @@ def get_report(self, cwd):
raise NotImplementedError


def get_coverage(cwd=None):
def get_coverage(cwd=None, *, always=False) -> float:
"""Extract the current coverage data."""
cwd = cwd or os.getcwd()

plugin = _find_plugin(cwd)
percentage = plugin.get_coverage(cwd)
plugin = _find_plugin(cwd, allow_missing=always)
if plugin is None:
return 0.0

percentage = plugin.get_coverage(cwd)
return round(percentage, 1)


Expand All @@ -64,7 +66,7 @@ def launch_report(cwd=None, *, always=False):
if plugin:
report = plugin.get_report(cwd)

if report and (always or not _launched_recently(report)):
if report and (not _launched_recently(report) or always):
log.info("Launching report: %s", report)
webbrowser.open("file://" + report, new=2, autoraise=True)
elif always:
Expand All @@ -90,8 +92,8 @@ def _find_plugin(cwd, allow_missing=False):
def _launched_recently(path):
now = time.time()
then = cache.get(path, default=0)
elapsed = now - then
log.debug("Last launched %s seconds ago", elapsed)
elapsed = round(now - then, 1)
log.info("Report last launched %s seconds ago", elapsed)
cache.set(path, now)
return elapsed < 60 * 60 # 1 hour

Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
@@ -1,7 +1,7 @@
[tool.poetry]

name = "coveragespace"
version = "4.0a3"
version = "4.0a4"
description = "A place to track your code coverage metrics."

license = "MIT"
Expand Down
11 changes: 9 additions & 2 deletions tests/test_program.py
Expand Up @@ -44,9 +44,16 @@ def cli(env, *args):


def describe_cli():
def it_fails_when_missing_arguments(env):
def it_displays_metrics_and_launches_local_report(env):
cmd = cli(env)

expect(cmd.returncode) == 0
expect(cmd.stderr) == ""
expect(cmd.stdout).contains("coverage updated")

def it_fails_with_unknown_arguments(env):
cmd = cli(env, "foobar")

expect(cmd.returncode) == 1
expect(cmd.stderr).contains("Usage:")

Expand Down Expand Up @@ -78,7 +85,7 @@ def it_always_display_metrics_when_verbose(env):

expect(cmd.returncode) == 0
expect(cmd.stderr) != "" # expect lots of logging
expect(cmd.stdout).contains("coverage increased")
expect(cmd.stdout).contains("coverage updated")

def it_skips_when_running_on_ci(env):
env.environ["CI"] = "true"
Expand Down

0 comments on commit b14d142

Please sign in to comment.