From 5e1a930a58d535d20e09286a327c76c14ca41534 Mon Sep 17 00:00:00 2001 From: Devon Blandin Date: Mon, 9 May 2016 13:54:56 -0400 Subject: [PATCH 1/4] Open files with utf-8-sig encoding to adjust for BOM signatures Files encoded with `BOM` signatures need a bit more care when they're read and encoded with `utf-8` encoding. This commit updates the read call to use the `utf-8-sig` encoding to adjust for these `BOM` signatures. --- codeclimate_test_reporter/components/file_coverage.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/codeclimate_test_reporter/components/file_coverage.py b/codeclimate_test_reporter/components/file_coverage.py index 1d70ef2..1a43930 100644 --- a/codeclimate_test_reporter/components/file_coverage.py +++ b/codeclimate_test_reporter/components/file_coverage.py @@ -1,6 +1,10 @@ import json +import sys from hashlib import sha1 +if sys.version_info < (3,0): + from io import open + class FileCoverage: def __init__(self, file_node): @@ -36,7 +40,7 @@ def __line_nodes(self): return self.file_node.findall("lines/line") def __blob(self): - contents = open(self.__filename(), "r").read() + contents = open(self.__filename(), "r", encoding="utf-8-sig").read() header = "blob " + str(len(contents)) + "\0" return sha1((header + contents).encode("utf-8")).hexdigest() From 1e06f9b03bbe05687fe1669058640803c716d40d Mon Sep 17 00:00:00 2001 From: Devon Blandin Date: Mon, 9 May 2016 14:05:14 -0400 Subject: [PATCH 2/4] Only read source files once during processing This updates the `FileCoverage` class to read the file source first and refer to that initial read during processing. --- codeclimate_test_reporter/components/file_coverage.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/codeclimate_test_reporter/components/file_coverage.py b/codeclimate_test_reporter/components/file_coverage.py index 1a43930..b9b38df 100644 --- a/codeclimate_test_reporter/components/file_coverage.py +++ b/codeclimate_test_reporter/components/file_coverage.py @@ -8,6 +8,7 @@ class FileCoverage: def __init__(self, file_node): + self.file_body = None self.file_node = file_node self.__process() @@ -40,11 +41,17 @@ def __line_nodes(self): return self.file_node.findall("lines/line") def __blob(self): - contents = open(self.__filename(), "r", encoding="utf-8-sig").read() + contents = self.__file_body() header = "blob " + str(len(contents)) + "\0" return sha1((header + contents).encode("utf-8")).hexdigest() + def __file_body(self): + if not self.file_body: + self.file_body = open(self.__filename(), "r", encoding="utf-8-sig").read() + + return self.file_body + def __filename(self): return self.file_node.get("filename") @@ -55,7 +62,7 @@ def __covered_strength(self): return self.__guard_division(self.hits, self.covered) def __num_lines(self): - return sum(1 for line in open(self.__filename())) + return len(self.__file_body().splitlines()) def __covered_percent(self): return self.__guard_division(self.covered, self.total) From 496f0ff39ea350d15bdf402d621a7c7d814ce090 Mon Sep 17 00:00:00 2001 From: Devon Blandin Date: Mon, 9 May 2016 14:15:11 -0400 Subject: [PATCH 3/4] CC issues --- codeclimate_test_reporter/components/file_coverage.py | 2 +- tests/test_runner.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/codeclimate_test_reporter/components/file_coverage.py b/codeclimate_test_reporter/components/file_coverage.py index b9b38df..9280e37 100644 --- a/codeclimate_test_reporter/components/file_coverage.py +++ b/codeclimate_test_reporter/components/file_coverage.py @@ -2,7 +2,7 @@ import sys from hashlib import sha1 -if sys.version_info < (3,0): +if sys.version_info < (3, 0): from io import open diff --git a/tests/test_runner.py b/tests/test_runner.py index 4153d2d..cc2552e 100644 --- a/tests/test_runner.py +++ b/tests/test_runner.py @@ -4,7 +4,7 @@ import subprocess import sys -if sys.version_info >= (3,0): +if sys.version_info >= (3, 0): from io import StringIO else: from StringIO import StringIO From f3bb89a58375ac91efb1fa6f3426c0a7e7dd85d5 Mon Sep 17 00:00:00 2001 From: Devon Blandin Date: Mon, 9 May 2016 14:31:35 -0400 Subject: [PATCH 4/4] Add BOM signature to test fixture --- tests/fixtures/source.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/fixtures/source.py b/tests/fixtures/source.py index 3cee368..d7b55f0 100644 --- a/tests/fixtures/source.py +++ b/tests/fixtures/source.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python class Person: