class_docstr: A list of files built by on exploring the filesystem and filtered by
  applying various patterns to what we find there.
  
  Instance attributes:
    dir
      directory from which files will be taken -- only used if
      'allfiles' not supplied to constructor
    files
      list of filenames currently being built/filtered/manipulated
    allfiles
      complete list of files under consideration (ie. without any
      filtering applied)
class_docstr_tok: ["A","list","of","files","built","by","on","exploring","the","filesystem","and","filtered","by","applying","various","patterns","to","what","we","find","there",".","Instance","attributes",":","dir","directory","from","which","files","will","be","taken","--","only","used","if","'allfiles","'","not","supplied","to","constructor","files","list","of","filenames","currently","being","built\/filtered\/manipulated","allfiles","complete","list","of","files","under","consideration","(","ie",".","without","any","filtering","applied",")"]
code: def process_template_line(self, line):  # noqa: C901
      # Parse the line: split it up, make sure the right number of words
      # is there, and return the relevant words.  'action' is always
      # defined: it's the first word of the line.  Which of the other
      # three are defined depends on the action; it'll be either
      # patterns, (dir and patterns), or (dir_pattern).
      (action, patterns, dir, dir_pattern) = self._parse_template_line(
          line
      )
  
      # OK, now we know that the action is valid and we have the
      # right number of words on the line for that action -- so we
      # can proceed with minimal error-checking.
      if action == "include":
          self.debug_print("include " + " ".join(patterns))
          for pattern in patterns:
              if not self.include_pattern(pattern, anchor=1):
                  log.warning(
                      "warning: no files found matching '%s'", pattern
                  )
  
      elif action == "exclude":
          self.debug_print("exclude " + " ".join(patterns))
          for pattern in patterns:
              if not self.exclude_pattern(pattern, anchor=1):
                  log.warning(
                      (
                          "warning: no previously-included files "
                          "found matching '%s'"
                      ),
                      pattern,
                  )
  
      elif action == "global-include":
          self.debug_print("global-include " + " ".join(patterns))
          for pattern in patterns:
              if not self.include_pattern(pattern, anchor=0):
                  log.warning(
                      (
                          "warning: no files found matching '%s' "
                          "anywhere in distribution"
                      ),
                      pattern,
                  )
  
      elif action == "global-exclude":
          self.debug_print("global-exclude " + " ".join(patterns))
          for pattern in patterns:
              if not self.exclude_pattern(pattern, anchor=0):
                  log.warning(
                      (
                          "warning: no previously-included files matching "
                          "'%s' found anywhere in distribution"
                      ),
                      pattern,
                  )
  
      elif action == "recursive-include":
          self.debug_print(
              "recursive-include {} {}".format(dir, " ".join(patterns))
          )
          for pattern in patterns:
              if not self.include_pattern(pattern, prefix=dir):
                  msg = (
                      "warning: no files found matching '%s' "
                      "under directory '%s'"
                  )
                  log.warning(msg, pattern, dir)
  
      elif action == "recursive-exclude":
          self.debug_print(
              "recursive-exclude {} {}".format(dir, " ".join(patterns))
          )
          for pattern in patterns:
              if not self.exclude_pattern(pattern, prefix=dir):
                  log.warning(
                      (
                          "warning: no previously-included files matching "
                          "'%s' found under directory '%s'"
                      ),
                      pattern,
                      dir,
                  )
  
      elif action == "graft":
          self.debug_print("graft " + dir_pattern)
          if not self.include_pattern(None, prefix=dir_pattern):
              log.warning(
                  "warning: no directories found matching '%s'",
                  dir_pattern,
              )
  
      elif action == "prune":
          self.debug_print("prune " + dir_pattern)
          if not self.exclude_pattern(None, prefix=dir_pattern):
              log.warning(
                  (
                      "no previously-included directories found "
                      "matching '%s'"
                  ),
                  dir_pattern,
              )
      else:
          raise DistutilsInternalError(
              "this cannot happen: invalid action '%s'" % action
          )
  
imports: import os
  import re
  import fnmatch
  import functools
  from .util import convert_path
  from .errors import DistutilsTemplateError, DistutilsInternalError
  from ._log import log
label_desc: Use image node_id 10 for calling the FileList obj's underlying member method code with example usage: obj.process_template_line(line) without return types