71 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			71 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
|  | # 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 |