npm.py 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. # SPDX-License-Identifier: AGPL-3.0-or-later
  2. # lint: pylint
  3. """npms.io
  4. """
  5. from urllib.parse import urlencode
  6. from dateutil import parser
  7. about = {
  8. "website": "https://npms.io/",
  9. "wikidata_id": "Q7067518",
  10. "official_api_documentation": "https://api-docs.npms.io/",
  11. "use_official_api": False,
  12. "require_api_key": False,
  13. "results": "JSON",
  14. }
  15. categories = ['it', 'packages']
  16. # engine dependent config
  17. paging = True
  18. page_size = 25
  19. search_api = "https://api.npms.io/v2/search?"
  20. def request(query: str, params):
  21. args = urlencode(
  22. {
  23. 'from': (params["pageno"] - 1) * page_size,
  24. 'q': query,
  25. 'size': page_size,
  26. }
  27. )
  28. params['url'] = search_api + args
  29. return params
  30. def response(resp):
  31. results = []
  32. content = resp.json()
  33. for entry in content["results"]:
  34. package = entry["package"]
  35. publishedDate = package.get("date")
  36. if publishedDate:
  37. publishedDate = parser.parse(publishedDate)
  38. tags = list(entry.get("flags", {}).keys()) + package.get("keywords", [])
  39. results.append(
  40. {
  41. "template": "packages.html",
  42. "url": package["links"]["npm"],
  43. "title": package["name"],
  44. 'package_name': package["name"],
  45. "content": package.get("description", ""),
  46. "version": package.get("version"),
  47. "maintainer": package.get("author", {}).get("name"),
  48. 'publishedDate': publishedDate,
  49. "tags": tags,
  50. "homepage": package["links"].get("homepage"),
  51. "source_code_url": package["links"].get("repository"),
  52. }
  53. )
  54. return results