@@ -687,6 +687,25 @@ async def get(self, *args, **kwargs):
687687 self .finish (res )
688688
689689class MetaKGParserHandler (BaseHandler ):
690+ """
691+ Handles parsing of SmartAPI metadata from a given URL or request body.
692+
693+ This handler processes SmartAPI metadata and returns structured,
694+ cleaned results based on the specified query parameters.
695+
696+ Supported HTTP methods:
697+ - **GET**: Parses metadata from a provided URL.
698+ - **POST**: Parses metadata from the request body.
699+
700+ Query Parameters:
701+ - `url` (str, required): The URL of the SmartAPI metadata to parse.
702+ Maximum length: 1000 characters.
703+ - `api_details` (bool, optional, default: `False`):
704+ Whether to return detailed API information.
705+ - `bte` (bool, optional, default: `False`):
706+ Whether to include BTE (BioThings Explorer) specific metadata.
707+ """
708+
690709 kwargs = {
691710 "GET" : {
692711 "url" : {
@@ -713,17 +732,18 @@ def get_filtered_api(self, api_dict):
713732 """Extract and return filtered API information."""
714733 api_info = api_dict ["api" ]
715734
735+ # Convert arguments to integers for consistency
736+ bte = int (self .args .bte )
737+ api_details = int (self .args .api_details )
738+
716739 # Default structure to preserve top-level keys
717740 filtered_dict = {
718- "subject" : api_dict .get ("subject" ),
719- "object" : api_dict .get ("object" ),
720- "predicate" : api_dict .get ("predicate" ),
721- "subject_prefix" : api_dict .get ("subject_prefix" ),
722- "object_prefix" : api_dict .get ("object_prefix" ),
723- }
741+ key : api_dict .get (key )
742+ for key in ["subject" , "object" , "predicate" , "subject_prefix" , "object_prefix" ]
743+ }
724744
725- # case: bte=1, api_details=0
726- if self . args . bte == "1" and self . args . api_details == "0" :
745+ # Determine filtered API structure based on ` bte` and ` api_details`
746+ if bte == 1 and api_details == 0 :
727747 filtered_api = {
728748 ** ({"name" : api_info ["name" ]} if "name" in api_info else {}),
729749 ** (
@@ -733,18 +753,12 @@ def get_filtered_api(self, api_dict):
733753 ),
734754 "bte" : api_info .get ("bte" , {}),
735755 }
736-
737- # case: bte=0, api_details=1
738- elif self .args .bte == "0" and self .args .api_details == "1" :
739- api_info .pop ("bte" , None )
740- filtered_api = api_info
741-
742- # case: api_details=1, bte=1
743- elif self .args .bte == "1" and self .args .api_details == "1" :
744- filtered_api = api_info
745-
746- # case: bte=0, api_details=0
747- else :
756+ elif api_details == 1 :
757+ # Covers both (bte=0, api_details=1) and (bte=1, api_details=1)
758+ filtered_api = api_info .copy ()
759+ if bte == 0 :
760+ filtered_api .pop ("bte" , None )
761+ else : # bte == 0 and api_details == 0
748762 filtered_api = {
749763 ** ({"name" : api_info ["name" ]} if "name" in api_info else {}),
750764 ** (
@@ -753,15 +767,17 @@ def get_filtered_api(self, api_dict):
753767 else {}
754768 ),
755769 }
770+
756771 # Add the filtered 'api' key to the preserved top-level structure
757772 filtered_dict ["api" ] = filtered_api
758773
759- # Remove 'bte' from 'api' if it exists
774+ # Remove 'bte' from 'api' and move it to the top level
760775 if "bte" in filtered_dict ["api" ]:
761- filtered_dict [' bte' ] = filtered_dict ["api" ].pop ("bte" , None )
776+ filtered_dict [" bte" ] = filtered_dict ["api" ].pop ("bte" )
762777
763778 return filtered_dict
764779
780+
765781 def process_apis (self , apis ):
766782 """Process each API dict based on provided args."""
767783 if isinstance (apis , list ):
@@ -779,9 +795,7 @@ def process_apis(self, apis):
779795
780796 async def get (self , * args , ** kwargs ):
781797 if not self .get_argument ("url" , None ):
782- self .set_status (400 )
783- self .write ({"error" : "Missing 'url' argument" })
784- return
798+ raise HTTPError (400 , reason = "A url value is expected for the request, please provide a url." )
785799
786800 parser = MetaKGParser ()
787801 url = self .get_argument ("url" )
0 commit comments