gitea.py 2.5 KB

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