hex.py 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. # SPDX-License-Identifier: AGPL-3.0-or-later
  2. """hex.pm"""
  3. from urllib.parse import urlencode
  4. from dateutil import parser
  5. about = {
  6. # pylint: disable=line-too-long
  7. "website": "https://hex.pm/",
  8. "wikidata_id": None,
  9. "official_api_documentation": "https://github.com/hexpm/hexpm/blob/main/lib/hexpm_web/controllers/api/package_controller.ex",
  10. "use_official_api": True,
  11. "require_api_key": False,
  12. "results": "JSON",
  13. }
  14. categories = ["it", "packages"]
  15. # engine dependent config
  16. paging = True
  17. search_url = "https://hex.pm/api/packages/"
  18. linked_terms = {
  19. # lower-case : replacement
  20. "author": "Author",
  21. "bitbucket": "Bitbucket",
  22. "bug tracker": "Issue tracker",
  23. "changelog": "Changelog",
  24. "doc": "Documentation",
  25. "docs": "Documentation",
  26. "documentation": "Documentation",
  27. "github repository": "GitHub",
  28. "github": "GitHub",
  29. "gitlab": "GitLab",
  30. "issues": "Issue tracker",
  31. "project source code": "Source code",
  32. "repository": "Source code",
  33. "scm": "Source code",
  34. "sourcehut": "SourceHut",
  35. "sources": "Source code",
  36. "sponsor": "Sponsors",
  37. "sponsors": "Sponsors",
  38. "website": "Homepage",
  39. }
  40. def request(query: str, params):
  41. args = urlencode({"page": params["pageno"], "search": query})
  42. params["url"] = f"{search_url}?{args}"
  43. return params
  44. def response(resp):
  45. results = []
  46. for package in resp.json():
  47. meta = package["meta"]
  48. published_date = package.get("updated_at")
  49. published_date = parser.parse(published_date)
  50. links = {linked_terms.get(k.lower(), k): v for k, v in meta.get("links").items()}
  51. results.append(
  52. {
  53. "template": "packages.html",
  54. "url": package["html_url"],
  55. "title": package["name"],
  56. "package_name": package["name"],
  57. "content": meta.get("description", ""),
  58. "version": meta.get("latest_version"),
  59. "maintainer": ", ".join(meta.get("maintainers", [])),
  60. "publishedDate": published_date,
  61. "license_name": ", ".join(meta.get("licenses", [])),
  62. "homepage": package["docs_html_url"],
  63. "links": links,
  64. }
  65. )
  66. return results