def extract()

in modular_api/commands_generator.py [0:0]


    def extract(self, subgroup):
        definitions = {}
        for entity in dir(self._module):
            click_command = getattr(self._module, entity)
            if not isinstance(click_command, self._Command) or \
                    click_command.name == self._group_name or \
                    isinstance(click_command, Group):
                continue
            parameters = []
            for param in click_command.params:
                required = (param.callback and param.callback.__name__
                            in REQUIRED_PARAM_CALLBACKS) or param.required
                param_help = param.help.replace('* ', '') if param.help else ''
                param_meta = {
                    'name': param.human_readable_name,
                    'alias': self._get_alias(param.opts),
                    'required': required,
                    'description': param_help,
                    'type': self.click_to_our_types_mapping.get(
                        param.type.name, param.type.name)
                }
                if isinstance(param.type, (Choice)):
                    # TODO refactor asap
                    choices = param.type.choices
                    param_meta['description'] += f' {"|".join(choices)}'
                if isinstance(param.type, (IntRange, FloatRange)):
                    # TODO update click and use get_metavar
                    param_meta['description'] += f' {param.type.min or ""}<=x<={param.type.max or ""}'
                parameters.append(param_meta)
            definitions.update({
                click_command.name: {
                    'body': {
                        'description': click_command.help,
                        'parameters': parameters,
                        'handler': entity,
                        'parent': self._group_name
                    }
                }
            })
        routes_and_secured_params = (
            self._get_api_route_flag_and_secured_params(subgroup))
        for name, body in definitions.items():
            command_config = routes_and_secured_params.get(name, {})
            files_parameters = command_config.pop('files_parameters', None)
            if files_parameters:
                command_params = body['body']['parameters']
                for param in command_params:
                    param_name = param.get('name')
                    if param_name in files_parameters:
                        param.update(files_parameters[param_name])
            body['body'].update(routes_and_secured_params.get(name, {}))

        definitions_copy = copy.deepcopy(definitions)
        for name, body in definitions.items():
            command_config = routes_and_secured_params.get(name, {})
            flag_parameters = command_config.get('flag_parameters')
            if flag_parameters:
                for idx, param in enumerate(body['body']['parameters']):
                    if param['name'] in flag_parameters:
                        definitions_copy[name]['body']['parameters'][idx][
                            'is_flag'] = True
            definitions_copy[name]['body'].pop('flag_parameters', None)
            is_command_hidden = command_config.pop('is_command_hidden', None)
            if is_command_hidden:
                definitions_copy.pop(name)
        return definitions_copy