-
Notifications
You must be signed in to change notification settings - Fork 171
/
configuration.py
307 lines (282 loc) · 13.5 KB
/
configuration.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
# -*- coding: utf-8 -*-
import setoptconf as soc
from prospector.__pkginfo__ import __version__
from prospector.config.datatype import OutputChoice
from prospector.formatters import FORMATTERS
from prospector.tools import DEFAULT_TOOLS, TOOLS
__all__ = (
'build_manager',
)
def build_manager():
manager = soc.ConfigurationManager('prospector')
manager.add(soc.BooleanSetting('zero_exit', default=False))
manager.add(soc.BooleanSetting('autodetect', default=True))
manager.add(soc.ListSetting('uses', soc.String, default=[]))
manager.add(soc.BooleanSetting('blending', default=True))
manager.add(soc.BooleanSetting('doc_warnings', default=None))
manager.add(soc.BooleanSetting('test_warnings', default=None))
manager.add(soc.BooleanSetting('no_style_warnings', default=None))
manager.add(soc.BooleanSetting('member_warnings', default=None))
manager.add(soc.BooleanSetting('full_pep8', default=None))
manager.add(soc.IntegerSetting('max_line_length', default=None))
manager.add(soc.BooleanSetting('messages_only', default=False))
manager.add(soc.BooleanSetting('summary_only', default=False))
manager.add(soc.ListSetting(
'output_format',
OutputChoice(sorted(FORMATTERS.keys())),
default=None,
))
manager.add(soc.BooleanSetting('absolute_paths', default=False))
manager.add(soc.ListSetting(
'tools',
soc.Choice(sorted(TOOLS.keys())),
default=None,
))
manager.add(soc.ListSetting('with_tools', soc.String, default=[]))
manager.add(soc.ListSetting('without_tools', soc.String, default=[]))
manager.add(soc.ListSetting('profiles', soc.String, default=[]))
manager.add(soc.ListSetting('profile_path', soc.String, default=[]))
manager.add(soc.ChoiceSetting(
'strictness',
['veryhigh', 'high', 'medium', 'low', 'verylow'],
default=None,
))
manager.add(soc.BooleanSetting('show_profile', default=False))
manager.add(soc.BooleanSetting('no_external_config', default=False))
manager.add(soc.StringSetting('pylint_config_file', default=None))
manager.add(soc.StringSetting('path', default=None))
manager.add(soc.ListSetting('ignore_patterns', soc.String, default=[]))
manager.add(soc.ListSetting('ignore_paths', soc.String, default=[]))
manager.add(soc.BooleanSetting('die_on_tool_error', default=False))
manager.add(soc.BooleanSetting('include_tool_stdout', default=False))
manager.add(soc.BooleanSetting('direct_tool_stdout', default=False))
return manager
def build_default_sources():
sources = [
build_command_line_source(),
soc.EnvironmentVariableSource(),
soc.ConfigFileSource((
'.prospectorrc',
'setup.cfg',
'tox.ini',
)),
soc.ConfigFileSource((
soc.ConfigDirectory('.prospectorrc'),
soc.HomeDirectory('.prospectorrc'),
))
]
return sources
def build_command_line_source(prog=None, description='Performs static analysis of Python code'):
parser_options = {}
if prog is not None:
parser_options['prog'] = prog
if description is not None:
parser_options['description'] = description
options = {
'zero_exit': {
'flags': ['-0', '--zero-exit'],
'help': 'Prospector will exit with a code of 1 (one) if any messages'
' are found. This makes automation easier; if there are any'
' problems at all, the exit code is non-zero. However this behaviour'
' is not always desirable, so if this flag is set, prospector will'
' exit with a code of 0 if it ran successfully, and non-zero if'
' it failed to run.'
},
'autodetect': {
'flags': ['-A', '--no-autodetect'],
'help': 'Turn off auto-detection of frameworks and libraries used.'
' By default, autodetection will be used. To specify'
' manually, see the --uses option.',
},
'uses': {
'flags': ['-u', '--uses'],
'help': 'A list of one or more libraries or frameworks that the'
' project uses. Possible values are: django, celery, flask. This will be'
' autodetected by default, but if autodetection doesn\'t'
' work, manually specify them using this flag.'
},
'blending': {
'flags': ['-B', '--no-blending'],
'help': 'Turn off blending of messages. Prospector will merge'
' together messages from different tools if they represent'
' the same error. Use this option to see all unmerged'
' messages.',
},
'doc_warnings': {
'flags': ['-D', '--doc-warnings'],
'help': 'Include warnings about documentation.',
},
'test_warnings': {
'flags': ['-T', '--test-warnings'],
'help': 'Also check test modules and packages.',
},
'no_style_warnings': {
'flags': ['-8', '--no-style-warnings'],
'help': 'Don\'t create any warnings about style. This disables the'
' PEP8 tool and similar checks for formatting.',
},
'member_warnings': {
'flags': ['-m', '--member-warnings'],
'help': 'Attempt to warn when code tries to access an attribute of a '
'class or member of a module which does not exist. This is disabled '
'by default as it tends to be quite inaccurate.'
},
'full_pep8': {
'flags': ['-F', '--full-pep8'],
'help': 'Enables every PEP8 warning, so that all PEP8 style'
' violations will be reported.',
},
'max_line_length': {
'flags': ['--max-line-length'],
'help': 'The maximum line length allowed. This will be set by the strictness if no'
' value is explicitly specified'
},
'messages_only': {
'flags': ['-M', '--messages-only'],
'help': 'Only output message information (don\'t output summary'
' information about the checks)',
},
'summary_only': {
'flags': ['-S', '--summary-only'],
'help': 'Only output summary information about the checks (don\'t'
'output message information)',
},
'output_format': {
'flags': ['-o', '--output-format'],
'help': 'The output format. Valid values are: %s. This will output to stdout by default, however a target file can be used instead by adding :path-to-output-file, eg, -o json:output.json' % (
', '.join(sorted(FORMATTERS.keys())),
),
},
'absolute_paths': {
'help': 'Whether to output absolute paths when referencing files '
'in messages. By default, paths will be relative to the '
'project path',
},
'tools': {
'flags': ['-t', '--tool'],
'help': 'A list of tools to run. This lets you set exactly which '
'tools to run. To add extra tools to the defaults, see '
'--with-tool. Possible values are: %s. By '
'default, the following tools will be run: %s' % (
', '.join(sorted(TOOLS.keys())),
', '.join(sorted(DEFAULT_TOOLS)),
),
},
'with_tools': {
'flags': ['-w', '--with-tool'],
'help': 'A list of tools to run in addition to the default tools. '
'To specify all tools explicitly, use the --tool argument. '
'Possible values are %s.' % (
', '.join(sorted(TOOLS.keys()))
),
},
'without_tools': {
'flags': ['-W', '--without-tool'],
'help': 'A list of tools that should not be run. Useful to turn off '
'only a single tool from the defaults. '
'To specify all tools explicitly, use the --tool argument. '
'Possible values are %s.' % (
', '.join(sorted(TOOLS.keys()))
),
},
'profiles': {
'flags': ['-P', '--profile'],
'help': 'The list of profiles to load. A profile is a certain'
' \'type\' of behaviour for prospector, and is represented'
' by a YAML configuration file. Either a full path to the YAML'
' file describing the profile must be provided, or it must be'
' on the profile path (see --profile-path)',
},
'profile_path': {
'flags': ['--profile-path'],
'help': 'Additional paths to search for profile files. By default this'
' is the path that prospector will check, and a directory '
' called ".prospector" in the path that prospector will check.',
},
'show_profile': {
'flags': ['--show-profile'],
'help': 'Include the computed profile in the summary. This will show what'
' prospector has decided the overall profile is once all profiles'
' have been combined and inherited from. This will produce a large'
' output in most cases so is only useful when trying to debug why'
' prospector is not behaving like you expect.',
},
'strictness': {
'flags': ['-s', '--strictness'],
'help': 'How strict the checker should be. This affects how'
' harshly the checker will enforce coding guidelines. The'
' default value is "medium", possible values are'
' "veryhigh", "high", "medium", "low" and "verylow".',
},
'no_external_config': {
'flags': ['-E', '--no-external-config'],
'help': 'Determines how prospector should behave when'
' configuration already exists for a tool. By default,'
' prospector will use existing configuration. This flag'
' will cause prospector to ignore existing configuration'
' and use its own settings for every tool. Note that'
' prospector will always use its own config for tools which'
' do not have custom configuration.',
},
'pylint_config_file': {
'flags': ['--pylint-config-file'],
'help': 'The path to a pylintrc file to use to configure pylint. Prospector will find'
' .pylintrc files in the root of the project, but you can use this option to '
'specify manually where it is.'
},
'ignore_patterns': {
'flags': ['-I', '--ignore-patterns'],
'help': 'A list of paths to ignore, as a list of regular'
' expressions. Files and folders will be ignored if their'
' full path contains any of these patterns.',
},
'ignore_paths': {
'flags': ['-i', '--ignore-paths'],
'help': 'A list of file or directory names to ignore. If the'
' complete name matches any of the items in this list, the'
' file or directory (and all subdirectories) will be'
' ignored.',
},
'die_on_tool_error': {
'flags': ['-X', '--die-on-tool-error'],
'help': 'If a tool fails to run, prospector will try to carry on.'
' Use this flag to cause prospector to die and raise the'
' exception the tool generated. Mostly useful for'
' development on prospector.',
},
'include-tool-stdout': {
'flags': ['--include-tool-stdout'],
'help': 'There are various places where tools will output warnings to '
'stdout/stderr, which breaks parsing of JSON output. Therefore while tols '
'is running, this is suppressed. For developing, it is sometimes useful to '
'see this. This flag will cause stdout/stderr from a tool to be shown as '
'a normal message amongst other warnings. See also --direct-tool-stdout'
},
'direct-tool-stdout': {
'flags': ['--direct-tool-stdout'],
'help': 'Same as --include-tool-stdout, except the output will be printed '
'directly rather than shown as a message.'
},
'path': {
'flags': ['-p', '--path'],
'help': 'The path to a Python project to inspect. Defaults to PWD'
' if not specified. Note: This command line argument is'
' deprecated and will be removed in a future update. Please'
' use the positional PATH argument instead.'
}
}
positional = (
('checkpath', {
'help': 'The path to a Python project to inspect. Defaults to PWD'
' if not specified. If multiple paths are specified,'
' they must all be files (no directories).',
'metavar': 'PATH',
'nargs': '*',
}),
)
return soc.CommandLineSource(
options=options,
version=__version__,
parser_options=parser_options,
positional=positional,
)