| 
							
							# SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						
						
						
						
							 | 
							
							"""Cargo search on crates.io"""
 | 
						
						
						
						
							 | 
							
							
 | 
						
						
						
						
							 | 
							
							from collections import OrderedDict
 | 
						
						
						
						
							 | 
							
							from urllib.parse import urlencode
 | 
						
						
						
						
							 | 
							
							
 | 
						
						
						
						
							 | 
							
							from dateutil import parser
 | 
						
						
						
						
							 | 
							
							
 | 
						
						
						
						
							 | 
							
							about = {
 | 
						
						
						
						
							 | 
							
							    "website": "https://crates.io/",
 | 
						
						
						
						
							 | 
							
							    "wikidata_id": None,
 | 
						
						
						
						
							 | 
							
							    "official_api_documentation": "https://crates.io/data-access",
 | 
						
						
						
						
							 | 
							
							    "use_official_api": True,
 | 
						
						
						
						
							 | 
							
							    "require_api_key": False,
 | 
						
						
						
						
							 | 
							
							    "results": "JSON",
 | 
						
						
						
						
							 | 
							
							}
 | 
						
						
						
						
							 | 
							
							
 | 
						
						
						
						
							 | 
							
							categories = ["it", "packages", "cargo"]
 | 
						
						
						
						
							 | 
							
							
 | 
						
						
						
						
							 | 
							
							
 | 
						
						
						
						
							 | 
							
							# engine dependent config
 | 
						
						
						
						
							 | 
							
							paging = True
 | 
						
						
						
						
							 | 
							
							page_size = 10
 | 
						
						
						
						
							 | 
							
							search_url = "https://crates.io/api/v1/crates"
 | 
						
						
						
						
							 | 
							
							
 | 
						
						
						
						
							 | 
							
							linked_terms = OrderedDict(
 | 
						
						
						
						
							 | 
							
							    [
 | 
						
						
						
						
							 | 
							
							        ("homepage", "Project homepage"),
 | 
						
						
						
						
							 | 
							
							        ("documentation", "Documentation"),
 | 
						
						
						
						
							 | 
							
							        ("repository", "Source code"),
 | 
						
						
						
						
							 | 
							
							    ]
 | 
						
						
						
						
							 | 
							
							)
 | 
						
						
						
						
							 | 
							
							
 | 
						
						
						
						
							 | 
							
							
 | 
						
						
						
						
							 | 
							
							def request(query: str, params):
 | 
						
						
						
						
							 | 
							
							
 | 
						
						
						
						
							 | 
							
							    args = urlencode({"page": params["pageno"], "q": query, "per_page": page_size})
 | 
						
						
						
						
							 | 
							
							    params["url"] = f"{search_url}?{args}"
 | 
						
						
						
						
							 | 
							
							    return params
 | 
						
						
						
						
							 | 
							
							
 | 
						
						
						
						
							 | 
							
							
 | 
						
						
						
						
							 | 
							
							def response(resp):
 | 
						
						
						
						
							 | 
							
							    results = []
 | 
						
						
						
						
							 | 
							
							
 | 
						
						
						
						
							 | 
							
							    for package in resp.json()["crates"]:
 | 
						
						
						
						
							 | 
							
							
 | 
						
						
						
						
							 | 
							
							        published_date = package.get("updated_at")
 | 
						
						
						
						
							 | 
							
							        published_date = parser.parse(published_date)
 | 
						
						
						
						
							 | 
							
							
 | 
						
						
						
						
							 | 
							
							        links = {}
 | 
						
						
						
						
							 | 
							
							        for k, v in linked_terms.items():
 | 
						
						
						
						
							 | 
							
							            l = package.get(k)
 | 
						
						
						
						
							 | 
							
							            if l:
 | 
						
						
						
						
							 | 
							
							                links[v] = l
 | 
						
						
						
						
							 | 
							
							
 | 
						
						
						
						
							 | 
							
							        results.append(
 | 
						
						
						
						
							 | 
							
							            {
 | 
						
						
						
						
							 | 
							
							                "template": "packages.html",
 | 
						
						
						
						
							 | 
							
							                "url": f'https://crates.io/crates/{package["name"]}',
 | 
						
						
						
						
							 | 
							
							                "title": package["name"],
 | 
						
						
						
						
							 | 
							
							                "package_name": package["name"],
 | 
						
						
						
						
							 | 
							
							                "tags": package["keywords"],
 | 
						
						
						
						
							 | 
							
							                "content": package["description"],
 | 
						
						
						
						
							 | 
							
							                "version": package["newest_version"] or package["max_version"] or package["max_stable_version"],
 | 
						
						
						
						
							 | 
							
							                "publishedDate": published_date,
 | 
						
						
						
						
							 | 
							
							                "links": links,
 | 
						
						
						
						
							 | 
							
							            }
 | 
						
						
						
						
							 | 
							
							        )
 | 
						
						
						
						
							 | 
							
							
 | 
						
						
						
						
							 | 
							
							    return results
 |