def test_validate_regex(): assert Config().validate({Setting.DRIVE_IPV4: "192.168.1.1"}) == defaultAnd( {Setting.DRIVE_IPV4: "192.168.1.1"}) with raises(InvalidConfigurationValue): Config().validate({Setting.DRIVE_IPV4: -1}) with raises(InvalidConfigurationValue): Config().validate({Setting.DRIVE_IPV4: "192.168.1"})
def test_GenerationalConfig() -> None: assert Config().getGenerationalConfig() is None assert Config().override(Setting.GENERATIONAL_DAYS, 5).getGenerationalConfig() == GenConfig(days=5) assert Config().override(Setting.GENERATIONAL_WEEKS, 3).getGenerationalConfig() == GenConfig(days=1, weeks=3) assert Config().override(Setting.GENERATIONAL_MONTHS, 3).getGenerationalConfig() == GenConfig(days=1, months=3) assert Config().override(Setting.GENERATIONAL_YEARS, 3).getGenerationalConfig() == GenConfig(days=1, years=3) assert Config().override(Setting.GENERATIONAL_DELETE_EARLY, True).override( Setting.GENERATIONAL_DAYS, 2).getGenerationalConfig() == GenConfig(days=2, aggressive=True) assert Config().override(Setting.GENERATIONAL_DAYS, 1).override( Setting.GENERATIONAL_DAY_OF_YEAR, 3).getGenerationalConfig() == GenConfig(days=1, day_of_year=3) assert Config().override(Setting.GENERATIONAL_DAYS, 1).override( Setting.GENERATIONAL_DAY_OF_MONTH, 3).getGenerationalConfig() == GenConfig(days=1, day_of_month=3) assert Config().override(Setting.GENERATIONAL_DAYS, 1).override( Setting.GENERATIONAL_DAY_OF_WEEK, "tue").getGenerationalConfig() == GenConfig(days=1, day_of_week="tue") assert Config().override(Setting.GENERATIONAL_DAY_OF_MONTH, 3).override( Setting.GENERATIONAL_DAY_OF_WEEK, "tue").override( Setting.GENERATIONAL_DAY_OF_YEAR, "4").getGenerationalConfig() is None
def test_send_error_reports(): assert Config().validate({Setting.SEND_ERROR_REPORTS: False}) == defaultAnd( {Setting.SEND_ERROR_REPORTS: False}) assert Config().validate({Setting.SEND_ERROR_REPORTS: True}) == defaultAnd( {Setting.SEND_ERROR_REPORTS: True}) assert Config().validate( {Setting.SEND_ERROR_REPORTS: None}) == defaultAnd()
def test_timeOfDay(estimator) -> None: time: FakeTime = FakeTime() info = GlobalInfo(time) config: Config = Config() model: Model = Model(config, time, default_source, default_source, info, estimator) assert model.getTimeOfDay() is None config = Config().override(Setting.SNAPSHOT_TIME_OF_DAY, '00:00') model = Model(config, time, default_source, default_source, info, estimator) assert model.getTimeOfDay() == (0, 0) config.override(Setting.SNAPSHOT_TIME_OF_DAY, '23:59') model = Model(config, time, default_source, default_source, info, estimator) assert model.getTimeOfDay() == (23, 59) config.override(Setting.SNAPSHOT_TIME_OF_DAY, '24:59') model = Model(config, time, default_source, default_source, info, estimator) assert model.getTimeOfDay() is None config.override(Setting.SNAPSHOT_TIME_OF_DAY, '24:60') model = Model(config, time, default_source, default_source, info, estimator) assert model.getTimeOfDay() is None config.override(Setting.SNAPSHOT_TIME_OF_DAY, '-1:60') model = Model(config, time, default_source, default_source, info, estimator) assert model.getTimeOfDay() is None config.override(Setting.SNAPSHOT_TIME_OF_DAY, '24:-1') model = Model(config, time, default_source, default_source, info, estimator) assert model.getTimeOfDay() is None config.override(Setting.SNAPSHOT_TIME_OF_DAY, 'boop:60') model = Model(config, time, default_source, default_source, info, estimator) assert model.getTimeOfDay() is None config.override(Setting.SNAPSHOT_TIME_OF_DAY, '24:boop') model = Model(config, time, default_source, default_source, info, estimator) assert model.getTimeOfDay() is None config.override(Setting.SNAPSHOT_TIME_OF_DAY, '24:10:22') model = Model(config, time, default_source, default_source, info, estimator) assert model.getTimeOfDay() is None config.override(Setting.SNAPSHOT_TIME_OF_DAY, '10') model = Model(config, time, default_source, default_source, info, estimator) assert model.getTimeOfDay() is None
def test_validate_float(): setting = Setting.DAYS_BETWEEN_SNAPSHOTS assert Config().validate({setting: 5}) == defaultAnd({setting: 5}) assert Config().validate({setting.key(): 5}) == defaultAnd({setting: 5}) assert Config().validate({setting: 5.0}) == defaultAnd({setting: 5}) assert Config().validate({setting: "5"}) == defaultAnd({setting: 5}) with raises(InvalidConfigurationValue): Config().validate({'days_between_snapshots': -1})
def test_validate_int(): assert Config().validate({'max_snapshots_in_hassio': 5}) == defaultAnd( {Setting.MAX_SNAPSHOTS_IN_HASSIO: 5}) assert Config().validate({'max_snapshots_in_hassio': 5.0}) == defaultAnd( {Setting.MAX_SNAPSHOTS_IN_HASSIO: 5}) assert Config().validate({'max_snapshots_in_hassio': "5"}) == defaultAnd( {Setting.MAX_SNAPSHOTS_IN_HASSIO: 5}) with raises(InvalidConfigurationValue): Config().validate({'max_snapshots_in_hassio': -1})
def test_validate_bool(): setting = Setting.SEND_ERROR_REPORTS assert Config().validate({setting: True}) == defaultAnd({setting: True}) assert Config().validate({setting: False}) == defaultAnd({setting: False}) assert Config().validate({setting: "true"}) == defaultAnd({setting: True}) assert Config().validate({setting: "false"}) == defaultAnd({setting: False}) assert Config().validate({setting: "1"}) == defaultAnd({setting: True}) assert Config().validate({setting: "0"}) == defaultAnd({setting: False}) assert Config().validate({setting: "yes"}) == defaultAnd({setting: True}) assert Config().validate({setting: "no"}) == defaultAnd({setting: False}) assert Config().validate({setting: "on"}) == defaultAnd({setting: True}) assert Config().validate({setting: "off"}) == defaultAnd({setting: False})
def main() -> None: logging.getLogger('googleapiclient.discovery_cache').setLevel( logging.ERROR) time: Time = Time() if len(sys.argv) == 1: config: Config = Config([HASSIO_OPTIONS_FILE]) else: config: Config = Config(sys.argv[1:]) hassio: Hassio = Hassio(config) while True: try: hassio.loadInfo() break except Exception: LogBase().critical( "Unable to reach Hassio supervisor. Please ensure the supervisor is running." ) sleep(10) if config.warnIngress(): LogBase().warn( "This add-on supports ingress but your verison of Home Assistant does not. Please update to the latest verison of home Assistant." ) drive: Drive = Drive(config) try: watcher: Watcher = Watcher(time, config) engine: engine = Engine(watcher, config, drive, hassio, time) # type: ignore server: Server = Server("www", engine, config) engine_thread: Thread = Thread(target=engine.run) # type: ignore engine_thread.setName("Engine Thread") engine_thread.daemon = True engine_thread.start() server_thread: Thread = Thread(target=server.run) server_thread.daemon = True server_thread.setName("Server Thread") server_thread.start() while True: sleep(5) finally: if watcher: watcher.stop()
def test_validate_string(): assert Config().validate({Setting.SNAPSHOT_NAME: True}) == defaultAnd({Setting.SNAPSHOT_NAME: "True"}) assert Config().validate({Setting.SNAPSHOT_NAME: False}) == defaultAnd({Setting.SNAPSHOT_NAME: "False"}) assert Config().validate({Setting.SNAPSHOT_NAME: "true"}) == defaultAnd({Setting.SNAPSHOT_NAME: "true"}) assert Config().validate({Setting.SNAPSHOT_NAME: "false"}) == defaultAnd({Setting.SNAPSHOT_NAME: "false"}) assert Config().validate({Setting.SNAPSHOT_NAME: "1"}) == defaultAnd({Setting.SNAPSHOT_NAME: "1"}) assert Config().validate({Setting.SNAPSHOT_NAME: "0"}) == defaultAnd({Setting.SNAPSHOT_NAME: "0"}) assert Config().validate({Setting.SNAPSHOT_NAME: "yes"}) == defaultAnd({Setting.SNAPSHOT_NAME: "yes"}) assert Config().validate({Setting.SNAPSHOT_NAME: "no"}) == defaultAnd({Setting.SNAPSHOT_NAME: "no"})
def test_remove_ssl(): assert Config().validate({Setting.USE_SSL: True}) == defaultAnd({Setting.USE_SSL: True}) assert Config().validate({Setting.USE_SSL: False}) == defaultAnd( {Setting.USE_SSL: False}) assert Config().validate({ Setting.USE_SSL: False, Setting.CERTFILE: "removed", Setting.KEYFILE: 'removed' }) == defaultAnd({Setting.USE_SSL: False}) assert Config().validate({ Setting.USE_SSL: True, Setting.CERTFILE: "kept", Setting.KEYFILE: 'kept' }) == defaultAnd({ Setting.USE_SSL: True, Setting.CERTFILE: "kept", Setting.KEYFILE: 'kept' })
def test_next_time(estimator): time: FakeTime = FakeTime() info = GlobalInfo(time) now: datetime = datetime(1985, 12, 6, 1, 0, 0).astimezone(timezone.utc) config: Config = Config().override(Setting.DAYS_BETWEEN_SNAPSHOTS, 0) model: Model = Model(config, time, default_source, default_source, info, estimator) assert model._nextSnapshot(now=now, last_snapshot=None) is None assert model._nextSnapshot(now=now, last_snapshot=now) is None config: Config = Config().override(Setting.DAYS_BETWEEN_SNAPSHOTS, 1) model: Model = Model(config, time, default_source, default_source, info, estimator) assert model._nextSnapshot( now=now, last_snapshot=None) == now - timedelta(minutes=1) assert model._nextSnapshot(now=now, last_snapshot=now) == now + timedelta(days=1) assert model._nextSnapshot(now=now, last_snapshot=now - timedelta(days=1)) == now assert model._nextSnapshot(now=now, last_snapshot=now + timedelta(days=1)) == now + timedelta(days=2)
def test_validate_url(): assert Config().validate({Setting.HASSIO_URL: True }) == defaultAnd({Setting.HASSIO_URL: "True"}) assert Config().validate({Setting.HASSIO_URL: False }) == defaultAnd({Setting.HASSIO_URL: "False"}) assert Config().validate({Setting.HASSIO_URL: "true" }) == defaultAnd({Setting.HASSIO_URL: "true"}) assert Config().validate({Setting.HASSIO_URL: "false" }) == defaultAnd({Setting.HASSIO_URL: "false"}) assert Config().validate({Setting.HASSIO_URL: "1"}) == defaultAnd({Setting.HASSIO_URL: "1"}) assert Config().validate({Setting.HASSIO_URL: "0"}) == defaultAnd({Setting.HASSIO_URL: "0"}) assert Config().validate({Setting.HASSIO_URL: "yes" }) == defaultAnd({Setting.HASSIO_URL: "yes"}) assert Config().validate({Setting.HASSIO_URL: "no"}) == defaultAnd({Setting.HASSIO_URL: "no"})
def test_next_time_of_day(estimator): time: FakeTime = FakeTime() info = GlobalInfo(time) now: datetime = datetime(1985, 12, 6, 1, 0, 0).astimezone(timezone.utc) config: Config = Config().override(Setting.DAYS_BETWEEN_SNAPSHOTS, 1).override( Setting.SNAPSHOT_TIME_OF_DAY, '08:00') model: Model = Model(config, time, default_source, default_source, info, estimator) assert model._nextSnapshot( now=now, last_snapshot=None) == now - timedelta(minutes=1) assert model._nextSnapshot(now=now, last_snapshot=now - timedelta(days=1)) == datetime(1985, 12, 5, 8, 0, tzinfo=test_tz) assert model._nextSnapshot(now=now, last_snapshot=now) == datetime(1985, 12, 6, 8, 0, tzinfo=test_tz) assert model._nextSnapshot(now=now, last_snapshot=datetime( 1985, 12, 6, 8, 0, tzinfo=test_tz)) == datetime(1985, 12, 7, 8, 0, tzinfo=test_tz) assert model._nextSnapshot( now=datetime(1985, 12, 6, 8, 0, tzinfo=test_tz), last_snapshot=datetime(1985, 12, 6, 8, 0, tzinfo=test_tz)) == datetime(1985, 12, 7, 8, 0, tzinfo=test_tz)
def getConfig(self) -> Config: alt_config = None index = 1 for arg in sys.argv[1:]: if arg == "--config": alt_config = sys.argv[index + 1] break index += 1 if alt_config: config = Config.withFileOverrides(alt_config) elif "PYTEST_CURRENT_TEST" in os.environ: config = Config() else: config = Config.fromFile(Setting.CONFIG_FILE_PATH.default()) logger.overrideLevel(config.get(Setting.CONSOLE_LOG_LEVEL), config.get(Setting.LOG_LEVEL)) return config
def test_validate_empty(): config = Config() assert config.validate({}) == defaultAnd()
from time import sleep from sys import argv from os.path import join, abspath logger = getLogger(__name__) async def main(config): await Injector([BaseModule(config), MainModule()]).get(Starter).startup() while True: await asyncio.sleep(1) if __name__ == '__main__': config = Config() if len(argv) > 1: # Needed to load a different config for dev environments. config = Config.withFileOverrides( abspath(join(__file__, "../../dev/data", argv[1] + "_options.json"))) else: config = Config.fromFile(Setting.CONFIG_FILE_PATH.default()) logger.overrideLevel(config.get(Setting.CONSOLE_LOG_LEVEL), config.get(Setting.LOG_LEVEL)) if config.get(Setting.DEBUGGER_PORT) is not None: port = config.get(Setting.DEBUGGER_PORT) logger.info("Starting debugger on port {}".format(port)) ptvsd.enable_attach(('0.0.0.0', port))
def createConfig() -> Config: return Config().override(Setting.SNAPSHOT_STARTUP_DELAY_MINUTES, 0)
def test_unrecognized_values_filter(): assert Config().validate({'blah': "bloo"}) == defaultAnd()
def test_removes_defaults(): assert Config().validate({Setting.SNAPSHOT_TIME_OF_DAY: ""}) == defaultAnd()
def simple_config(): config = Config() return config
async def test_bootstarp_requirements(): # This just verifies we're able to satisfy starter's injector requirements. injector = Injector([BaseModule(Config()), MainModule()]) injector.get(Starter)
def simple_config(): config = Config() config.override(Setting.SNAPSHOT_STARTUP_DELAY_MINUTES, 0) return config