nodes: 0, module; 1, function_definition; 2, function_name:build_listing; 3, parameters; 4, block; 5, identifier:self; 6, expression_statement; 7, function_definition; 8, expression_statement; 9, return_statement; 10, comment:"""
          Builds a listing of all functions sorted A-Z, with their names and descriptions
          """; 11, function_name:func_entry; 12, parameters; 13, block; 14, assignment; 15, call; 16, identifier:name; 17, identifier:func; 18, expression_statement; 19, comment:# add regular arguments; 20, expression_statement; 21, comment:# add possible variable argument; 22, if_statement; 23, return_statement; 24, identifier:listing; 25, list_comprehension; 26, identifier:sorted; 27, argument_list; 28, assignment; 29, assignment; 30, identifier:varargs; 31, block; 32, dictionary; 33, call; 34, for_in_clause; 35, identifier:listing; 36, keyword_argument; 37, pattern_list; 38, call; 39, identifier:params; 40, list_comprehension; 41, expression_statement; 42, pair; 43, pair; 44, pair; 45, identifier:func_entry; 46, argument_list; 47, pattern_list; 48, call; 49, identifier:key; 50, lambda; 51, identifier:args; 52, identifier:varargs; 53, identifier:defaults; 54, attribute; 55, argument_list; 56, dictionary; 57, for_in_clause; 58, if_clause; 59, augmented_assignment; 60, string; 61, call; 62, string; 63, call; 64, string; 65, identifier:params; 66, identifier:f_name; 67, identifier:f; 68, identifier:f_name; 69, identifier:f; 70, attribute; 71, argument_list; 72, lambda_parameters; 73, subscript; 74, identifier:self; 75, identifier:_get_arg_spec; 76, identifier:func; 77, pair; 78, pair; 79, pair; 80, identifier:a; 81, identifier:args; 82, comparison_operator:a != 'ctx'; 83, identifier:params; 84, list; 85, string_content:name; 86, identifier:str; 87, argument_list; 88, string_content:description; 89, attribute; 90, argument_list; 91, string_content:params; 92, attribute; 93, identifier:items; 94, identifier:l; 95, identifier:l; 96, string; 97, string; 98, call; 99, string; 100, comparison_operator:a in defaults; 101, string; 102, False; 103, identifier:a; 104, string; 105, dictionary; 106, call; 107, call; 108, identifier:strip; 109, identifier:self; 110, identifier:_functions; 111, string_content:name; 112, string_content:name; 113, identifier:str; 114, argument_list; 115, string_content:optional; 116, identifier:a; 117, identifier:defaults; 118, string_content:vararg; 119, string_content:ctx; 120, pair; 121, pair; 122, pair; 123, attribute; 124, argument_list; 125, identifier:str; 126, argument_list; 127, identifier:a; 128, string; 129, call; 130, string; 131, False; 132, string; 133, True; 134, identifier:name; 135, identifier:upper; 136, attribute; 137, string_content:name; 138, identifier:str; 139, argument_list; 140, string_content:optional; 141, string_content:vararg; 142, identifier:func; 143, identifier:__doc__; 144, identifier:varargs
code: def build_listing(self):
          """
          Builds a listing of all functions sorted A-Z, with their names and descriptions
          """
          def func_entry(name, func):
              args, varargs, defaults = self._get_arg_spec(func)
  
              # add regular arguments
              params = [{'name': str(a), 'optional': a in defaults, 'vararg': False} for a in args if a != 'ctx']
  
              # add possible variable argument
              if varargs:
                  params += [{'name': str(varargs), 'optional': False, 'vararg': True}]
  
              return {'name': str(name.upper()),
                      'description': str(func.__doc__).strip(),
                      'params': params}
  
          listing = [func_entry(f_name, f) for f_name, f in self._functions.items()]
          return sorted(listing, key=lambda l: l['name'])