80 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			80 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
|  | # SPDX-License-Identifier: AGPL-3.0-or-later | ||
|  | # lint: pylint | ||
|  | """metacpan
 | ||
|  | """
 | ||
|  | 
 | ||
|  | from urllib.parse import urlunparse | ||
|  | from json import dumps | ||
|  | 
 | ||
|  | # about | ||
|  | about = { | ||
|  |     "website": 'https://metacpan.org/', | ||
|  |     "wikidata_id": 'Q841507', | ||
|  |     "official_api_documentation": 'https://github.com/metacpan/metacpan-api/blob/master/docs/API-docs.md', | ||
|  |     "use_official_api": True, | ||
|  |     "require_api_key": False, | ||
|  |     "results": 'JSON', | ||
|  | } | ||
|  | 
 | ||
|  | # engine dependent config | ||
|  | number_of_results = 20  # Don't put this over 5000 | ||
|  | categories = ["it", "packages"] | ||
|  | disabled = True | ||
|  | shortcut = "cpan" | ||
|  | paging = True | ||
|  | 
 | ||
|  | query_data_template = { | ||
|  |     'query': { | ||
|  |         'multi_match': { | ||
|  |             'type': 'most_fields', | ||
|  |             'fields': ['documentation', 'documentation.*'], | ||
|  |             'analyzer': 'camelcase', | ||
|  |         } | ||
|  |     }, | ||
|  |     'filter': { | ||
|  |         'bool': { | ||
|  |             'must': [ | ||
|  |                 {'exists': {'field': 'documentation'}}, | ||
|  |                 {'term': {'status': 'latest'}}, | ||
|  |                 {'term': {'indexed': 1}}, | ||
|  |                 {'term': {'authorized': 1}}, | ||
|  |             ] | ||
|  |         } | ||
|  |     }, | ||
|  |     "sort": [ | ||
|  |         {"_score": {"order": "desc"}}, | ||
|  |         {"date": {"order": "desc"}}, | ||
|  |     ], | ||
|  |     '_source': ['documentation', "abstract"], | ||
|  |     'size': number_of_results, | ||
|  | } | ||
|  | search_url = urlunparse(["https", "fastapi.metacpan.org", "/v1/file/_search", "", "", ""]) | ||
|  | 
 | ||
|  | 
 | ||
|  | def request(query, params): | ||
|  |     params["url"] = search_url | ||
|  |     params["method"] = "POST" | ||
|  |     query_data = query_data_template | ||
|  |     query_data["query"]["multi_match"]["query"] = query | ||
|  |     query_data["from"] = (params["pageno"] - 1) * number_of_results | ||
|  |     params["data"] = dumps(query_data) | ||
|  |     return params | ||
|  | 
 | ||
|  | 
 | ||
|  | def response(resp): | ||
|  |     results = [] | ||
|  | 
 | ||
|  |     search_results = resp.json()["hits"]["hits"] | ||
|  |     for result in search_results: | ||
|  |         fields = result["_source"] | ||
|  |         module = fields["documentation"] | ||
|  |         results.append( | ||
|  |             { | ||
|  |                 "url": "https://metacpan.org/pod/" + module, | ||
|  |                 "title": module, | ||
|  |                 "content": fields.get("abstract", ""), | ||
|  |             } | ||
|  |         ) | ||
|  | 
 | ||
|  |     return results |