Skip to content

Commit

Permalink
update exception usage
Browse files Browse the repository at this point in the history
Updating a series of implementation around the handling and raising of
exceptions. Specifically, these changes aim to:

- Avoid using raw strings to avoid excessive traceback content (EM101).
- Use exception chaining when possible.
- Remove unneeded parenthesis for no-argument raises.

Signed-off-by: James Knight <james.d.knight@live.com>
  • Loading branch information
jdknight committed Mar 2, 2024
1 parent 89938f2 commit 298caa6
Show file tree
Hide file tree
Showing 9 changed files with 151 additions and 147 deletions.
3 changes: 2 additions & 1 deletion sphinxcontrib/confluencebuilder/builder.py
Original file line number Diff line number Diff line change
Expand Up @@ -1014,7 +1014,8 @@ def _header_footer_init(self, docname, doctree):
else:
# unsupported source type should not pass here after this
# extension's configuration check
raise AssertionError('unsupported source type')
msg = 'unsupported source type'
raise AssertionError(msg)

sourcelink['url'] = url_base + url

Expand Down
6 changes: 4 additions & 2 deletions sphinxcontrib/confluencebuilder/config/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,8 @@ def process_ask_configs(config):

target_user = input(f' User{u_str}: ') or default_user
if not target_user:
raise ConfluenceConfigError('no user provided')
msg = 'no user provided'
raise ConfluenceConfigError(msg)

config.confluence_server_user = target_user

Expand All @@ -71,4 +72,5 @@ def process_ask_configs(config):
sys.stdout.flush()
config.confluence_server_pass = util.getpass2('')
if not config.confluence_server_pass:
raise ConfluenceConfigError('no password provided')
msg = 'no password provided'
raise ConfluenceConfigError(msg)
90 changes: 45 additions & 45 deletions sphinxcontrib/confluencebuilder/config/validation.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,12 +56,12 @@ def bool(self):
if isinstance(value, str) or isinstance(value, int):
try:
str2bool(value)
except ValueError:
raise ConfluenceConfigError(
'%s is not a boolean string' % self.key)
except ValueError as ex:
msg = f'{self.key} is not a boolean string'
raise ConfluenceConfigError(msg) from ex
elif not isinstance(value, bool) and not isinstance(value, int):
raise ConfluenceConfigError(
'%s is not a boolean type' % self.key)
msg = f'{self.key} is not a boolean type'
raise ConfluenceConfigError(msg)

return self

Expand All @@ -83,8 +83,8 @@ def callable_(self):
value = self._value()

if value is not None and not callable(value):
raise ConfluenceConfigError(
'%s is not a callable' % self.key)
msg = f'{self.key} is not a callable'
raise ConfluenceConfigError(msg)

return self

Expand Down Expand Up @@ -130,8 +130,8 @@ def dict_str_str(self):
if value is not None:
if not isinstance(value, dict) or not all(isinstance(k, str)
and isinstance(v, str) for k, v in value.items()):
raise ConfluenceConfigError(
'%s is not a dictionary of strings' % self.key)
msg = f'{self.key} is not a dictionary of strings'
raise ConfluenceConfigError(msg)

return self

Expand All @@ -155,15 +155,15 @@ def docnames(self):
if value is not None:
if not (isinstance(value, (list, set, tuple))) or not all(
isinstance(label, (str, os.PathLike)) for label in value):
raise ConfluenceConfigError(
'%s is not a collection of filenames' % self.key)
msg = f'{self.key} is not a collection of filenames'
raise ConfluenceConfigError(msg)

for docname in value:
if not any(
Path(self.env.srcdir, docname + suffix).is_file()
for suffix in self.config.source_suffix):
raise ConfluenceConfigError(
f'{self.key} is missing document {docname}')
msg = f'{self.key} is missing document {docname}'
raise ConfluenceConfigError(msg)

return self

Expand Down Expand Up @@ -193,8 +193,8 @@ def docnames_from_file(self):
if not any(
Path(self.env.srcdir, docname + suffix).is_file()
for suffix in self.config.source_suffix):
raise ConfluenceConfigError(
f'{self.key} is missing document {docname}')
msg = f'{self.key} is missing document {docname}'
raise ConfluenceConfigError(msg)

return self

Expand All @@ -220,8 +220,8 @@ def enum(self, etype):
try:
value = etype[value.lower()]
except (AttributeError, KeyError):
raise ConfluenceConfigError(
f'{self.key} is not an enumeration ({etype.__name__})')
msg = f'{self.key} is not an enumeration ({etype.__name__})'
raise ConfluenceConfigError(msg)

return self

Expand All @@ -245,8 +245,8 @@ def file(self):
if value is not None:
if not isinstance(value, (str, os.PathLike)) or \
not Path(self.env.srcdir, value).is_file():
raise ConfluenceConfigError(
'%s is not a file' % self.key)
msg = f'{self.key} is not a file'
raise ConfluenceConfigError(msg)

return self

Expand Down Expand Up @@ -276,18 +276,18 @@ def float_(self, positive=False):
try:
value = float(value)
except ValueError:
raise ConfluenceConfigError(
'%s is not a float string' % self.key)
msg = f'{self.key} is not a float string'
raise ConfluenceConfigError(msg)
elif isinstance(value, int):
value = float(value)

if positive:
if not isinstance(value, float) or value <= 0:
raise ConfluenceConfigError(
'%s is not a positive float' % self.key)
msg = f'{self.key} is not a positive float'
raise ConfluenceConfigError()
elif not isinstance(value, float) or value < 0:
raise ConfluenceConfigError(
'%s is not a non-negative float' % self.key)
msg = f'{self.key} is not a non-negative float'
raise ConfluenceConfigError(msg)

