Skip to content

Commit

Permalink
Ajoute une sous-commande pour rechercher dans les contenus (#6)
Browse files Browse the repository at this point in the history
  • Loading branch information
Guts authored Dec 21, 2022
2 parents ce98858 + e203e31 commit bf37993
Show file tree
Hide file tree
Showing 4 changed files with 178 additions and 6 deletions.
15 changes: 14 additions & 1 deletion geotribu_cli/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
__uri_homepage__,
__version__,
)
from geotribu_cli.subcommands.search_content import parser_search_content
from geotribu_cli.subcommands.search_image import parser_search_image

RawDescriptionRichHelpFormatter.usage_markup = True
Expand Down Expand Up @@ -76,13 +77,25 @@ def main(argv: List[str] = None):
help="Affiche la version du CLI",
)

# -- PARSE PASSED ARGUMENTS --
# -- SUB-COMMANDS --
subparsers = main_parser.add_subparsers(title="Sous-commandes", dest="command")

# Search Content
subcmd_search_content = subparsers.add_parser(
"search-content",
help="Rechercher dans les contenus du site",
formatter_class=main_parser.formatter_class,
prog="search-content",
)
add_common_arguments(subcmd_search_content)
parser_search_content(subcmd_search_content)

# Search Image
subcmd_search_image = subparsers.add_parser(
"search-image",
help="Rechercher dans les images du CDN",
formatter_class=main_parser.formatter_class,
prog="search-image",
)
add_common_arguments(subcmd_search_image)
parser_search_image(subcmd_search_image)
Expand Down
12 changes: 11 additions & 1 deletion geotribu_cli/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@ class GeotribuDefaults:
# website
site_base_url: str = "https://static.geotribu.fr/"
site_git_project: str = "website"
# cdn
site_search_index: str = "search/search_index.json"
# website
cdn_base_url: str = "https://cdn.geotribu.fr/"
cdn_base_path: str = "img"
cdn_search_index: str = "search-index.json"
Expand All @@ -32,6 +33,15 @@ def cdn_search_index_full_url(self) -> str:
"""
return f"{self.cdn_base_url}{self.cdn_base_path}/{self.cdn_search_index}"

@property
def site_search_index_full_url(self) -> str:
"""Returns website search index full URL.
Returns:
str: URL as string
"""
return f"{self.site_base_url}{self.site_search_index}"


# -- Stand alone execution
if __name__ == "__main__":
Expand Down
153 changes: 153 additions & 0 deletions geotribu_cli/subcommands/search_content.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,153 @@
#! python3 # noqa: E265

# ############################################################################
# ########## IMPORTS #############
# ################################

# standard library
import argparse
import json
import logging
import sys
from pathlib import Path

# 3rd party
from lunr.index import Index

# package
from geotribu_cli.constants import GeotribuDefaults
from geotribu_cli.utils.file_downloader import download_remote_file_to_local
from geotribu_cli.utils.formatters import convert_octets

# ############################################################################
# ########## GLOBALS #############
# ################################

logger = logging.getLogger(__name__)
defaults_settings = GeotribuDefaults()

# ############################################################################
# ########## CLI #################
# ################################


def parser_search_content(
subparser: argparse.ArgumentParser,
) -> argparse.ArgumentParser:
"""Set the argument parser for search-content subcommand.
Args:
subparser (argparse.ArgumentParser): parser to set up
Returns:
argparse.ArgumentParser: parser ready to use
"""

subparser.add_argument(
"search_term",
help="Terme de recherche.",
type=str,
metavar="search-term",
)

subparser.add_argument(
"--remote-index-file",
help="Emplacement du fichier distant.",
default=defaults_settings.site_search_index_full_url,
type=str,
dest="remote_index_file",
)

subparser.add_argument(
"--local-index-file",
help="Emplacement du fichier local.",
default=Path().home() / ".geotribu/search/site_search_index.json",
type=Path,
dest="local_index_file",
)

subparser.add_argument(
"--filter-type",
choices=["article", "rdp"],
default=None,
help="Filtrer sur un type de contenu en particulier.",
)

subparser.add_argument(
"--expiration-rotating-hours",
help="Nombre d'heures à partir de quand considérer le fichier local comme périmé.",
default=24,
type=int,
dest="expiration_rotating_hours",
)

subparser.set_defaults(func=run)

return subparser


# ############################################################################
# ########## MAIN ################
# ################################


def run(args):
"""Run the sub command logic.
Args:
args (_type_): _description_
"""
print(f"Running {args.command} with {args}")

args.local_index_file.parent.mkdir(parents=True, exist_ok=True)

# get local search index
get_or_update_local_search_index = download_remote_file_to_local(
url_index_to_download=args.remote_index_file,
local_file_path=args.local_index_file,
expiration_rotating_hours=args.expiration_rotating_hours,
)
if not isinstance(get_or_update_local_search_index, Path):
logger.error(
f"Le téléchargement du fichier distant {args.remote_index_file} "
f"ou la récupération du fichier local {args.local_index_file} a échoué."
)
if isinstance(get_or_update_local_search_index, Exception):
logger.error(get_or_update_local_search_index)
sys.exit()
logger.info(
f"Local index file: {args.local_index_file}, "
f"{convert_octets(args.local_index_file.stat().st_size)}"
)

# load the local index file
if not args.local_index_file.exists():
logger.error(f"{args.local_index_file.resolve()} does not exist")
sys.exit(f"{args.local_index_file.resolve()} does not exist")
# loads it
with args.local_index_file.open("r") as fd:
serialized_idx = json.loads(fd.read())

# charge l'index sérialisé
idx = Index.load(serialized_idx.get("index"))
images_dict = serialized_idx.get("images")

# recherche
search_results: list[dict] = idx.search(f"*{args.search_term}*")

for search_result in search_results:
mapped_img = images_dict.get(search_result.get("ref"))
search_result.update(
{
"full_url": f"{defaults_settings.cdn_base_url}"
f"{defaults_settings.cdn_base_path}/"
f"{search_result.get('ref')}",
}
)

print(search_results)


# -- Stand alone execution
if __name__ == "__main__":
pass
4 changes: 0 additions & 4 deletions geotribu_cli/subcommands/search_image.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,7 @@
import json
import logging
import sys
from datetime import datetime, timedelta
from pathlib import Path
from typing import List
from urllib.error import HTTPError, URLError
from urllib.request import Request, urlopen

# 3rd party
from lunr.index import Index
Expand Down

0 comments on commit bf37993

Please sign in to comment.