1 # The MIT License (MIT)
3 # Copyright (c) 2015-2020 Philippe Proulx <pproulx@efficios.com>
5 # Permission is hereby granted, free of charge, to any person obtaining
6 # a copy of this software and associated documentation files (the
7 # "Software"), to deal in the Software without restriction, including
8 # without limitation the rights to use, copy, modify, merge, publish,
9 # distribute, sublicense, and/or sell copies of the Software, and to
10 # permit persons to whom the Software is furnished to do so, subject to
11 # the following conditions:
13 # The above copyright notice and this permission notice shall be
14 # included in all copies or substantial portions of the Software.
16 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17 # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18 # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
19 # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
20 # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
21 # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
22 # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24 import barectf
.config_parse_common
as barectf_config_parse_common
25 from barectf
.config_parse_common
import _ConfigurationParseError
26 from barectf
.config_parse_common
import _MapNode
27 import barectf
.config_parse_v2
as barectf_config_parse_v2
28 import barectf
.config_parse_v3
as barectf_config_parse_v3
29 import barectf
.config
as barectf_config
31 from barectf
.typing
import Count
, VersionNumber
32 from typing
import Optional
, List
, TextIO
36 # Creates and returns a barectf 3 YAML configuration file parser to
37 # parse the file-like object `file`.
39 # `file` can be a barectf 2 or 3 configuration file.
40 def _create_v3_parser(file: TextIO
, with_pkg_include_dir
: bool, include_dirs
: Optional
[List
[str]],
41 ignore_include_not_found
: bool) -> barectf_config_parse_v3
._Parser
:
43 root_node
= barectf_config_parse_common
._yaml
_load
(file)
45 if type(root_node
) is barectf_config_parse_common
._ConfigNodeV
3:
46 # barectf 3 configuration file
47 return barectf_config_parse_v3
._Parser(file,
48 typing
.cast(barectf_config_parse_common
._ConfigNodeV
3,
50 with_pkg_include_dir
, include_dirs
,
51 ignore_include_not_found
)
52 elif type(root_node
) is collections
.OrderedDict
:
53 # barectf 2 configuration file
54 v2_parser
= barectf_config_parse_v2
._Parser(file, typing
.cast(_MapNode
, root_node
),
55 with_pkg_include_dir
, include_dirs
,
56 ignore_include_not_found
)
57 return barectf_config_parse_v3
._Parser(file, v2_parser
.config_node
,
58 with_pkg_include_dir
, include_dirs
,
59 ignore_include_not_found
)
61 raise _ConfigurationParseError('Configuration',
62 f
'Root (configuration) node is not an object (it\'s a `{type(root_node)}`)')
63 except _ConfigurationParseError
as exc
:
64 barectf_config_parse_common
._append
_error
_ctx
(exc
, 'Configuration',
65 'Cannot create configuration from YAML file')
67 # satisfy static type checker (never reached)
71 def _from_file(file: TextIO
, with_pkg_include_dir
: bool, include_dirs
: Optional
[List
[str]],
72 ignore_include_not_found
: bool) -> barectf_config
.Configuration
:
73 return _create_v3_parser(file, with_pkg_include_dir
, include_dirs
, ignore_include_not_found
).config
76 def _effective_config_file(file: TextIO
, with_pkg_include_dir
: bool,
77 include_dirs
: Optional
[List
[str]], ignore_include_not_found
: bool,
78 indent_space_count
: Count
) -> str:
79 config_node
= _create_v3_parser(file, with_pkg_include_dir
, include_dirs
,
80 ignore_include_not_found
).root_node
81 return barectf_config_parse_common
._yaml
_dump
(config_node
, indent
=indent_space_count
,
82 default_flow_style
=False, explicit_start
=True,
86 def _config_file_major_version(file: TextIO
) -> VersionNumber
:
88 root_node
= barectf_config_parse_common
._yaml
_load
(file)
90 if type(root_node
) is barectf_config_parse_common
._ConfigNodeV
3:
91 # barectf 3 configuration file
92 return VersionNumber(3)
94 # barectf 2 configuration file
95 assert type(root_node
) is collections
.OrderedDict
96 return VersionNumber(2)
97 except _ConfigurationParseError
as exc
:
98 barectf_config_parse_common
._append
_error
_ctx
(exc
, 'Configuration', 'Cannot load YAML file')
100 # satisfy static type checker (never reached)