Browse Source

Merge pull request #928 from octodns/misc-bits

Misc bits: errant string joins from formatting formatted code and best practices in bootstrap
pull/36/head
Ross McFarland 3 years ago
committed by GitHub
parent
commit
c11476d79a
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
16 changed files with 65 additions and 59 deletions
  1. +2
    -0
      .git-blame-ignore-revs
  2. +2
    -2
      octodns/cmds/dump.py
  3. +1
    -1
      octodns/cmds/sync.py
  4. +10
    -10
      octodns/manager.py
  5. +2
    -5
      octodns/provider/base.py
  6. +1
    -1
      octodns/provider/plan.py
  7. +3
    -3
      octodns/record/__init__.py
  8. +1
    -1
      octodns/record/geo_data.py
  9. +4
    -4
      octodns/source/base.py
  10. +1
    -1
      octodns/source/envvar.py
  11. +1
    -1
      octodns/source/tinydns.py
  12. +5
    -5
      octodns/zone.py
  13. +11
    -2
      script/bootstrap
  14. +1
    -1
      tests/test_octodns_manager.py
  15. +2
    -2
      tests/test_octodns_provider_yaml.py
  16. +18
    -20
      tests/test_octodns_record.py

+ 2
- 0
.git-blame-ignore-revs View File

@ -1,2 +1,4 @@
# Commit that added in black formatting support # Commit that added in black formatting support
e116d26eeca0891c31b689e43db5bb60b62f73f6 e116d26eeca0891c31b689e43db5bb60b62f73f6
# Commit that fixed a bunch of uneeded '...' '...' string joins from ^
fa4225b625654c51c7b0be6efcfd6a1109768a72

+ 2
- 2
octodns/cmds/dump.py View File

@ -38,13 +38,13 @@ def main():
'--lenient', '--lenient',
action='store_true', action='store_true',
default=False, default=False,
help='Ignore record validations and do a best effort ' 'dump',
help='Ignore record validations and do a best effort dump',
) )
parser.add_argument( parser.add_argument(
'--split', '--split',
action='store_true', action='store_true',
default=False, default=False,
help='Split the dumped zone into a YAML file per ' 'record',
help='Split the dumped zone into a YAML file per record',
) )
parser.add_argument('zone', help='Zone to dump') parser.add_argument('zone', help='Zone to dump')
parser.add_argument('source', nargs='+', help='Source(s) to pull data from') parser.add_argument('source', nargs='+', help='Source(s) to pull data from')


+ 1
- 1
octodns/cmds/sync.py View File

