Exemple #1
0
def _initialize_database(repository_url, table_name, data_dir, test_dir,
                         export_dir):
    """Initialize database for tests.

    This function will create the database and load any test data that
    the suite may require.

    Parameters
    ----------
    repository_url: str
        URL for the repository, as used by SQLAlchemy engines
    table_name: str
        Name of the table that is to be used to store pycsw records
    data_dir: str
        Path to a directory that contains sample data records to be loaded
        into the database
    test_dir: str
        Directory where the database is to be created, in case of sqlite.
    export_dir: str
        Diretory where the exported records are to be saved, if any

    """

    print("Setting up {0!r} repository...".format(repository_url))
    if repository_url.startswith("postgresql"):
        extra_kwargs = {
            "create_sfsql_tables": True,
            "create_plpythonu_functions": False
        }
    else:
        extra_kwargs = {}
    admin.setup_db(database=repository_url,
                   table=table_name,
                   home=test_dir,
                   **extra_kwargs)
    if len(os.listdir(data_dir)) > 0:
        print("Loading database data...")
        loaded = admin.load_records(context=StaticContext(),
                                    database=repository_url,
                                    table=table_name,
                                    xml_dirpath=data_dir,
                                    recursive=True)
        admin.optimize_db(context=StaticContext(),
                          database=repository_url,
                          table=table_name)
        if export_dir is not None:
            # Attempt to export files
            exported = admin.export_records(context=StaticContext(),
                                            database=repository_url,
                                            table=table_name,
                                            xml_dirpath=export_dir)
            if len(loaded) != len(exported):
                raise ValueError(
                    "Loaded records (%s) is different from exported records (%s)"
                    % (len(loaded), len(exported)))
            # Remove the files that were exported since this was just a test
            for toremove in exported:
                os.remove(toremove)
Exemple #2
0
 def handle(self, *args, **options):
     log_level = {
         0: logging.ERROR,
         1: logging.WARNING,
         2: logging.INFO,
         3: logging.DEBUG
     }.get(options["verbosity"])
     logger.setLevel(log_level)
     pycsw_logger = logging.getLogger("pycsw")
     pycsw_logger.setLevel(log_level)
     pycsw_config = build_pycsw_settings()
     context = StaticContext()
     self.pycsw_admin_handler.parse_configuration(pycsw_config, context)
     ArgsObject = namedtuple("ArgsObject", options.keys())
     the_args = ArgsObject(**options)
     result = the_args.func(the_args)
     if result is not None:
         self.stdout.write(result)
     self.stdout.write("Done!")
Exemple #3
0
def _initialize_database(repository_url, table_name, data_dir, test_dir):
    """Initialize database for tests.

    This function will create the database and load any test data that
    the suite may require.

    Parameters
    ----------
    repository_url: str
        URL for the repository, as used by SQLAlchemy engines
    table_name: str
        Name of the table that is to be used to store pycsw records
    data_dir: str
        Path to a directory that contains sample data records to be loaded
        into the database
    test_dir: str
        Directory where the database is to be created, in case of sqlite.

    """

    print("Setting up {0!r} repository...".format(repository_url))
    if repository_url.startswith("postgresql"):
        extra_kwargs = {
            "create_sfsql_tables": True,
            "create_plpythonu_functions": False
        }
    else:
        extra_kwargs = {}
    admin.setup_db(database=repository_url,
                   table=table_name,
                   home=test_dir,
                   **extra_kwargs)
    if len(os.listdir(data_dir)) > 0:
        print("Loading database data...")
        admin.load_records(context=StaticContext(),
                           database=repository_url,
                           table=table_name,
                           xml_dirpath=data_dir)
