remove now unused run_api_script function

This commit is contained in:
Sarah Hoffmann
2023-07-25 22:45:29 +02:00
parent 4cd0a4ced4
commit f69fea4210
3 changed files with 2 additions and 119 deletions

View File

@@ -7,14 +7,12 @@
""" """
Subcommand definitions for API calls from the command line. Subcommand definitions for API calls from the command line.
""" """
from typing import Mapping, Dict, Any from typing import Dict, Any
import argparse import argparse
import logging import logging
import json import json
import sys import sys
from nominatim.tools.exec_utils import run_api_script
from nominatim.errors import UsageError
from nominatim.clicmd.args import NominatimArgs from nominatim.clicmd.args import NominatimArgs
import nominatim.api as napi import nominatim.api as napi
import nominatim.api.v1 as api_output import nominatim.api.v1 as api_output
@@ -62,18 +60,6 @@ def _add_api_output_arguments(parser: argparse.ArgumentParser) -> None:
"Parameter is difference tolerance in degrees.")) "Parameter is difference tolerance in degrees."))
def _run_api(endpoint: str, args: NominatimArgs, params: Mapping[str, object]) -> int:
script_file = args.project_dir / 'website' / (endpoint + '.php')
if not script_file.exists():
LOG.error("Cannot find API script file.\n\n"
"Make sure to run 'nominatim' from the project directory \n"
"or use the option --project-dir.")
raise UsageError("API script not found.")
return run_api_script(endpoint, args.project_dir,
phpcgi_bin=args.phpcgi_path, params=params)
class APISearch: class APISearch:
"""\ """\
Execute a search query. Execute a search query.

View File

@@ -7,13 +7,11 @@
""" """
Helper functions for executing external programs. Helper functions for executing external programs.
""" """
from typing import Any, Optional, Mapping, IO from typing import Any, Mapping, IO
from pathlib import Path
import logging import logging
import os import os
import subprocess import subprocess
import urllib.request as urlrequest import urllib.request as urlrequest
from urllib.parse import urlencode
from nominatim.typing import StrPath from nominatim.typing import StrPath
from nominatim.version import NOMINATIM_VERSION from nominatim.version import NOMINATIM_VERSION
@@ -21,64 +19,6 @@ from nominatim.db.connection import get_pg_env
LOG = logging.getLogger() LOG = logging.getLogger()
def run_api_script(endpoint: str, project_dir: Path,
extra_env: Optional[Mapping[str, str]] = None,
phpcgi_bin: Optional[Path] = None,
params: Optional[Mapping[str, Any]] = None) -> int:
""" Execute a Nominatim API function.
The function needs a project directory that contains the website
directory with the scripts to be executed. The scripts will be run
using php_cgi. Query parameters can be added as named arguments.
Returns the exit code of the script.
"""
log = logging.getLogger()
webdir = str(project_dir / 'website')
query_string = urlencode(params or {})
env = dict(QUERY_STRING=query_string,
SCRIPT_NAME=f'/{endpoint}.php',
REQUEST_URI=f'/{endpoint}.php?{query_string}',
CONTEXT_DOCUMENT_ROOT=webdir,
SCRIPT_FILENAME=f'{webdir}/{endpoint}.php',
HTTP_HOST='localhost',
HTTP_USER_AGENT='nominatim-tool',
REMOTE_ADDR='0.0.0.0',
DOCUMENT_ROOT=webdir,
REQUEST_METHOD='GET',
SERVER_PROTOCOL='HTTP/1.1',
GATEWAY_INTERFACE='CGI/1.1',
REDIRECT_STATUS='CGI')
if extra_env:
env.update(extra_env)
if phpcgi_bin is None:
cmd = ['/usr/bin/env', 'php-cgi']
else:
cmd = [str(phpcgi_bin)]
proc = subprocess.run(cmd, cwd=str(project_dir), env=env,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
check=False)
if proc.returncode != 0 or proc.stderr:
if proc.stderr:
log.error(proc.stderr.decode('utf-8').replace('\\n', '\n'))
else:
log.error(proc.stdout.decode('utf-8').replace('\\n', '\n'))
return proc.returncode or 1
result = proc.stdout.decode('utf-8')
content_start = result.find('\r\n\r\n')
print(result[content_start + 4:].replace('\\n', '\n'))
return 0
def run_php_server(server_address: str, base_dir: StrPath) -> None: def run_php_server(server_address: str, base_dir: StrPath) -> None:
""" Run the built-in server from the given directory. """ Run the built-in server from the given directory.
""" """

View File

@@ -17,49 +17,6 @@ import nominatim.tools.exec_utils as exec_utils
import nominatim.paths import nominatim.paths
class TestRunApiScript:
@staticmethod
@pytest.fixture(autouse=True)
def setup_project_dir(tmp_path):
webdir = tmp_path / 'website'
webdir.mkdir()
(webdir / 'test.php').write_text("<?php\necho 'OK\n';")
@staticmethod
def test_run_api(tmp_path):
assert exec_utils.run_api_script('test', tmp_path) == 0
@staticmethod
def test_run_api_execution_error(tmp_path):
assert exec_utils.run_api_script('badname', tmp_path) != 0
@staticmethod
def test_run_api_with_extra_env(tmp_path):
extra_env = dict(SCRIPT_FILENAME=str(tmp_path / 'website' / 'test.php'))
assert exec_utils.run_api_script('badname', tmp_path, extra_env=extra_env) == 0
@staticmethod
def test_custom_phpcgi(tmp_path, capfd):
assert exec_utils.run_api_script('test', tmp_path, phpcgi_bin='env',
params={'q' : 'Berlin'}) == 0
captured = capfd.readouterr()
assert '?q=Berlin' in captured.out
@staticmethod
def test_fail_on_error_output(tmp_path):
# Starting PHP 8 the PHP CLI no longer has STDERR defined as constant
php = """
<?php
if(!defined('STDERR')) define('STDERR', fopen('php://stderr', 'wb'));
fwrite(STDERR, 'WARNING'.PHP_EOL);
"""
(tmp_path / 'website' / 'bad.php').write_text(php)
assert exec_utils.run_api_script('bad', tmp_path) == 1
### run_osm2pgsql ### run_osm2pgsql
def test_run_osm2pgsql(osm2pgsql_options): def test_run_osm2pgsql(osm2pgsql_options):