@ -26,7 +26,7 @@ def main():
'--doit', '--doit',
action='store_true', action='store_true',
default=False, default=False,
help='Whether to take action or just show what would ' 'change',
help='Whether to take action or just show what would change',
) )
parser.add_argument( parser.add_argument(
'--force', '--force',


+ 10
- 10
octodns/manager.py View File

@ -141,7 +141,7 @@ class Manager(object):
except KeyError: except KeyError:
self.log.exception('Invalid provider class') self.log.exception('Invalid provider class')
raise ManagerException( raise ManagerException(
f'Provider {provider_name} is missing ' 'class'
f'Provider {provider_name} is missing class'
) )
_class, module, version = self._get_named_class('provider', _class) _class, module, version = self._get_named_class('provider', _class)
kwargs = self._build_kwargs(provider_config) kwargs = self._build_kwargs(provider_config)
@ -168,7 +168,7 @@ class Manager(object):
except KeyError: except KeyError:
self.log.exception('Invalid processor class') self.log.exception('Invalid processor class')
raise ManagerException( raise ManagerException(
f'Processor {processor_name} is ' 'missing class'
f'Processor {processor_name} is missing class'
) )
_class, module, version = self._get_named_class('processor', _class) _class, module, version = self._get_named_class('processor', _class)
kwargs = self._build_kwargs(processor_config) kwargs = self._build_kwargs(processor_config)
@ -204,7 +204,7 @@ class Manager(object):
except KeyError: except KeyError:
self.log.exception('Invalid plan_output class') self.log.exception('Invalid plan_output class')
raise ManagerException( raise ManagerException(
f'plan_output {plan_output_name} is ' 'missing class'
f'plan_output {plan_output_name} is missing class'
) )
_class, module, version = self._get_named_class( _class, module, version = self._get_named_class(
'plan_output', _class 'plan_output', _class
@ -264,7 +264,7 @@ class Manager(object):
module, version = self._import_module(module_name) module, version = self._import_module(module_name)
except (ImportError, ValueError): except (ImportError, ValueError):
self.log.exception( self.log.exception(
'_get_{}_class: Unable to import ' 'module %s', _class
'_get_{}_class: Unable to import module %s', _class
) )
raise ManagerException(f'Unknown {_type} class: {_class}') raise ManagerException(f'Unknown {_type} class: {_class}')
@ -272,7 +272,7 @@ class Manager(object):
return getattr(module, class_name), module_name, version return getattr(module, class_name), module_name, version
except AttributeError: except AttributeError:
self.log.exception( self.log.exception(
'_get_{}_class: Unable to get class %s ' 'from module %s',
'_get_{}_class: Unable to get class %s from module %s',
class_name, class_name,
module, module,
) )
@ -360,7 +360,7 @@ class Manager(object):
if "unexpected keyword argument 'lenient'" not in str(e): if "unexpected keyword argument 'lenient'" not in str(e):
raise raise
self.log.warning( self.log.warning(
'provider %s does not accept lenient ' 'param',
'provider %s does not accept lenient param',
source.__class__.__name__, source.__class__.__name__,
) )
source.populate(zone) source.populate(zone)
@ -389,7 +389,7 @@ class Manager(object):
if "keyword argument 'processors'" not in str(e): if "keyword argument 'processors'" not in str(e):
raise raise
self.log.warning( self.log.warning(
'provider.plan %s does not accept processors ' 'param',
'provider.plan %s does not accept processors param',
target.__class__.__name__, target.__class__.__name__,
) )
plan = target.plan(zone) plan = target.plan(zone)
@ -522,7 +522,7 @@ class Manager(object):
trg = self.providers[target] trg = self.providers[target]
if not isinstance(trg, BaseProvider): if not isinstance(trg, BaseProvider):
raise ManagerException( raise ManagerException(
f'{trg} - "{target}" does not ' 'support targeting'
f'{trg} - "{target}" does not support targeting'
) )
trgs.append(trg) trgs.append(trg)
targets = trgs targets = trgs
@ -696,7 +696,7 @@ class Manager(object):
raise ManagerException(msg) raise ManagerException(msg)
target = target.copy() target = target.copy()
self.log.info( self.log.info(
'dump: setting directory of output_provider ' 'copy to %s',
'dump: setting directory of output_provider copy to %s',
output_dir, output_dir,
) )
target.directory = output_dir target.directory = output_dir
@ -781,7 +781,7 @@ class Manager(object):
def get_zone(self, zone_name): def get_zone(self, zone_name):
if not zone_name[-1] == '.': if not zone_name[-1] == '.':
raise ManagerException( raise ManagerException(
f'Invalid zone name {zone_name}, missing ' 'ending dot'
f'Invalid zone name {zone_name}, missing ending dot'
) )
for name, config in self.config['zones'].items(): for name, config in self.config['zones'].items():


+ 2
- 5
octodns/provider/base.py View File

@ -187,8 +187,7 @@ class BaseProvider(BaseSource):
# If your code gets this warning see Source.populate for more # If your code gets this warning see Source.populate for more
# information # information
self.log.warning( self.log.warning(
'Provider %s used in target mode did not return ' 'exists',
self.id,
'Provider %s used in target mode did not return exists', self.id
) )
# Make a (shallow) copy of the desired state so that everything from # Make a (shallow) copy of the desired state so that everything from
@ -254,6 +253,4 @@ class BaseProvider(BaseSource):
return len(plan.changes) return len(plan.changes)
def _apply(self, plan): def _apply(self, plan):
raise NotImplementedError(
'Abstract base class, _apply method ' 'missing'
)
raise NotImplementedError('Abstract base class, _apply method missing')

+ 1
- 1
octodns/provider/plan.py View File

@ -73,7 +73,7 @@ class Plan(object):
existing_n = 0 existing_n = 0
self.log.debug( self.log.debug(
'__init__: Creates=%d, Updates=%d, Deletes=%d ' 'Existing=%d',
'__init__: Creates=%d, Updates=%d, Deletes=%d Existing=%d',
self.change_counts['Create'], self.change_counts['Create'],
self.change_counts['Update'], self.change_counts['Update'],
self.change_counts['Delete'], self.change_counts['Delete'],


+ 3
- 3
octodns/record/__init__.py View File

@ -624,7 +624,7 @@ class _DynamicMixin(object):
if len(values) == 1 and values[0].get('weight', 1) != 1: if len(values) == 1 and values[0].get('weight', 1) != 1:
reasons.append( reasons.append(
f'pool "{_id}" has single value with ' 'weight!=1'
f'pool "{_id}" has single value with weight!=1'
) )
fallback = pool.get('fallback', None) fallback = pool.get('fallback', None)
@ -1307,7 +1307,7 @@ class _NsValue(object):
for value in data: for value in data:
if not FQDN(str(value), allow_underscores=True).is_valid: if not FQDN(str(value), allow_underscores=True).is_valid:
reasons.append( reasons.append(
f'Invalid NS value "{value}" is not ' 'a valid FQDN.'
f'Invalid NS value "{value}" is not a valid FQDN.'
) )
elif not value.endswith('.'): elif not value.endswith('.'):
reasons.append(f'NS value "{value}" missing trailing .') reasons.append(f'NS value "{value}" missing trailing .')
@ -1519,7 +1519,7 @@ class SrvValue(EqualityTupleMixin):
and not FQDN(str(target), allow_underscores=True).is_valid and not FQDN(str(target), allow_underscores=True).is_valid
): ):
reasons.append( reasons.append(
f'Invalid SRV target "{target}" is not ' 'a valid FQDN.'
f'Invalid SRV target "{target}" is not a valid FQDN.'
) )
except KeyError: except KeyError:
reasons.append('missing target') reasons.append('missing target')


+ 1
- 1
octodns/record/geo_data.py View File

@ -288,7 +288,7 @@ geo_data = {
'SD': {'name': 'South Dakota'}, 'SD': {'name': 'South Dakota'},
'TN': {'name': 'Tennessee'}, 'TN': {'name': 'Tennessee'},
'TX': {'name': 'Texas'}, 'TX': {'name': 'Texas'},
'UM': {'name': 'United States Minor Outlying ' 'Islands'},
'UM': {'name': 'United States Minor Outlying Islands'},
'UT': {'name': 'Utah'}, 'UT': {'name': 'Utah'},
'VA': {'name': 'Virginia'}, 'VA': {'name': 'Virginia'},
'VI': {'name': 'Virgin Islands'}, 'VI': {'name': 'Virgin Islands'},


+ 4
- 4
octodns/source/base.py View File

@ -20,15 +20,15 @@ class BaseSource(object):
self.id = id self.id = id
if not getattr(self, 'log', False): if not getattr(self, 'log', False):
raise NotImplementedError( raise NotImplementedError(
'Abstract base class, log property ' 'missing'
'Abstract base class, log property missing'
) )
if not hasattr(self, 'SUPPORTS_GEO'): if not hasattr(self, 'SUPPORTS_GEO'):
raise NotImplementedError( raise NotImplementedError(
'Abstract base class, SUPPORTS_GEO ' 'property missing'
'Abstract base class, SUPPORTS_GEO property missing'
) )
if not hasattr(self, 'SUPPORTS'): if not hasattr(self, 'SUPPORTS'):
raise NotImplementedError( raise NotImplementedError(
'Abstract base class, SUPPORTS ' 'property missing'
'Abstract base class, SUPPORTS property missing'
) )
@property @property
@ -51,7 +51,7 @@ class BaseSource(object):
True if the zone exists or False if it does not. True if the zone exists or False if it does not.
''' '''
raise NotImplementedError( raise NotImplementedError(
'Abstract base class, populate method ' 'missing'
'Abstract base class, populate method missing'
) )
def supports(self, record): def supports(self, record):


+ 1
- 1
octodns/source/envvar.py View File

@ -67,7 +67,7 @@ class EnvVarSource(BaseSource):
klass = self.__class__.__name__ klass = self.__class__.__name__
self.log = logging.getLogger(f'{klass}[{id}]') self.log = logging.getLogger(f'{klass}[{id}]')
self.log.debug( self.log.debug(
'__init__: id=%s, variable=%s, name=%s, ' 'ttl=%d',
'__init__: id=%s, variable=%s, name=%s, ttl=%d',
id, id,
variable, variable,
name, name,


+ 1
- 1
octodns/source/tinydns.py View File

@ -174,7 +174,7 @@ class TinyDnsBaseSource(BaseSource):
zone.add_record(record, lenient=lenient) zone.add_record(record, lenient=lenient)
except SubzoneRecordException: except SubzoneRecordException:
self.log.debug( self.log.debug(
'_populate_normal: skipping subzone ' 'record=%s',
'_populate_normal: skipping subzone record=%s',
record, record,
) )


+ 5
- 5
octodns/zone.py View File

@ -146,7 +146,7 @@ class Zone(object):
continue continue
elif len(record.included) > 0 and target.id not in record.included: elif len(record.included) > 0 and target.id not in record.included:
self.log.debug( self.log.debug(
'changes: skipping record=%s %s - %s not' ' included ',
'changes: skipping record=%s %s - %s not included ',
record.fqdn, record.fqdn,
record._type, record._type,
target.id, target.id,
@ -154,7 +154,7 @@ class Zone(object):
continue continue
elif target.id in record.excluded: elif target.id in record.excluded:
self.log.debug( self.log.debug(
'changes: skipping record=%s %s - %s ' 'excluded ',
'changes: skipping record=%s %s - %s excluded ',
record.fqdn, record.fqdn,
record._type, record._type,
target.id, target.id,
@ -169,7 +169,7 @@ class Zone(object):
and target.id not in desired_record.included and target.id not in desired_record.included
): ):
self.log.debug( self.log.debug(
'changes: skipping record=%s %s - %s' 'not included ',
'changes: skipping record=%s %s - %s not included',
record.fqdn, record.fqdn,
record._type, record._type,
target.id, target.id,
@ -216,7 +216,7 @@ class Zone(object):
continue continue
elif len(record.included) > 0 and target.id not in record.included: elif len(record.included) > 0 and target.id not in record.included:
self.log.debug( self.log.debug(
'changes: skipping record=%s %s - %s not' ' included ',
'changes: skipping record=%s %s - %s not included ',
record.fqdn, record.fqdn,
record._type, record._type,
target.id, target.id,
@ -224,7 +224,7 @@ class Zone(object):
continue continue
elif target.id in record.excluded: elif target.id in record.excluded:
self.log.debug( self.log.debug(
'changes: skipping record=%s %s - %s ' 'excluded ',
'changes: skipping record=%s %s - %s excluded ',
record.fqdn, record.fqdn,
record._type, record._type,
target.id, target.id,


+ 11
- 2
script/bootstrap View File

@ -29,8 +29,17 @@ if [ "$ENV" != "production" ]; then
python -m pip install -r requirements-dev.txt python -m pip install -r requirements-dev.txt
fi fi
if [ ! -L ".git/hooks/pre-commit" ]; then
ln -s "$ROOT/.git_hooks_pre-commit" ".git/hooks/pre-commit"
if [ -d ".git" ]; then
if [ -f ".git-blame-ignore-revs" ]; then
echo ""
echo "Setting blame.ignoreRevsFile to .git-blame-ingore-revs"
git config --local blame.ignoreRevsFile .git-blame-ignore-revs
fi
if [ ! -L ".git/hooks/pre-commit" ]; then
echo ""
echo "Installing pre-commit hook"
ln -s "$ROOT/.git_hooks_pre-commit" ".git/hooks/pre-commit"
fi
fi fi
echo "" echo ""


+ 1
- 1
tests/test_octodns_manager.py View File

@ -441,7 +441,7 @@ class TestManager(TestCase):
sources=['in'], sources=['in'],
) )
self.assertEqual( self.assertEqual(
'output_provider=simple, does not support ' 'copy method',
'output_provider=simple, does not support copy method',
str(ctx.exception), str(ctx.exception),
) )


+ 2
- 2
tests/test_octodns_provider_yaml.py View File

@ -213,7 +213,7 @@ class TestYamlProvider(TestCase):
with self.assertRaises(SubzoneRecordException) as ctx: with self.assertRaises(SubzoneRecordException) as ctx:
source.populate(zone) source.populate(zone)
self.assertEqual( self.assertEqual(
'Record www.sub.unit.tests. is under a managed ' 'subzone',
'Record www.sub.unit.tests. is under a managed subzone',
str(ctx.exception), str(ctx.exception),
) )
@ -470,7 +470,7 @@ class TestSplitYamlProvider(TestCase):
with self.assertRaises(SubzoneRecordException) as ctx: with self.assertRaises(SubzoneRecordException) as ctx:
source.populate(zone) source.populate(zone)
self.assertEqual( self.assertEqual(
'Record www.sub.unit.tests. is under a managed ' 'subzone',
'Record www.sub.unit.tests. is under a managed subzone',
str(ctx.exception), str(ctx.exception),
) )


+ 18
- 20
tests/test_octodns_record.py View File

@ -61,7 +61,7 @@ class TestRecord(TestCase):
with self.assertRaises(RecordException) as ctx: with self.assertRaises(RecordException) as ctx:
Record.register_type(None, 'A') Record.register_type(None, 'A')
self.assertEqual( self.assertEqual(
'Type "A" already registered by ' 'octodns.record.ARecord',
'Type "A" already registered by octodns.record.ARecord',
str(ctx.exception), str(ctx.exception),
) )
@ -1859,7 +1859,7 @@ class TestRecordValidation(TestCase):
self.assertTrue(reason.startswith('invalid fqdn, "xxxx')) self.assertTrue(reason.startswith('invalid fqdn, "xxxx'))
self.assertTrue( self.assertTrue(
reason.endswith( reason.endswith(
'.unit.tests." is too long at 254' ' chars, max is 253'
'.unit.tests." is too long at 254 chars, max is 253'
) )
) )
@ -1873,7 +1873,7 @@ class TestRecordValidation(TestCase):
reason = ctx.exception.reasons[0] reason = ctx.exception.reasons[0]
self.assertTrue(reason.startswith('invalid label, "xxxx')) self.assertTrue(reason.startswith('invalid label, "xxxx'))
self.assertTrue( self.assertTrue(
reason.endswith('xxx" is too long at 64' ' chars, max is 63')
reason.endswith('xxx" is too long at 64 chars, max is 63')
) )
with self.assertRaises(ValidationError) as ctx: with self.assertRaises(ValidationError) as ctx:
@ -1884,7 +1884,7 @@ class TestRecordValidation(TestCase):
reason = ctx.exception.reasons[0] reason = ctx.exception.reasons[0]
self.assertTrue(reason.startswith('invalid label, "xxxx')) self.assertTrue(reason.startswith('invalid label, "xxxx'))
self.assertTrue( self.assertTrue(
reason.endswith('xxx" is too long at 64' ' chars, max is 63')
reason.endswith('xxx" is too long at 64 chars, max is 63')
) )
# should not raise with dots # should not raise with dots
@ -2472,7 +2472,7 @@ class TestRecordValidation(TestCase):
{'type': 'CNAME', 'ttl': 600, 'value': 'https://google.com'}, {'type': 'CNAME', 'ttl': 600, 'value': 'https://google.com'},
) )
self.assertEqual( self.assertEqual(
['CNAME value "https://google.com" is not a valid ' 'FQDN'],
['CNAME value "https://google.com" is not a valid FQDN'],
ctx.exception.reasons, ctx.exception.reasons,
) )
@ -2488,7 +2488,7 @@ class TestRecordValidation(TestCase):
}, },
) )
self.assertEqual( self.assertEqual(
['CNAME value "https://google.com/a/b/c" is not a ' 'valid FQDN'],
['CNAME value "https://google.com/a/b/c" is not a valid FQDN'],
ctx.exception.reasons, ctx.exception.reasons,
) )
@ -2500,7 +2500,7 @@ class TestRecordValidation(TestCase):
{'type': 'CNAME', 'ttl': 600, 'value': 'google.com/some/path'}, {'type': 'CNAME', 'ttl': 600, 'value': 'google.com/some/path'},
) )
self.assertEqual( self.assertEqual(
['CNAME value "google.com/some/path" is not a valid ' 'FQDN'],
['CNAME value "google.com/some/path" is not a valid FQDN'],
ctx.exception.reasons, ctx.exception.reasons,
) )
@ -2971,7 +2971,7 @@ class TestRecordValidation(TestCase):
}, },
) )
self.assertEqual( self.assertEqual(
['Invalid MX exchange "100 foo.bar.com." is not a ' 'valid FQDN.'],
['Invalid MX exchange "100 foo.bar.com." is not a valid FQDN.'],
ctx.exception.reasons, ctx.exception.reasons,
) )
@ -3082,7 +3082,7 @@ class TestRecordValidation(TestCase):
{'type': 'NS', 'ttl': 600, 'value': '100 foo.bar.com.'}, {'type': 'NS', 'ttl': 600, 'value': '100 foo.bar.com.'},
) )
self.assertEqual( self.assertEqual(
['Invalid NS value "100 foo.bar.com." is not a ' 'valid FQDN.'],
['Invalid NS value "100 foo.bar.com." is not a valid FQDN.'],
ctx.exception.reasons, ctx.exception.reasons,
) )
@ -3283,7 +3283,7 @@ class TestRecordValidation(TestCase):
}, },
) )
self.assertEqual( self.assertEqual(
['unescaped ; in "this has some; ' 'semi-colons\\; in it"'],
['unescaped ; in "this has some; semi-colons\\; in it"'],
ctx.exception.reasons, ctx.exception.reasons,
) )
@ -3487,7 +3487,7 @@ class TestRecordValidation(TestCase):
}, },
) )
self.assertEqual( self.assertEqual(
['Invalid SRV target "100 foo.bar.com." is not a ' 'valid FQDN.'],
['Invalid SRV target "100 foo.bar.com." is not a valid FQDN.'],
ctx.exception.reasons, ctx.exception.reasons,
) )
@ -3589,7 +3589,7 @@ class TestRecordValidation(TestCase):
}, },
) )
self.assertEqual( self.assertEqual(
'invalid certificate_usage ' '"{value["certificate_usage"]}"',
'invalid certificate_usage "{value["certificate_usage"]}"',
ctx.exception.reasons, ctx.exception.reasons,
) )
@ -3610,7 +3610,7 @@ class TestRecordValidation(TestCase):
}, },
) )
self.assertEqual( self.assertEqual(
'invalid certificate_usage ' '"{value["certificate_usage"]}"',
'invalid certificate_usage "{value["certificate_usage"]}"',
ctx.exception.reasons, ctx.exception.reasons,
) )
@ -3648,8 +3648,7 @@ class TestRecordValidation(TestCase):
}, },
) )
self.assertEqual( self.assertEqual(
'invalid selector ' '"{value["selector"]}"',
ctx.exception.reasons,
'invalid selector "{value["selector"]}"', ctx.exception.reasons
) )
# Invalid selector # Invalid selector
@ -3669,8 +3668,7 @@ class TestRecordValidation(TestCase):
}, },
) )
self.assertEqual( self.assertEqual(
'invalid selector ' '"{value["selector"]}"',
ctx.exception.reasons,
'invalid selector "{value["selector"]}"', ctx.exception.reasons
) )
# missing matching_type # missing matching_type
@ -3707,7 +3705,7 @@ class TestRecordValidation(TestCase):
}, },
) )
self.assertEqual( self.assertEqual(
'invalid matching_type ' '"{value["matching_type"]}"',
'invalid matching_type "{value["matching_type"]}"',
ctx.exception.reasons, ctx.exception.reasons,
) )
@ -3728,7 +3726,7 @@ class TestRecordValidation(TestCase):
}, },
) )
self.assertEqual( self.assertEqual(
'invalid matching_type ' '"{value["matching_type"]}"',
'invalid matching_type "{value["matching_type"]}"',
ctx.exception.reasons, ctx.exception.reasons,
) )
@ -3765,7 +3763,7 @@ class TestRecordValidation(TestCase):
}, },
) )
self.assertEqual( self.assertEqual(
['unescaped ; in "this has some; semi-colons\\; ' 'in it"'],
['unescaped ; in "this has some; semi-colons\\; in it"'],
ctx.exception.reasons, ctx.exception.reasons,
) )


Loading…
Cancel
Save