def sql_preprocessor(temp_db_conn, tmp_path, monkeypatch, table_factory): table_factory('country_name', 'partition INT', ((0, ), (1, ), (2, ))) cfg = Configuration(None, SRC_DIR.resolve() / 'settings') cfg.set_libdirs(module='.', osm2pgsql='.', php=SRC_DIR / 'lib-php', sql=tmp_path, data=SRC_DIR / 'data') return SQLPreprocessor(temp_db_conn, cfg)
def test_get_libpq_dsn_convert_libpq(monkeypatch): config = Configuration(None, DEFCFG_DIR) monkeypatch.setenv('NOMINATIM_DATABASE_DSN', 'host=localhost dbname=gis password=foo') assert config.get_libpq_dsn() == 'host=localhost dbname=gis password=foo'
def test_get_int_empty(): config = Configuration(None, DEFCFG_DIR) assert config.DATABASE_MODULE_PATH == '' with pytest.raises(UsageError): config.get_int('DATABASE_MODULE_PATH')
def def_config(): cfg = Configuration(None, SRC_DIR.resolve() / 'settings') cfg.set_libdirs(module='.', osm2pgsql='.', php=SRC_DIR / 'lib-php', sql=SRC_DIR / 'lib-sql', data=SRC_DIR / 'data') return cfg
def test_get_int_bad_values(monkeypatch, value): config = Configuration(None, DEFCFG_DIR) monkeypatch.setenv('NOMINATIM_FOOBAR', value) with pytest.raises(UsageError): config.get_int('FOOBAR')
def test_get_libpq_dsn_convert_php_special_chars(monkeypatch, val, expect): config = Configuration(None, DEFCFG_DIR) monkeypatch.setenv('NOMINATIM_DATABASE_DSN', 'pgsql:dbname=gis;password={}'.format(val)) assert config.get_libpq_dsn() == "dbname=gis password={}".format(expect)
def test_get_import_style_intern(monkeypatch): config = Configuration(None, DEFCFG_DIR) monkeypatch.setenv('NOMINATIM_IMPORT_STYLE', 'street') expected = DEFCFG_DIR / 'import-street.style' assert config.get_import_style_file() == expected
def sql_preprocessor(temp_db_conn, tmp_path, monkeypatch, table_factory): monkeypatch.setenv('NOMINATIM_DATABASE_MODULE_PATH', '.') table_factory('country_name', 'partition INT', (0, 1, 2)) cfg = Configuration(None, SRC_DIR.resolve() / 'settings') cfg.set_libdirs(module='.', osm2pgsql='.', php=SRC_DIR / 'lib-php', sql=tmp_path, data=SRC_DIR / 'data') return SQLPreprocessor(temp_db_conn, cfg)
def def_config(src_dir): cfg = Configuration(None, src_dir / 'settings') cfg.set_libdirs(module='.', osm2pgsql='.', php=src_dir / 'lib-php', sql=src_dir / 'lib-sql', data=src_dir / 'data') return cfg
def sql_preprocessor_cfg(tmp_path, table_factory, temp_db_with_extensions): table_factory('country_name', 'partition INT', ((0, ), (1, ), (2, ))) cfg = Configuration(None, SRC_DIR.resolve() / 'settings') cfg.set_libdirs(module='.', osm2pgsql='.', php=SRC_DIR / 'lib-php', sql=tmp_path, data=SRC_DIR / 'data') return cfg
def get_test_config(self): cfg = Configuration(Path(self.website_dir.name), self.src_dir / 'settings', environ=self.test_env) cfg.set_libdirs(module=self.build_dir / 'module', osm2pgsql=self.build_dir / 'osm2pgsql' / 'osm2pgsql', php=self.src_dir / 'lib-php', sql=self.src_dir / 'lib-sql', data=self.src_dir / 'data') return cfg
def project_env(src_dir, tmp_path): projdir = tmp_path / 'project' projdir.mkdir() cfg = Configuration(projdir, src_dir / 'settings') cfg.set_libdirs(module='.', osm2pgsql='.', php=src_dir / 'lib-php', sql=src_dir / 'lib-sql', data=src_dir / 'data') return cfg
def test_prefer_project_setting_over_default(val, tmp_path): envfile = tmp_path / '.env' envfile.write_text('NOMINATIM_DATABASE_WEBUSER={}\n'.format(val)) config = Configuration(Path(tmp_path), DEFCFG_DIR) assert config.DATABASE_WEBUSER == 'apache'
def test_prefer_project_setting_over_default(): with tempfile.TemporaryDirectory() as project_dir: with open(project_dir + '/.env', 'w') as envfile: envfile.write('NOMINATIM_DATABASE_WEBUSER=apache\n') config = Configuration(Path(project_dir), DEFCFG_DIR) assert config.DATABASE_WEBUSER == 'apache'
def write_nominatim_config(self, dbname): """ Set up a custom test configuration that connects to the given database. This sets up the environment variables so that they can be picked up by dotenv and creates a project directory with the appropriate website scripts. """ dsn = 'pgsql:dbname={}'.format(dbname) if self.db_host: dsn += ';host=' + self.db_host if self.db_port: dsn += ';port=' + self.db_port if self.db_user: dsn += ';user='******';password='******'NOMINATIM_DATABASE_DSN']: return # environment already set uo self.test_env = dict(self.default_config) self.test_env['NOMINATIM_DATABASE_DSN'] = dsn self.test_env['NOMINATIM_FLATNODE_FILE'] = '' self.test_env['NOMINATIM_IMPORT_STYLE'] = 'full' self.test_env['NOMINATIM_USE_US_TIGER_DATA'] = 'yes' self.test_env['NOMINATIM_DATADIR'] = str( (self.src_dir / 'data').resolve()) self.test_env['NOMINATIM_SQLDIR'] = str( (self.src_dir / 'lib-sql').resolve()) self.test_env['NOMINATIM_CONFIGDIR'] = str( (self.src_dir / 'settings').resolve()) self.test_env['NOMINATIM_DATABASE_MODULE_SRC_PATH'] = str( (self.build_dir / 'module').resolve()) self.test_env['NOMINATIM_OSM2PGSQL_BINARY'] = str( (self.build_dir / 'osm2pgsql' / 'osm2pgsql').resolve()) self.test_env['NOMINATIM_NOMINATIM_TOOL'] = str( (self.build_dir / 'nominatim').resolve()) if self.server_module_path: self.test_env[ 'NOMINATIM_DATABASE_MODULE_PATH'] = self.server_module_path else: # avoid module being copied into the temporary environment self.test_env['NOMINATIM_DATABASE_MODULE_PATH'] = str( (self.build_dir / 'module').resolve()) if self.website_dir is not None: self.website_dir.cleanup() self.website_dir = tempfile.TemporaryDirectory() cfg = Configuration(None, self.src_dir / 'settings', environ=self.test_env) refresh.setup_website( Path(self.website_dir.name) / 'website', self.src_dir / 'lib-php', cfg)
def test_prefer_os_environ_over_project_setting(monkeypatch, tmp_path): envfile = tmp_path / '.env' envfile.write_text('NOMINATIM_DATABASE_WEBUSER=apache\n') monkeypatch.setenv('NOMINATIM_DATABASE_WEBUSER', 'nobody') config = Configuration(Path(tmp_path), DEFCFG_DIR) assert config.DATABASE_WEBUSER == 'nobody'
def test_prefer_os_environ_over_project_setting(monkeypatch): with tempfile.TemporaryDirectory() as project_dir: with open(project_dir + '/.env', 'w') as envfile: envfile.write('NOMINATIM_DATABASE_WEBUSER=apache\n') monkeypatch.setenv('NOMINATIM_DATABASE_WEBUSER', 'nobody') config = Configuration(Path(project_dir), DEFCFG_DIR) assert config.DATABASE_WEBUSER == 'nobody'
def run(self, **kwargs): """ Parse the command line arguments of the program and execute the appropriate subcommand. """ args = NominatimArgs() self.parser.parse_args(args=kwargs.get('cli_args'), namespace=args) if args.subcommand is None: self.parser.print_help() return 1 for arg in ('module_dir', 'osm2pgsql_path', 'phplib_dir', 'sqllib_dir', 'data_dir', 'config_dir', 'phpcgi_path'): setattr(args, arg, Path(kwargs[arg])) args.project_dir = Path(args.project_dir).resolve() if 'cli_args' not in kwargs: logging.basicConfig(stream=sys.stderr, format='%(asctime)s: %(message)s', datefmt='%Y-%m-%d %H:%M:%S', level=max(4 - args.verbose, 1) * 10) args.config = Configuration(args.project_dir, args.config_dir, environ=kwargs.get('environ', os.environ)) args.config.set_libdirs(module=args.module_dir, osm2pgsql=args.osm2pgsql_path, php=args.phplib_dir, sql=args.sqllib_dir, data=args.data_dir) log = logging.getLogger() log.warning('Using project directory: %s', str(args.project_dir)) try: return args.command.run(args) except UsageError as exception: if log.isEnabledFor(logging.DEBUG): raise # use Python's exception printing log.fatal('FATAL: %s', exception) # If we get here, then execution has failed in some way. return 1
def __init__(self, config): self.build_dir = Path(config['BUILDDIR']).resolve() self.src_dir = (Path(__file__) / '..' / '..' / '..' / '..').resolve() self.db_host = config['DB_HOST'] self.db_port = config['DB_PORT'] self.db_user = config['DB_USER'] self.db_pass = config['DB_PASS'] self.template_db = config['TEMPLATE_DB'] self.test_db = config['TEST_DB'] self.api_test_db = config['API_TEST_DB'] self.api_test_file = config['API_TEST_FILE'] self.server_module_path = config['SERVER_MODULE_PATH'] self.reuse_template = not config['REMOVE_TEMPLATE'] self.keep_scenario_db = config['KEEP_TEST_DB'] self.code_coverage_path = config['PHPCOV'] self.code_coverage_id = 1 self.default_config = Configuration(None, self.src_dir / 'settings').get_os_env() self.test_env = None self.template_db_done = False self.api_db_done = False self.website_dir = None
def test_get_import_style_intern(monkeypatch, value): config = Configuration(None, DEFCFG_DIR) monkeypatch.setenv('NOMINATIM_IMPORT_STYLE', value) assert str(config.get_import_style_file()) == value
def test_get_libpq_dsn_convert_default(): config = Configuration(None, DEFCFG_DIR) assert config.get_libpq_dsn() == 'dbname=nominatim'
def def_config(): return Configuration(None, SRC_DIR.resolve() / 'settings')
def test_no_project_dir(): config = Configuration(None, DEFCFG_DIR) assert config.DATABASE_WEBUSER == 'www-data'
def _mk_config(project_dir=None): return Configuration(project_dir, src_dir / 'settings')
def test_get_bool_empty(): config = Configuration(None, DEFCFG_DIR) assert config.DATABASE_MODULE_PATH == '' assert config.get_bool('DATABASE_MODULE_PATH') == False
def test_get_os_env_add_defaults(monkeypatch): config = Configuration(None, DEFCFG_DIR) monkeypatch.delenv('NOMINATIM_DATABASE_WEBUSER', raising=False) assert config.get_os_env()['NOMINATIM_DATABASE_WEBUSER'] == 'www-data'
def test_get_os_env_prefer_os_environ(monkeypatch): config = Configuration(None, DEFCFG_DIR) monkeypatch.setenv('NOMINATIM_DATABASE_WEBUSER', 'nobody') assert config.get_os_env()['NOMINATIM_DATABASE_WEBUSER'] == 'nobody'
def _mk_config(): (tmp_path / 'project').mkdir() (tmp_path / 'config').mkdir() conf = Configuration(tmp_path / 'project', src_dir / 'settings') conf.config_dir = tmp_path / 'config' return conf
def test_get_bool(monkeypatch, value, result): config = Configuration(None, DEFCFG_DIR) monkeypatch.setenv('NOMINATIM_FOOBAR', value) assert config.get_bool('FOOBAR') == result