def main(): config = ConfigManager() config.set_many(DEFAULT_CONFIG) _config = ConfigManager(schema=schema, defaults=defaults) config.set_many(_config.as_dict()) config.set_many( ConfigManager(schema=schema, path=_config.get('config.file')).as_dict()) config.set_many(_config.as_dict()) config.commit() if config.get('dump_configuration'): conf = config.as_dict() conf.pop('config42') print(yaml.dump(conf)) exit(0) if config.get('show_version'): print("Installed version {}".format(instabot_py.__version__)) exit(0) if not config.get('ignore_updates'): last_version = get_last_version() if last_version and last_version != instabot_py.__version__: print( "Newer version available: {}, The current version: {}".format( last_version, instabot_py.__version__)) print( "To update, please type \n python3 -m pip install instabot-py --upgrade --no-cache-dir " ) print("") print( " > You can ignore warning, run the instabot with --ignore-updates flag" ) exit(0) if config.get('verbosity'): verbosity = int(config.get('verbosity')) if verbosity == 1: level = logging.INFO elif verbosity > 1: level = logging.DEBUG config.set("logging.root.level", level) logging.config.dictConfig(config.get("logging")) try: bot = InstaBot(config=config) except CredsMissing: print( "You didn't provide your Instagram login & password or you didn't specify the configuration file" ) print("Try again :") print("") print(" instabot-py --login YOUR_LOGIN --password YOUR_PASSWORD") print(" instabot-py -c your-config.yml") print( "You can export and modify the default configuration by typing the command below" ) print(" instabot-py --dump") exit(1) bot.mainloop()
def main(): config = ConfigManager() config.set_many(DEFAULT_CONFIG) _config = ConfigManager(schema=schema, defaults=defaults) config.set_many(_config.as_dict()) config.set_many(ConfigManager(path=_config.get('config.file')).as_dict()) config.set_many(_config.as_dict()) config.commit() if config.get('dump_configuration'): conf = config.as_dict() conf.pop('config42') print(yaml.dump(conf)) exit(0) if config.get('show_version'): print(instabot_py.__version__) exit(0) if config.get('verbosity'): verbosity = int(config.get('verbosity')) if verbosity == 1: level = logging.INFO elif verbosity > 1: level = logging.DEBUG config.set("logging.root.level", level) logging.config.dictConfig(config.get("logging")) bot = InstaBot(config=config) bot.mainloop()
def test_configuration_update_default_value(default_config): config_manager = ConfigManager(defaults=default_config) assert config_manager.get('absentkey3.absentkey3.absentkey3') is None config_manager.set('absentkey3.absentkey3.absentkey3', "value", default=True) config_manager.set('absentkey4', "value", default=True) assert config_manager.as_dict().get('absentkey3') is None
def main(): parser = ArgumentParser(description='Instabot', add_help=False) parser.add_argument('--version', action='version', version=__version__) choices = [ func for func in dir(Instabot) if callable(getattr(Instabot, func)) and not func.startswith('_') ] parser.add_argument('action', metavar='|'.join(choices), choices=choices) defaults = { 'config42': OrderedDict([ ('argv', dict(handler=ArgParse, schema=schema, parents=[parser])), ('env', { 'prefix': 'INSTABOT' }), ('file', { 'path': 'config.yml' }), ]) } config = ConfigManager(schema=schema, defaults=defaults) config_file = config.get('config.file') _config = ConfigManager(schema=schema, path=config_file) config.set_many(_config.as_dict()) config.commit() logging.config.dictConfig(config.get("logging")) instabot = Instabot(config) getattr(instabot, config.get('action'))()
def main(): config = ConfigManager() config.set_many(DEFAULT_CONFIG) _config = ConfigManager(schema=schema, defaults=defaults) config.set_many(_config.as_dict()) config_file = _config.get('config.file') config.set_many(ConfigManager(schema=schema, path=config_file).as_dict()) config.set_many(_config.as_dict()) config.commit() configure_logging(config) if config.get('dump_configuration'): conf = config.as_dict() conf.pop('config42') conf.pop('dump_configuration') print(yaml.dump(conf)) exit(0) if config.get('show_version'): print("Installed version {}".format(src.__version__)) exit(0) if not config.get('ignore_updates'): last_version = get_last_version() if last_version and last_version != src.__version__: print("Newer version available: {}, The current version: {}".format(last_version, src.__version__)) print("To update, please type \n python3 -m pip install instabot-py --upgrade --no-cache-dir ") print("") print(" > You can ignore warning, run the instabot with --ignore-updates flag") exit(0) try: bot = InstaBot(config=config) if config_file: bot.logger.info(f"Reading configuration ({len(_config.as_dict())} settings) from {config_file}") else: bot.logger.info(f"Use the default configuration, add '-c your-config.yml' to specify your config") except CredsMissing: print("You didn't provide your Instagram login & password or you didn't specify the configuration file") print("Try again :") print("") print(" instabot-py --login YOUR_LOGIN --password YOUR_PASSWORD") print(" instabot-py -c your-config.yml") print("You can export and modify the default configuration by typing the command below") print(" instabot-py --dump") exit(1) bot.mainloop()
def test_apply_literals(script_runner): keyspace = '/' + str(uuid4()) _ = script_runner.run( 'config42', *args('-l key=value key2=value -c etcd --etcd-keyspace ' + keyspace)) ret = script_runner.run( 'config42', *args('-a apply -l key=value2 -c etcd --etcd-keyspace ' + keyspace)) assert ret.success config_manager = ConfigManager(keyspace=keyspace) assert config_manager.get('key') == 'value2' assert config_manager.get('key2') is None assert len(config_manager.as_dict()) == 1
def test_apply_raw(script_runner, tmp_path): tmp_dir = tmp_path / 'raw' tmp_dir.mkdir() path = str(tmp_dir) _ = script_runner.run( 'config42', *args('-l key=value key2=value -c raw --raw-path ' + path)) ret = script_runner.run( 'config42', *args('-a apply -l key=value2 -c raw --raw-path ' + path)) assert ret.success config_manager = ConfigManager(path=path) assert config_manager.get('key') == 'value2' assert config_manager.get('key') == 'value2' assert config_manager.get('key2') is None assert len(config_manager.as_dict()) == 1
def bot(tmp_path, cwd): from instabot_py import InstaBot import logging.config _config = ConfigManager(defaults={'config42': OrderedDict( [ ('env', {'prefix': 'INSTABOT'}), ('file', {'path': cwd + '/files/instabot.config.yml'}), ] )}) logging.basicConfig(level=logging.DEBUG) return InstaBot(**_config.as_dict(), session_file=str(tmp_path / "requests.session"), database={ "type": "sql", "connection_string": "sqlite:///" + str(tmp_path / "sqlite.db")})
def __init__(self, prefix, **kwargs): """ Initialize the handler data store. :param prefix: environment prefix for configuration map :type key: string """ super().__init__() configmanager = ConfigManager() for key, value in os.environ.items(): if key.startswith(prefix + "_"): configmanager.set( key.replace(prefix + "_", "").replace("_", ".").lower(), value) self.in_memory_config = configmanager.as_dict() self.config = self.in_memory_config
def main(): config = ConfigManager() config.set_many(DEFAULT_CONFIG) _config = ConfigManager(schema=schema, defaults=defaults) config.set_many(_config.as_dict()) config_file = _config.get('config.file') config.set_many(ConfigManager(schema=schema, path=config_file).as_dict()) config.set_many(_config.as_dict()) config.commit() configure_logging(config) if config.get('dump_configuration'): conf = config.as_dict() conf.pop('config42') conf.pop('dump_configuration') print(yaml.dump(conf)) exit(0) if config.get('create_configuration'): create_configuration() exit(0) if config.get('show_version'): print("Installed version {}".format(instabot_py.__version__)) exit(0) if not config.get('ignore_updates'): last_version = get_last_version() current_version = instabot_py.__version__ if last_version and last_version != current_version: print(f"""Newer version is available: {last_version}. The current \ version is: {current_version}. To update instabot-py, please perform: python3 -m pip install instabot-py --upgrade --no-cache-dir > You can also ignore this warning and upgrade instabot-py later. In this \ case, please run the instabot with '--ignore-updates' flag.""") exit(0) if config_file: print(f"Reading configuration ({len(_config.as_dict())} settings) from" f" {config_file}") elif os.path.isfile('instabot.config.yml'): print("Using 'instabot.config.yml' as a configuration, add " "'-c your-config.yml' if you want to use your config file") else: print("Configuration file has not been found. Please run the instabot " "with '--create-config' flag.") exit(0) try: bot = InstaBot(config=config) except CredsMissing: print( """We could not find your Instagram login and/or password. Maybe \ you did not change the default ones in the config file. You can specify them either directly, correct them in the default config file \ or use your own config file: instabot-py --login YOUR_LOGIN --password YOUR_PASSWORD or instabot-py -c your-config.yml """) exit(1) bot.mainloop()
def test_loop_as_dict(sample_config): config_manager = ConfigManager() config_manager.set_many(sample_config) assert len(config_manager.as_dict()) > 0 assert config_manager.as_dict() == config_manager.handler.config
from pprint import pprint from config42 import ConfigManager from config42.handlers.argparse import ArgParse schema = [ dict(name="first name", key="user.firstname"), dict(name="last name", key="user.lastname"), dict(name="email", source=dict(argv=["-e", "--email"]), key="user.email", description="A valid email address"), dict(name="Action", key="action", choices=["create", "delete"], default="create"), dict(name="logging level", key="logging.level", description="Logging verbosity level", choices=["critical", "error", "warning", "info", "debug"], type="string") ] try: config = ConfigManager(handler=ArgParse, schema=schema) pprint(config.as_dict()) except Exception as exc: pprint(exc)
import logging.config import os from config42 import ConfigManager from log_analyzer.default_config import DEFAULT_CONFIG LOGGER = logging.getLogger(__name__) env_config = ConfigManager(prefix="LOGANALYZER") logging.basicConfig( level=logging.DEBUG if env_config.get("debug") else logging.INFO) config = ConfigManager(defaults=DEFAULT_CONFIG) config.set_many(env_config.as_dict()) config_file = config.get("config.file") config_etcd = config.get("config.etcd") if config_file: if config_file.startswith("/"): config_path = config_file else: cwd = os.getcwd() config_path = cwd + "/" + config_file config.set_many( ConfigManager(path=config_path.replace('//', '/')).as_dict()) LOGGER.info("Setting configuration from {} : OK".format(config_file)) if config_etcd: if not config_etcd.get("keyspace"): raise Exception("etcd Keyspace is mandatory") try: config.set_many(ConfigManager(**config_etcd).as_dict())
def create(*, project_name, encoding='utf-8', environment=None, defaults=None): if defaults is None: defaults = {} # load defaults from home directory config_file = Config._get_config_file_path(project_name, "default") found_config_file = False if os.path.exists(config_file): logging.getLogger(__name__).info("loading default configurations from %s", config_file) config = ConfigManager(path=config_file, encoding=encoding, defaults=defaults) found_config_file = True # load environment configurations from environment variables # fix prefix to be SC prefix = "SC" env_config = ConfigManager(prefix=prefix) key_env = "environment" if environment is None: environment = env_config.get(key_env) if environment is None: # use production configuration if not specified environment environment = "production" logging.getLogger(__name__).info("did not specify environment, using %s", environment) else: logging.getLogger(__name__).info("using environment: %s", environment) # load environment configurations from /var/opt/sc directory env_config_file = Config._get_config_file_path(project_name, environment) if os.path.exists(env_config_file): logging.getLogger(__name__).info("loading environmental configurations from %s", env_config_file) if not found_config_file: config = ConfigManager(path=env_config_file, encoding=encoding, defaults=defaults) found_config_file = True else: config.set_many(ConfigManager(path=env_config_file, encoding=encoding).as_dict()) # load environment configurations from user directory user_config_file = Config._get_user_dir_config_file_path(project_name, environment) if os.path.exists(user_config_file): logging.getLogger(__name__).info("loading user directory configurations from %s", user_config_file) if not found_config_file: config = ConfigManager(path=user_config_file, encoding=encoding, defaults=defaults) found_config_file = True else: config.set_many(ConfigManager(path=user_config_file, encoding=encoding).as_dict()) # load environment configurations from current directory current_dir_config_file = Config._get_cur_dir_config_file_path(environment) if os.path.exists(current_dir_config_file): logging.getLogger(__name__).info("loading current directory configurations from %s", current_dir_config_file) logging.getLogger(__name__).info(f"found_config_file: {found_config_file}") if not found_config_file: config = ConfigManager(path=current_dir_config_file, encoding=encoding, defaults=defaults) found_config_file = True else: config.set_many(ConfigManager(path=current_dir_config_file, encoding=encoding).as_dict()) if not found_config_file: config = ConfigManager(defaults=defaults) config.set_many(env_config.as_dict()) config.set(key_env, environment) return config