Lines Matching refs:self

164     def __init__(self, fixer_names, options=None, explicit=None):
172 self.fixers = fixer_names
173 self.explicit = explicit or []
174 self.options = self._default_options.copy()
176 self.options.update(options)
177 self.grammar = pygram.python_grammar.copy()
179 if self.options['print_function']:
180 del self.grammar.keywords["print"]
181 elif self.options['exec_function']:
182 del self.grammar.keywords["exec"]
187 self.write_unchanged_files = self.options.get("write_unchanged_files")
188 self.errors = []
189 self.logger = logging.getLogger("RefactoringTool")
190 self.fixer_log = []
191 self.wrote = False
192 self.driver = driver.Driver(self.grammar,
194 logger=self.logger)
195 self.pre_order, self.post_order = self.get_fixers()
198 self.files = [] # List of files that were or should be modified
200 self.BM = bm.BottomMatcher()
201 self.bmi_pre_order = [] # Bottom Matcher incompatible fixers
202 self.bmi_post_order = []
204 for fixer in chain(self.post_order, self.pre_order):
206 self.BM.add_fixer(fixer)
209 elif fixer in self.pre_order:
210 self.bmi_pre_order.append(fixer)
211 elif fixer in self.post_order:
212 self.bmi_post_order.append(fixer)
214 self.bmi_pre_order_heads = _get_headnode_dict(self.bmi_pre_order)
215 self.bmi_post_order_heads = _get_headnode_dict(self.bmi_post_order)
219 def get_fixers(self):
229 for fix_mod_path in self.fixers:
232 if fix_name.startswith(self.FILE_PREFIX):
233 fix_name = fix_name[len(self.FILE_PREFIX):]
235 class_name = self.CLASS_PREFIX + "".join([p.title() for p in parts])
240 fixer = fix_class(self.options, self.fixer_log)
241 if fixer.explicit and self.explicit is not True and \
242 fix_mod_path not in self.explicit:
243 self.log_message("Skipping optional fixer: %s", fix_name)
246 self.log_debug("Adding transformation: %s", fix_name)
259 def log_error(self, msg, *args, **kwds):
263 def log_message(self, msg, *args):
267 self.logger.info(msg)
269 def log_debug(self, msg, *args):
272 self.logger.debug(msg)
274 def print_output(self, old_text, new_text, filename, equal):
279 def refactor(self, items, write=False, doctests_only=False):
284 self.refactor_dir(dir_or_file, write, doctests_only)
286 self.refactor_file(dir_or_file, write, doctests_only)
288 def refactor_dir(self, dir_name, write=False, doctests_only=False):
297 self.log_debug("Descending into %s", dirpath)
304 self.refactor_file(fullname, write, doctests_only)
308 def _read_python_source(self, filename):
315 self.log_error("Can't open %s: %s", filename, err)
324 def refactor_file(self, filename, write=False, doctests_only=False):
326 input, encoding = self._read_python_source(filename)
332 self.log_debug("Refactoring doctests in %s", filename)
333 output = self.refactor_docstring(input, filename)
334 if self.write_unchanged_files or output != input:
335 self.processed_file(output, filename, input, write, encoding)
337 self.log_debug("No doctest changes in %s", filename)
339 tree = self.refactor_string(input, filename)
340 if self.write_unchanged_files or (tree and tree.was_changed):
342 self.processed_file(str(tree)[:-1], filename,
345 self.log_debug("No changes in %s", filename)
347 def refactor_string(self, data, name):
360 self.driver.grammar = pygram.python_grammar_no_print_statement
362 tree = self.driver.parse_string(data)
364 self.log_error("Can't parse %s: %s: %s",
368 self.driver.grammar = self.grammar
370 self.log_debug("Refactoring %s", name)
371 self.refactor_tree(tree, name)
374 def refactor_stdin(self, doctests_only=False):
377 self.log_debug("Refactoring doctests in stdin")
378 output = self.refactor_docstring(input, "<stdin>")
379 if self.write_unchanged_files or output != input:
380 self.processed_file(output, "<stdin>", input)
382 self.log_debug("No doctest changes in stdin")
384 tree = self.refactor_string(input, "<stdin>")
385 if self.write_unchanged_files or (tree and tree.was_changed):
386 self.processed_file(str(tree), "<stdin>", input)
388 self.log_debug("No changes in stdin")
390 def refactor_tree(self, tree, name):
406 for fixer in chain(self.pre_order, self.post_order):
410 self.traverse_by(self.bmi_pre_order_heads, tree.pre_order())
411 self.traverse_by(self.bmi_post_order_heads, tree.post_order())
414 match_set = self.BM.run(tree.leaves())
417 for fixer in self.BM.fixers:
458 new_matches = self.BM.run(new.leaves())
465 for fixer in chain(self.pre_order, self.post_order):
469 def traverse_by(self, fixers, traversal):
492 def processed_file(self, new_text, filename, old_text=None, write=False,
497 self.files.append(filename)
499 old_text = self._read_python_source(filename)[0]
503 self.print_output(old_text, new_text, filename, equal)
505 self.log_debug("No changes to %s", filename)
506 if not self.write_unchanged_files:
509 self.write_file(new_text, filename, old_text, encoding)
511 self.log_debug("Not writing changes to %s", filename)
513 def write_file(self, new_text, filename, old_text, encoding=None):
523 self.log_error("Can't create %s: %s", filename, err)
530 self.log_error("Can't write %s: %s", filename, err)
531 self.log_debug("Wrote changes to %s", filename)
532 self.wrote = True
537 def refactor_docstring(self, input, filename):
556 if line.lstrip().startswith(self.PS1):
558 result.extend(self.refactor_doctest(block, block_lineno,
562 i = line.find(self.PS1)
565 (line.startswith(indent + self.PS2) or
566 line == indent + self.PS2.rstrip() + "\n")):
570 result.extend(self.refactor_doctest(block, block_lineno,
576 result.extend(self.refactor_doctest(block, block_lineno,
580 def refactor_doctest(self, block, lineno, indent, filename):
589 tree = self.parse_block(block, lineno, indent)
591 if self.logger.isEnabledFor(logging.DEBUG):
593 self.log_debug("Source: %s", line.rstrip("\n"))
594 self.log_error("Can't parse docstring in %s line %s: %s: %s",
597 if self.refactor_tree(tree, filename):
604 block = [indent + self.PS1 + new.pop(0)]
606 block += [indent + self.PS2 + line for line in new]
609 def summarize(self):
610 if self.wrote:
614 if not self.files:
615 self.log_message("No files %s modified.", were)
617 self.log_message("Files that %s modified:", were)
618 for file in self.files:
619 self.log_message(file)
620 if self.fixer_log:
621 self.log_message("Warnings/messages while refactoring:")
622 for message in self.fixer_log:
623 self.log_message(message)
624 if self.errors:
625 if len(self.errors) == 1:
626 self.log_message("There was 1 error:")
628 self.log_message("There were %d errors:", len(self.errors))
629 for msg, args, kwds in self.errors:
630 self.log_message(msg, *args, **kwds)
632 def parse_block(self, block, lineno, indent):
638 tree = self.driver.parse_tokens(self.wrap_toks(block, lineno, indent))
642 def wrap_toks(self, block, lineno, indent):
644 tokens = tokenize.generate_tokens(self.gen_lines(block, indent).__next__)
656 def gen_lines(self, block, indent):
659 This strips the first len(indent + self.PS1) characters off each line.
661 prefix1 = indent + self.PS1
662 prefix2 = indent + self.PS2
682 def __init__(self, *args, **kwargs):
683 super(MultiprocessRefactoringTool, self).__init__(*args, **kwargs)
684 self.queue = None
685 self.output_lock = None
687 def refactor(self, items, write=False, doctests_only=False,
690 return super(MultiprocessRefactoringTool, self).refactor(
696 if self.queue is not None:
698 self.queue = multiprocessing.JoinableQueue()
699 self.output_lock = multiprocessing.Lock()
700 processes = [multiprocessing.Process(target=self._child)
705 super(MultiprocessRefactoringTool, self).refactor(items, write,
708 self.queue.join()
710 self.queue.put(None)
714 self.queue = None
716 def _child(self):
717 task = self.queue.get()
721 super(MultiprocessRefactoringTool, self).refactor_file(
724 self.queue.task_done()
725 task = self.queue.get()
727 def refactor_file(self, *args, **kwargs):
728 if self.queue is not None:
729 self.queue.put((args, kwargs))
731 return super(MultiprocessRefactoringTool, self).refactor_file(