return self

Expand Down Expand Up @@ -317,16 +317,16 @@ def int_(self, positive=False):
try:
value = int(value)
except ValueError:
raise ConfluenceConfigError(
'%s is not an integer string' % self.key)
msg = f'{self.key} is not an integer string'
raise ConfluenceConfigError(msg)

if positive:
if not isinstance(value, int) or value <= 0:
raise ConfluenceConfigError(
'%s is not a positive integer' % self.key)
msg = f'{self.key} is not a positive integer'
raise ConfluenceConfigError(msg)
elif not isinstance(value, int) or value < 0:
raise ConfluenceConfigError(
'%s is not a non-negative integer' % self.key)
msg = f'{self.key} is not a non-negative integer'
raise ConfluenceConfigError(msg)

return self

Expand All @@ -351,8 +351,8 @@ def matching(self, *expected):
value = self._value()

if value is not None and value not in expected:
raise ConfluenceConfigError(
'%s does not match expected values' % self.key)
msg = f'{self.key} does not match expected values'
raise ConfluenceConfigError(msg)

return self

Expand All @@ -376,8 +376,8 @@ def path(self):
if value is not None:
if not isinstance(value, (str, os.PathLike)) or \
not Path(self.env.srcdir, value).exists():
raise ConfluenceConfigError(
'%s is not a path' % self.key)
msg = f'{self.key} is not a path'
raise ConfluenceConfigError(msg)

return self

Expand All @@ -400,8 +400,8 @@ def string(self):
value = self._value()

if value is not None and not isinstance(value, str):
raise ConfluenceConfigError(
'%s is not a string' % self.key)
msg = f'{self.key} is not a string'
raise ConfluenceConfigError(msg)

return self

Expand All @@ -425,11 +425,11 @@ def string_or_strings(self):
if value is not None:
if isinstance(value, (list, set, tuple)):
if not all(isinstance(entry, str) for entry in value):
raise ConfluenceConfigError(
'%s is not a collection of strings' % self.key)
msg = f'{self.key} is not a collection of strings'
raise ConfluenceConfigError(msg)
elif not isinstance(value, str):
raise ConfluenceConfigError(
'%s is not a string or collection of strings' % self.key)
msg = f'{self.key} is not a string or collection of strings'
raise ConfluenceConfigError(msg)

return self

Expand Down Expand Up @@ -457,14 +457,14 @@ def strings(self, no_space=False):
if value is not None:
if not (isinstance(value, (list, set, tuple)) and all(
isinstance(entry, str) for entry in value)):
raise ConfluenceConfigError(
'%s is not a collection of strings' % self.key)
msg = f'{self.key} is not a collection of strings'
raise ConfluenceConfigError(msg)

if no_space:
for entry in value:
if ' ' in entry:
raise ConfluenceConfigError(
'%s has an entry containing a space' % self.key)
msg = f'{self.key} has an entry containing a space'
raise ConfluenceConfigError(msg)

return self

Expand Down
37 changes: 22 additions & 15 deletions sphinxcontrib/confluencebuilder/directives.py
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ def run(self):
return [node]

def _build_card_node(self):
raise NotImplementedError()
raise NotImplementedError


class ConfluenceDocDirective(ConfluenceCardDirective):
Expand Down Expand Up @@ -260,41 +260,48 @@ def run(self):
# if explicit server is provided, ensure both options are set
if 'server' in params or 'serverId' in params:
if 'server' not in params:
raise self.error(':server-name: required when server-id is '
'set; but none supplied')
msg = ':server-name: required when server-id is ' \
'set; but none supplied'
raise self.error(msg)
if 'serverId' not in params:
raise self.error(':server-id: required when server-name is '
'set; but none supplied')
msg = ':server-id: required when server-name is ' \
'set; but none supplied'
raise self.error(msg)
# if a server key is provided, fetch values from configuration
elif target_server:
config = self.state.document.settings.env.config
if not config.confluence_jira_servers:
raise self.error(':server: is set but no '
'confluence_jira_servers defined in config')
msg = ':server: is set but no ' \
'confluence_jira_servers defined in config'
raise self.error(msg)
jira_servers = config['confluence_jira_servers']
if target_server not in jira_servers:
raise self.error(':server: is set but does not exist in '
'confluence_jira_servers config')
msg = ':server: is set but does not exist in ' \
'confluence_jira_servers config'
raise self.error(msg)
jira_server_config = jira_servers[target_server]
if 'name' not in jira_server_config:
raise self.error(':server: is set but missing name entry in '
'confluence_jira_servers config')
msg = ':server: is set but missing name entry in ' \
'confluence_jira_servers config'
raise self.error(msg)
params['server'] = jira_server_config['name']
if 'id' not in jira_server_config:
raise self.error(':server: is set but missing id entry in '
'confluence_jira_servers config')
msg = ':server: is set but missing id entry in ' \
'confluence_jira_servers config'
raise self.error(msg)
params['serverId'] = jira_server_config['id']

if 'serverId' in params:
try:
UUID(params['serverId'], version=4)
except ValueError:
raise self.error('server-id is not a valid uuid')
msg = 'server-id is not a valid uuid'
raise self.error(msg)

return [node]

def _build_jira_node(self):
raise NotImplementedError()
raise NotImplementedError


class JiraDirective(JiraBaseDirective):
Expand Down
Loading

0 comments on commit 298caa6

Please sign in to comment.