def test_mock_exists(base_registry): """Very mock is loaded with entrypoint detection""" cfg = yamlsettings.load('mock://please') assert cfg.mock == 'test' cfg = yamlsettings.load('mock2://please') assert cfg.mock == 'test'
def test_limit(self): test_settings = load('settings.yml') test_settings.limit(['config']) self.assertEqual(list(test_settings), ['config']) test_settings2 = load('settings.yml') test_settings2.limit('config') self.assertEqual(list(test_settings), list(test_settings2))
def test_rebase(self): test_settings = load('settings.yml') test_settings.rebase(load('defaults.yml')) self.assertEqual(test_settings.config.greet, 'Hello') self.assertEqual(test_settings.config.leave, 'Goodbye') self.assertEqual(test_settings.config.secret, 'I have many secrets') self.assertEqual(test_settings.config.meaning, 42) self.assertEqual(test_settings.config_excited.greet, "Whazzzzup!")
def test_no_cache(package_data): """Disable persistence""" package_data.return_value = b'val: one\n' cfg = yamlsettings.load('pkg://example?persist=false') assert cfg.val == 'one' package_data.return_value = b'val: two\n' cfg = yamlsettings.load('pkg://example?persist=false') assert cfg.val == 'two'
def test_raise_with_unexpected(resps): """Test Runtime Error when excepted status code""" url = 'http://testing.com/one' obj = {'error': True} expected = 200 status = 500 raise_on = True resps.add(responses.GET, url, json=obj, status=status) # RuntimeError stops yamlsettings from trying the next url with pytest.raises(RuntimeError): yamlsettings.load(url, expected_status_code=expected, raise_on_status=raise_on)
def test_variable_override(self): test_settings = load("single_fancy.yml") update_from_env(test_settings) self.assertEqual(test_settings.test.greeting.introduce, 'The environment says hello!') self.assertEqual(test_settings.test.dict_var_mix.b, 'Goodbye Variable')
def test_stupid_override(self): test_settings = load("stupid.yml") update_from_env(test_settings) self.assertEqual(test_settings.test.config.db, 'OurSQL') self.assertEqual(test_settings.test.config_db, 'OurSQL')
def test_load_single_file(self): test_defaults = load('defaults.yml') self.assertEqual(test_defaults.config.greet, 'Hello') self.assertEqual(test_defaults.config.leave, 'Goodbye') self.assertEqual(test_defaults.config.secret, 'I have no secrets') self.assertEqual(test_defaults.config.meaning, 42) # Verify missing raises an AttributeError and not a KeyError self.assertRaises(AttributeError, getattr, test_defaults, 'missing') # Verify access to class attributes self.assertEqual(str(test_defaults.__class__), "<class 'yamlsettings.yamldict.YAMLDict'>") # Test dir access of keys for tab complete self.assertEqual(dir(test_defaults.config), ['greet', 'leave', 'meaning', 'secret']) # Test representation of value self.assertEqual( str(test_defaults.config), 'greet: Hello\nleave: Goodbye\nsecret: I have no secrets\n' 'meaning: 42\n', ) self.assertEqual( repr(test_defaults.config), "{'greet': 'Hello', 'leave': 'Goodbye', " "'secret': 'I have no secrets', 'meaning': 42}", ) # Test foo is saved in keys test_defaults.foo = 'bar' self.assertEqual(test_defaults.foo, 'bar') self.assertEqual(test_defaults['foo'], 'bar')
def test_load_with_envs(self): test_defaults = load('defaults.yml') update_from_env(test_defaults) self.assertEqual(test_defaults.config.greet, 'Hello') self.assertEqual(test_defaults.config.leave, 'Goodbye') self.assertEqual(test_defaults.config.secret, 's3cr3tz') self.assertEqual(test_defaults.config.meaning, 42.42)
def test_user_pass_combos(resps, url, obj): """Test loading with u/p urls""" resps.add(responses.GET, url, json=obj, status=200) config = yamlsettings.load(url) assert config.test == obj['test']
def test_package_config(package_data, data_input): """Package load Note: This will fail on the second pass if PackageExtension is not fresh """ package_data.return_value = data_input cfg = yamlsettings.load('package://example') package_data.assert_called_once_with('example', 'settings.yaml') assert cfg.mocked.startswith("package") # Verify persistence is working package_data.return_value = 'should not be read' cfg = yamlsettings.load('package://example') assert cfg.mocked.startswith("package") assert package_data.call_count == 1
def test_client_params_via_url_params(s3): """Test params passed to client via url""" config = yamlsettings.load("s3://bucket/key.yaml?region_name=us-east-1") assert config.foo == 'bar' s3.assert_called_once_with('s3', region_name='us-east-1') s3.return_value.get_object.assert_called_once_with( Bucket='bucket', Key='key.yaml', )
def test_basic_request(s3): """Test Basic Request""" config = yamlsettings.load("s3://bucket/key.yaml") assert config.foo == 'bar' s3.assert_called_once_with('s3') s3.return_value.get_object.assert_called_once_with( Bucket='bucket', Key='key.yaml', )
def test_version_used(s3): """Verify version is used""" config = yamlsettings.load("s3://bucket/key.yaml", VersionId='mocked') assert config.foo == 'bar' s3.return_value.get_object.assert_called_once_with( Bucket='bucket', Key='key.yaml', VersionId='mocked', )
def test_yaml_dict_merge(self): test_settings = load("merge.yml") # Verify the merge was successful self.assertEqual(test_settings.base.config.db, "MySQL") self.assertEqual(test_settings.merged.config.db, "MySQL") # Verify whoami was properly overridden self.assertEqual(test_settings.base.whoami, "base") self.assertEqual(test_settings.merged.whoami, "merged")
def test_pass_client(s3): """Verify client not created when passed""" client = boto3.client('mocked') config = yamlsettings.load("s3://bucket/long/key.yaml", client=client) assert config.foo == 'bar' s3.assert_called_once_with('mocked') s3.return_value.get_object.assert_called_once_with( Bucket='bucket', Key='long/key.yaml', )
def test_not_found_ok(resps): """Test 404 can return data when expected""" url = 'http://missing.com/data' obj = {'hidden': 'treasure'} expected = 404 status = 404 resps.add(responses.GET, url, json=obj, status=status) config = yamlsettings.load(url, expected_status_code=expected) assert config.hidden == 'treasure'
def test_fail_first_load(resps): url_bad = 'https://bad_times.com/not_found' url_good = 'https://good_times.com/happy_page' resps.add(responses.GET, url_bad, body='Page Not Found', status=404) resps.add(responses.GET, url_good, body='{"happy": True}', status=200) config = yamlsettings.load([url_bad, url_good]) assert config.happy is True
def test_auth_required(resps): url = "https://verysecure.com/doc" resps.add(responses.GET, url, body='{"secure": true}', status=200) config = yamlsettings.load( url, auth=HTTPBasicAuth('Aladdin', 'OpenSesame'), ) auth_header = resps.calls[0].request.__dict__['headers']['Authorization'] assert auth_header == "Basic QWxhZGRpbjpPcGVuU2VzYW1l" assert config.secure is True
def test_no_raise_with_unexpected(resps): """Test Runtime Error when excepted status code""" url_1 = 'http://testing.com/one' url_2 = 'http://testing.com/two' expected = 202 raise_on = False resps.add(responses.GET, url_1, json={'error': True}, status=500) resps.add(responses.GET, url_2, json={'foo': 'bar'}, status=202) config = yamlsettings.load([url_1, url_2], expected_status_code=expected, raise_on_status=raise_on) assert config.foo == 'bar'
def run(): try: db.connect() load_error = None try: settings = yamlsettings.load('settings.yaml') if "api_key" not in settings: load_error = "Invalid settings.yaml" except OSError: load_error = "Unable to find settings.yaml" if load_error: print("Error: {}".format(load_error)) print("Example settings.yaml:\n ---\n api_key: 'telegram:key'\n") sys.exit(1) app.config['api_key'] = settings.api_key app.poll(debug=False) finally: db.close()
def test_file_writing(self): test_settings = load("single_fancy.yml") update_from_env(test_settings) m = mock_open() with mock.patch('{}.open'.format(builtin_module), m, create=True): with open('current_file.yml', 'w') as h: h.write(str(test_settings)) m.assert_called_once_with('current_file.yml', 'w') handle = m() handle.write.assert_called_with( 'test:\n' ' id1: &id001\n' ' name: hi\n' ' id2: &id002\n' ' name: hello\n' ' var_list:\n' ' - *id001\n' ' - *id002\n' ' dict_var_mix:\n' ' a: 10\n' ' b: *id001\n' ' dict_with_list:\n' ' name: jin\n' ' set:\n' ' - 1\n' ' - 2\n' ' - 3\n' ' greeting:\n' ' introduce: The environment says hello!\n' ' part: Till we meet again\n' ' crazy:\n' ' type: !!python/name:logging.handlers.SysLogHandler \'\'\n' ' module: !!python/module:sys \'\'\n' ' instance: !!python/object:tests.SoftwareEngineer\n' ' name: jin\n' )
def test_file_writing(self): test_settings = load("single_fancy.yml") update_from_env(test_settings) m = mock_open() with mock.patch('{}.open'.format(builtin_module), m, create=True): with open('current_file.yml', 'w') as h: h.write(str(test_settings)) m.assert_called_once_with('current_file.yml', 'w') handle = m() handle.write.assert_called_with( 'test:\n' ' id1: &id001\n' ' name: hi\n' ' id2: &id002\n' ' name: hello\n' ' var_list:\n' ' - *id001\n' ' - *id002\n' ' dict_var_mix:\n' ' a: 10\n' ' b: *id001\n' ' dict_with_list:\n' ' name: jin\n' ' set:\n' ' - 1\n' ' - 2\n' ' - 3\n' ' greeting:\n' ' introduce: The environment says hello!\n' ' part: Till we meet again\n' ' crazy:\n' ' type: !!python/name:logging.handlers.SysLogHandler \'\'\n' ' module: !!python/module:sys \'\'\n' ' instance: !!python/object:tests.SoftwareEngineer\n' ' name: jin\n')
def test_env_prefix(package_data): """Test env prefix support""" package_data.return_value = b'val: needed\n' cfg = yamlsettings.load('pkg://example?prefix=ENV') assert cfg.val == 'mocked'
def test_env(package_data): """Testing with key matching the env""" package_data.return_value = b'env_val: needed\n' cfg = yamlsettings.load('pkg://example') assert cfg.env_val == 'mocked'
def test_resource(package_data): """Testing loading another resource""" package_data.return_value = b'a: b\n' cfg = yamlsettings.load('package://example?resource=foo.yaml') package_data.assert_called_once_with('example', 'foo.yaml') assert cfg.a == 'b'
def test_no_package_data(package_data): """Verify IOError without package data""" package_data.return_value = None with pytest.raises(IOError): yamlsettings.load('package://example')
def test_clone_changes_isolated(self): test_settings = load('defaults.yml') test_clone = test_settings.clone() test_settings.config.greet = "Hodo" self.assertNotEqual(test_settings.config.greet, test_clone.config.greet)
def test_update_from_file(self): test_defaults = load('defaults.yml') update_from_file(test_defaults, 'settings.yml') self.assertEqual(test_defaults.config.secret, 'I have many secrets') self.assertEqual(list(test_defaults), ['config'])
import requests, yamlsettings import libtado.api as api config_file = "config.yml" cfg = yamlsettings.load(config_file) headers = { "Authorization": "Bearer %s" % cfg.lifx.token, } def turnOffAllLights(): print("Turn off all lights...") payload = { "power": "off", } response = requests.put('https://api.lifx.com/v1/lights/all/state', data=payload, headers=headers) if __name__ == '__main__': t = api.Tado(cfg.tado.username, cfg.tado.password, cfg.tado.secret) isAtHome = False for device in t.get_mobile_devices(): if device['location']['atHome']: isAtHome = True if not isAtHome:
def test_load_single_file(self): test_defaults = load('defaults.yml') self.assertEqual(test_defaults.config.greet, 'Hello') self.assertEqual(test_defaults.config.leave, 'Goodbye') self.assertEqual(test_defaults.config.secret, 'I have no secrets') self.assertEqual(test_defaults.config.meaning, 42)
def test_limit(self): test_settings = load('settings.yml') test_settings.limit(['config']) self.assertEqual(list(test_settings), ['config'])
def test_mock_ext(base_registry): """Test package extension is not installed""" with pytest.raises(yamlsettings.RegistryError): yamlsettings.load('package://example')
def test_load_first_found(self): test_settings = load(['missing.yml', 'defaults.yml', 'settings.yml']) self.assertEqual(test_settings.config.greet, 'Hello') self.assertEqual(test_settings.config.leave, 'Goodbye') self.assertEqual(test_settings.config.secret, 'I have no secrets') self.assertEqual(test_settings.config.meaning, 42)
def test_list_replace_on_update(self): test_defaults = load('defaults.yml') test_defaults.update({'a': [1, 2, 3]}) self.assertEqual(test_defaults.a, [1, 2, 3]) test_defaults.update({'a': (4,)}) self.assertEqual(test_defaults.a, (4,))
import yamlsettings as _ys config = _ys.load("pkg://renogy_rover?prefix=RENOGY_ROVER")