Failed Conditions
Pull Request — master (#1404)
by Abdeali
01:46 queued 12s
created

bears.js.JSONFormatBear.lint()   A

Complexity

Conditions 3

Size

Total Lines 16

Duplication

Lines 0
Ratio 0 %
Metric Value
cc 3
dl 0
loc 16
rs 9.4285
1
import json
2
from collections import OrderedDict
3
4
from coalib.bearlib.abstractions.Lint import Lint
5
from coalib.bearlib.spacing.SpacingHelper import SpacingHelper
6
from coalib.bears.LocalBear import LocalBear
7
from coalib.results.Result import Result
8
9
10
class JSONFormatBear(Lint, LocalBear):
11
    try:
12
        DecodeError = json.decoder.JSONDecodeError
13
    except:
14
        DecodeError = ValueError
15
16
    diff_message = ("This file can be reformatted by sorting keys and "
17
                    "following indentation.")
18
    gives_corrected = True
19
20
    def lint(self, filename, file, **kwargs):
21
        try:
22
            json_content = json.loads(''.join(file),
23
                                      object_pairs_hook=OrderedDict)
24
        except self.DecodeError as err:
25
            return [Result.from_values(
26
                self,
27
                "This file does not contain parsable JSON. '{adv_msg}'"
28
                .format(adv_msg=str(err)),
29
                file=filename)]
30
31
        new_file = json.dumps(json_content, **kwargs).splitlines(True)
32
        # Because of a bug in several python versions we have to correct
33
        # whitespace here.
34
        output = [line.rstrip(" \n")+"\n" for line in new_file]
35
        return self.process_output(output, filename, file)
36
37
    def run(self,
38
            filename,
39
            file,
40
            json_sort: bool=False,
41
            tab_width: int=SpacingHelper.DEFAULT_TAB_WIDTH):
42
        """
43
        Raises issues for any deviations from the pretty-printed JSON.
44
45
        :param json_sort: Whether or not keys should be sorted.
46
        :param tab_width: Number of spaces to indent.
47
        """
48
        return self.lint(filename,
49
                         file,
50
                         sort_keys=json_sort,
51
                         indent=tab_width)
52