gitea.py 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. # SPDX-License-Identifier: AGPL-3.0-or-later
  2. """Engine to search in collaborative software platforms based on Gitea_ or Forgejo_.
  3. .. _Gitea: https://about.gitea.com/
  4. .. _Forgejo: https://forgejo.org/
  5. Configuration
  6. =============
  7. The engine has the following mandatory setting:
  8. - :py:obj:`base_url`
  9. Optional settings are:
  10. - :py:obj:`sort`
  11. - :py:obj:`order`
  12. - :py:obj:`page_size`
  13. .. code:: yaml
  14. - name: gitea.com
  15. engine: gitea
  16. base_url: https://gitea.com
  17. shortcut: gitea
  18. - name: forgejo.com
  19. engine: gitea
  20. base_url: https://code.forgejo.org
  21. shortcut: forgejo
  22. If you would like to use additional instances, just configure new engines in the
  23. :ref:`settings <settings engine>` and set the ``base_url``.
  24. Implementation
  25. ==============
  26. """
  27. from urllib.parse import urlencode
  28. from dateutil import parser
  29. about = {
  30. "website": 'https://about.gitea.com',
  31. "wikidata_id": None,
  32. "official_api_documentation": 'https://docs.gitea.com/next/development/api-usage',
  33. "use_official_api": True,
  34. "require_api_key": False,
  35. "results": 'JSON',
  36. }
  37. categories = ['it', 'repos']
  38. paging = True
  39. base_url: str = ''
  40. """URL of the Gitea_ instance."""
  41. sort: str = "updated"
  42. """Sort criteria, possible values:
  43. - ``updated`` (default)
  44. - ``alpha``
  45. - ``created``
  46. - ``size``
  47. - ``id``
  48. """
  49. order = "desc"
  50. """Sort order, possible values:
  51. - ``desc`` (default)
  52. - ``asc``
  53. """
  54. page_size: int = 10
  55. """Maximum number of results per page (default 10)."""
  56. def init(_):
  57. if not base_url:
  58. raise ValueError('gitea engine: base_url is unset')
  59. def request(query, params):
  60. args = {'q': query, 'limit': page_size, 'sort': sort, 'order': order, 'page': params['pageno']}
  61. params['url'] = f"{base_url}/api/v1/repos/search?{urlencode(args)}"
  62. return params
  63. def response(resp):
  64. results = []
  65. for item in resp.json().get('data', []):
  66. content = [item.get(i) for i in ['language', 'description'] if item.get(i)]
  67. results.append(
  68. {
  69. 'template': 'packages.html',
  70. 'url': item.get('html_url'),
  71. 'title': item.get('full_name'),
  72. 'content': ' / '.join(content),
  73. # Use Repository Avatar and fall back to Owner Avatar if not set.
  74. 'thumbnail': item.get('avatar_url') or item.get('owner', {}).get('avatar_url'),
  75. 'package_name': item.get('name'),
  76. 'maintainer': item.get('owner', {}).get('username'),
  77. 'publishedDate': parser.parse(item.get("updated_at") or item.get("created_at")),
  78. 'tags': item.get('topics', []),
  79. 'popularity': item.get('stars_count'),
  80. 'homepage': item.get('website'),
  81. 'source_code_url': item.get('clone_url'),
  82. }
  83. )
  84. return results