Exemple #4
0
    def __init__(self, config: ConfigParser):
        """
        constructor

        :param config: ConfigParser pycsw configuration dict

        :returns: `pycsw.ogc.api.API` instance
        """

        self.config = config

        log.setup_logger(self.config)

        if self.config['server']['url'].startswith('${'):
            LOGGER.debug(
                f"Server URL is an environment variable: {self.config['server']['url']}"
            )
            url_ = match_env_var(self.config['server']['url'])
        else:
            url_ = self.config['server']['url']

        LOGGER.debug(f'Server URL: {url_}')
        self.config['server']['url'] = url_.rstrip('/')

        self.context = StaticContext()

        LOGGER.debug('Setting maxrecords')
        try:
            self.maxrecords = int(self.config['server']['maxrecords'])
        except KeyError:
            self.maxrecords = 10
        LOGGER.debug(f'maxrecords: {self.maxrecords}')

        repo_filter = None
        if self.config.has_option('repository', 'filter'):
            repo_filter = self.config.get('repository', 'filter')

        self.orm = 'sqlalchemy'
        from pycsw.core import repository
        try:
            LOGGER.info('Loading default repository')
            self.repository = repository.Repository(
                self.config.get('repository', 'database'),
                self.context,
                # self.environ.get('local.app_root', None),
                None,
                self.config.get('repository', 'table'),
                repo_filter)
            LOGGER.debug(f'Repository loaded {self.repository.dbtype}')
        except Exception as err:
            msg = f'Could not load repository {err}'
            LOGGER.exception(msg)
            raise

        self.query_mappings = {
            'type': self.repository.dataset.type,
            'recordUpdated': self.repository.dataset.insert_date,
            'title': self.repository.dataset.title,
            'description': self.repository.dataset.abstract,
            'keywords': self.repository.dataset.keywords,
            'anytext': self.repository.dataset.anytext,
            'bbox': self.repository.dataset.wkt_geometry
        }
Exemple #5
0
    def __init__(self, config: ConfigParser):
        """
        constructor

        :param config: ConfigParser pycsw configuration dict

        :returns: `pycsw.ogc.api.API` instance
        """

        self.config = config

        log.setup_logger(self.config)

        if self.config['server']['url'].startswith('${'):
            LOGGER.debug(f"Server URL is an environment variable: {self.config['server']['url']}")
            url_ = match_env_var(self.config['server']['url'])
        else:
            url_ = self.config['server']['url']

        LOGGER.debug(f'Server URL: {url_}')
        self.config['server']['url'] = url_.rstrip('/')

        self.context = StaticContext()

        LOGGER.debug('Setting maxrecords')
        try:
            self.maxrecords = int(self.config['server']['maxrecords'])
        except KeyError:
            self.maxrecords = 10
        LOGGER.debug(f'maxrecords: {self.maxrecords}')

        repo_filter = None
        if self.config.has_option('repository', 'filter'):
            repo_filter = self.config.get('repository', 'filter')

        custom_mappings_path = self.config.get('repository', 'mappings', fallback=None)
        if custom_mappings_path is not None:
            md_core_model = load_custom_repo_mappings(custom_mappings_path)
            if md_core_model is not None:
                self.context.md_core_model = md_core_model
            else:
                LOGGER.exception(
                    'Could not load custom mappings: %s', custom_mappings_path)

        self.orm = 'sqlalchemy'
        from pycsw.core import repository
        try:
            LOGGER.info('Loading default repository')
            self.repository = repository.Repository(
                self.config.get('repository', 'database'),
                self.context,
                # self.environ.get('local.app_root', None),
                None,
                self.config.get('repository', 'table'),
                repo_filter
            )
            LOGGER.debug(f'Repository loaded {self.repository.dbtype}')
        except Exception as err:
            msg = f'Could not load repository {err}'
            LOGGER.exception(msg)
            raise

        self.query_mappings = {
            'type': self.repository.dataset.type,
            'parentidentifier': self.repository.dataset.parentidentifier,
            'collections': self.repository.dataset.parentidentifier,
            'recordUpdated': self.repository.dataset.insert_date,
            'title': self.repository.dataset.title,
            'description': self.repository.dataset.abstract,
            'keywords': self.repository.dataset.keywords,
            'anytext': self.repository.dataset.anytext,
            'bbox': self.repository.dataset.wkt_geometry,
            'date': self.repository.dataset.date,
            'time_begin': self.repository.dataset.time_begin,
            'time_end': self.repository.dataset.time_end,
            'platform': self.repository.dataset.platform,
            'instrument': self.repository.dataset.instrument,
            'sensortype': self.repository.dataset.sensortype
        }
        if self.repository.dbtype == 'postgresql+postgis+native':
            self.query_mappings['bbox'] = self.repository.dataset.wkb_geometry