pylint-1.1.0/0000775000175000017500000000000012255772544012527 5ustar sytsyt00000000000000pylint-1.1.0/COPYING0000664000175000017500000004310512031346026013545 0ustar sytsyt00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. pylint-1.1.0/epylint.py0000775000175000017500000001524412255662236014572 0ustar sytsyt00000000000000# -*- coding: utf-8; mode: python; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- vim:fenc=utf-8:ft=python:et:sw=4:ts=4:sts=4 # Copyright (c) 2003-2013 LOGILAB S.A. (Paris, FRANCE). # http://www.logilab.fr/ -- mailto:contact@logilab.fr # # This program is free software; you can redistribute it and/or modify it under # the terms of the GNU General Public License as published by the Free Software # Foundation; either version 2 of the License, or (at your option) any later # version. # # This program is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details # # You should have received a copy of the GNU General Public License along with # this program; if not, write to the Free Software Foundation, Inc., # 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. """Emacs and Flymake compatible Pylint. This script is for integration with emacs and is compatible with flymake mode. epylint walks out of python packages before invoking pylint. This avoids reporting import errors that occur when a module within a package uses the absolute import path to get another module within this package. For example: - Suppose a package is structured as a/__init__.py a/b/x.py a/c/y.py - Then if y.py imports x as "from a.b import x" the following produces pylint errors cd a/c; pylint y.py - The following obviously doesn't pylint a/c/y.py - As this script will be invoked by emacs within the directory of the file we are checking we need to go out of it to avoid these false positives. You may also use py_run to run pylint with desired options and get back (or not) its output. """ import sys, os, re import os.path as osp from subprocess import Popen, PIPE def lint(filename, options=None): """Pylint the given file. When run from emacs we will be in the directory of a file, and passed its filename. If this file is part of a package and is trying to import other modules from within its own package or another package rooted in a directory below it, pylint will classify it as a failed import. To get around this, we traverse down the directory tree to find the root of the package this module is in. We then invoke pylint from this directory. Finally, we must correct the filenames in the output generated by pylint so Emacs doesn't become confused (it will expect just the original filename, while pylint may extend it with extra directories if we've traversed down the tree) """ # traverse downwards until we are out of a python package full_path = osp.abspath(filename) parent_path = osp.dirname(full_path) child_path = osp.basename(full_path) while parent_path != "/" and osp.exists(osp.join(parent_path, '__init__.py')): child_path = osp.join(osp.basename(parent_path), child_path) parent_path = osp.dirname(parent_path) # Start pylint # Ensure we use the python and pylint associated with the running epylint from pylint import lint as lint_mod lint_path = lint_mod.__file__ options = options or ['--disable=C,R,I'] cmd = [sys.executable, lint_path] + options + ['--msg-template', '{path}:{line}: [{symbol}, {obj}] {msg}', '-r', 'n', child_path] process = Popen(cmd, stdout=PIPE, cwd=parent_path, universal_newlines=True) # The parseable line format is '%(path)s:%(line)s: [%(sigle)s%(obj)s] %(msg)s' # NOTE: This would be cleaner if we added an Emacs reporter to pylint.reporters.text .. regex = re.compile(r"\[(?P[WE])(?P.*?)\]") def _replacement(match_object): "Alter to include 'Error' or 'Warning'" if match_object.group("type") == "W": replacement = "Warning" else: replacement = "Error" # replace as "Warning (W0511, funcName): Warning Text" return "%s (%s%s):" % (replacement, match_object.group("type"), match_object.group("remainder")) for line in process.stdout: # remove pylintrc warning if line.startswith("No config file found"): continue line = regex.sub(_replacement, line, 1) # modify the file name thats output to reverse the path traversal we made parts = line.split(":") if parts and parts[0] == child_path: line = ":".join([filename] + parts[1:]) print line, process.wait() return process.returncode def py_run(command_options='', return_std=False, stdout=None, stderr=None, script='epylint'): """Run pylint from python ``command_options`` is a string containing ``pylint`` command line options; ``return_std`` (boolean) indicates return of created standart output and error (see below); ``stdout`` and ``stderr`` are 'file-like' objects in which standart output could be written. Calling agent is responsible for stdout/err management (creation, close). Default standart output and error are those from sys, or standalone ones (``subprocess.PIPE``) are used if they are not set and ``return_std``. If ``return_std`` is set to ``True``, this function returns a 2-uple containing standart output and error related to created process, as follows: ``(stdout, stderr)``. A trivial usage could be as follows: >>> py_run( '--version') No config file found, using default configuration pylint 0.18.1, ... To silently run Pylint on a module, and get its standart output and error: >>> (pylint_stdout, pylint_stderr) = py_run( 'module_name.py', True) """ # Create command line to call pylint if os.name == 'nt': script += '.bat' command_line = script + ' ' + command_options # Providing standart output and/or error if not set if stdout is None: if return_std: stdout = PIPE else: stdout = sys.stdout if stderr is None: if return_std: stderr = PIPE else: stderr = sys.stderr # Call pylint in a subprocess p = Popen(command_line, shell=True, stdout=stdout, stderr=stderr, universal_newlines=True) p.wait() # Return standart output and error if return_std: return (p.stdout, p.stderr) def Run(): if len(sys.argv) == 1: print "Usage: %s [options]" % sys.argv[0] sys.exit(1) elif not osp.exists(sys.argv[1]): print "%s does not exist" % sys.argv[1] sys.exit(1) else: sys.exit(lint(sys.argv[1], sys.argv[1:])) if __name__ == '__main__': Run() pylint-1.1.0/setup.py0000664000175000017500000001570412255665077014252 0ustar sytsyt00000000000000#!/usr/bin/env python # -*- coding: utf-8 -*- # pylint: disable=W0404,W0622,W0704,W0613 # copyright 2003-2013 LOGILAB S.A. (Paris, FRANCE), all rights reserved. # contact http://www.logilab.fr/ -- mailto:contact@logilab.fr # # This file is part of pylint. # # pylint is free software: you can redistribute it and/or modify it under # the terms of the GNU Lesser General Public License as published by the Free # Software Foundation, either version 2.1 of the License, or (at your option) any # later version. # # pylint is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS # FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more # details. # # You should have received a copy of the GNU Lesser General Public License along # with pylint. If not, see . """Generic Setup script, takes package info from __pkginfo__.py file. """ __docformat__ = "restructuredtext en" import os import sys import shutil from os.path import isdir, exists, join try: if os.environ.get('NO_SETUPTOOLS'): raise ImportError() from setuptools import setup from setuptools.command import install_lib USE_SETUPTOOLS = 1 except ImportError: from distutils.core import setup from distutils.command import install_lib USE_SETUPTOOLS = 0 try: # pylint: disable=no-name-in-module # python3 from distutils.command.build_py import build_py_2to3 as build_py except ImportError: # pylint: disable=no-name-in-module # python2.x from distutils.command.build_py import build_py sys.modules.pop('__pkginfo__', None) # import optional features __pkginfo__ = __import__("__pkginfo__") # import required features from __pkginfo__ import modname, version, license, description, \ web, author, author_email distname = getattr(__pkginfo__, 'distname', modname) scripts = getattr(__pkginfo__, 'scripts', []) data_files = getattr(__pkginfo__, 'data_files', None) subpackage_of = getattr(__pkginfo__, 'subpackage_of', None) include_dirs = getattr(__pkginfo__, 'include_dirs', []) ext_modules = getattr(__pkginfo__, 'ext_modules', None) install_requires = getattr(__pkginfo__, 'install_requires', None) dependency_links = getattr(__pkginfo__, 'dependency_links', []) STD_BLACKLIST = ('CVS', '.svn', '.hg', 'debian', 'dist', 'build') IGNORED_EXTENSIONS = ('.pyc', '.pyo', '.elc', '~') if exists('README'): long_description = open('README').read() else: long_description = '' def ensure_scripts(linux_scripts): """Creates the proper script names required for each platform (taken from 4Suite) """ from distutils import util if util.get_platform()[:3] == 'win': return linux_scripts + [script + '.bat' for script in linux_scripts] return linux_scripts def get_packages(directory, prefix): """return a list of subpackages for the given directory""" result = [] for package in os.listdir(directory): absfile = join(directory, package) if isdir(absfile): if exists(join(absfile, '__init__.py')): if prefix: result.append('%s.%s' % (prefix, package)) else: result.append(package) result += get_packages(absfile, result[-1]) return result EMPTY_FILE = '''"""generated file, don't modify or your data will be lost""" try: __import__('pkg_resources').declare_namespace(__name__) except ImportError: pass ''' class MyInstallLib(install_lib.install_lib): """extend install_lib command to handle package __init__.py and include_dirs variable if necessary """ def run(self): """overridden from install_lib class""" install_lib.install_lib.run(self) # create Products.__init__.py if needed if subpackage_of: product_init = join(self.install_dir, subpackage_of, '__init__.py') if not exists(product_init): self.announce('creating %s' % product_init) stream = open(product_init, 'w') stream.write(EMPTY_FILE) stream.close() # manually install included directories if any if include_dirs: if subpackage_of: base = join(subpackage_of, modname) else: base = modname for directory in include_dirs: dest = join(self.install_dir, base, directory) if sys.version_info >= (3, 0): exclude = set(('func_unknown_encoding.py', 'func_invalid_encoded_data.py')) else: exclude = set() shutil.rmtree(dest, ignore_errors=True) shutil.copytree(directory, dest, ignore=lambda dir, names: list(set(names) & exclude)) if sys.version_info >= (3, 0): # process manually python file in include_dirs (test data) # pylint: disable=no-name-in-module from distutils.util import run_2to3 print('running 2to3 on', dest) run_2to3([dest]) def install(**kwargs): """setup entry point""" if USE_SETUPTOOLS: if '--force-manifest' in sys.argv: sys.argv.remove('--force-manifest') # install-layout option was introduced in 2.5.3-1~exp1 elif sys.version_info < (2, 5, 4) and '--install-layout=deb' in sys.argv: sys.argv.remove('--install-layout=deb') if subpackage_of: package = subpackage_of + '.' + modname kwargs['package_dir'] = {package : '.'} packages = [package] + get_packages(os.getcwd(), package) if USE_SETUPTOOLS: kwargs['namespace_packages'] = [subpackage_of] else: kwargs['package_dir'] = {modname : '.'} packages = [modname] + get_packages(os.getcwd(), modname) if USE_SETUPTOOLS: if install_requires: kwargs['install_requires'] = install_requires kwargs['dependency_links'] = dependency_links kwargs['entry_points'] = {'console_scripts': [ 'pylint = pylint:run_pylint', 'pylint-gui = pylint:run_pylint_gui', 'epylint = pylint:run_epylint', 'pyreverse = pylint:run_pyreverse', 'symilar = pylint:run_symilar', ]} kwargs['packages'] = packages return setup(name=distname, version=version, license=license, description=description, long_description=long_description, author=author, author_email=author_email, url=web, scripts=ensure_scripts(scripts), data_files=data_files, ext_modules=ext_modules, cmdclass={'install_lib': MyInstallLib, 'build_py': build_py}, **kwargs) if __name__ == '__main__' : install() pylint-1.1.0/PKG-INFO0000664000175000017500000000457512255772544013637 0ustar sytsyt00000000000000Metadata-Version: 1.0 Name: pylint Version: 1.1.0 Summary: python code static checker Home-page: http://www.pylint.org Author: Logilab Author-email: python-projects@lists.logilab.org License: GPL Description: README for Pylint - http://www.pylint.org/ ========================================== Pylint is a Python source code analyzer which looks for programming errors, helps enforcing a coding standard and sniffs for some code smells (as defined in Martin Fowler's Refactoring book). Pylint has many rules enabled by default, way too much to silence them all on a minimally sized program. It's highly configurable and handle pragmas to control it from within your code. Additionally, it is possible to write plugins to add your own checks. It's a free software distributed under the GNU Public Licence. Development is hosted on bitbucket: https://bitbucket.org/logilab/pylint/ You can use the code-quality@python.org mailing list to discuss about Pylint. Subscribe at http://lists.python.org/mailman/listinfo/code-quality or read the archives at http://lists.python.org/pipermail/code-quality/ Install ------- Pylint requires the astroid (the later the better; formerly known as logilab-astng) and logilab-common (version >= 0.53) packages. * https://bitbucket.org/logilab/astroid * http://www.logilab.org/projects/common From the source distribution, extract the tarball and run :: python setup.py install You'll have to install dependencies in a similar way. For debian and rpm packages, use your usual tools according to your Linux distribution. More information about installation and available distribution format may be found in the user manual in the *doc* subdirectory. Documentation ------------- Look in the doc/ subdirectory or at http://docs.pylint.org Pylint is shipped with following additional commands: * pyreverse: an UML diagram generator * symilar: an independent similarities checker * epylint: Emacs and Flymake compatible Pylint * pylint-gui: a graphical interface Platform: UNKNOWN pylint-1.1.0/gui.py0000664000175000017500000004534712255665173013701 0ustar sytsyt00000000000000# Copyright (c) 2003-2013 LOGILAB S.A. (Paris, FRANCE). # http://www.logilab.fr/ -- mailto:contact@logilab.fr # # This program is free software; you can redistribute it and/or modify it under # the terms of the GNU General Public License as published by the Free Software # Foundation; either version 2 of the License, or (at your option) any later # version. # # This program is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details # # You should have received a copy of the GNU General Public License along with # this program; if not, write to the Free Software Foundation, Inc., # 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. """Tkinker gui for pylint""" import os import sys import re import Queue from threading import Thread from Tkinter import (Tk, Frame, Listbox, Entry, Label, Button, Scrollbar, Checkbutton, Radiobutton, IntVar, StringVar) from Tkinter import (TOP, LEFT, RIGHT, BOTTOM, END, X, Y, BOTH, SUNKEN, W, HORIZONTAL, DISABLED, NORMAL, W) from tkFileDialog import askopenfilename, askdirectory import pylint.lint from pylint.reporters.guireporter import GUIReporter HOME = os.path.expanduser('~/') HISTORY = '.pylint-gui-history' COLORS = {'(I)':'lightblue', '(C)':'blue', '(R)':'darkblue', '(W)':'black', '(E)':'darkred', '(F)':'red'} def convert_to_string(msg): """make a string representation of a message""" module_object = msg.module if msg.obj: module_object += ".%s" % msg.obj return "(%s) %s [%d]: %s" % (msg.C, module_object, msg.line, msg.msg) class BasicStream(object): ''' used in gui reporter instead of writing to stdout, it is written to this stream and saved in contents ''' def __init__(self, gui): """init""" self.curline = "" self.gui = gui self.contents = [] self.outdict = {} self.currout = None self.next_title = None def write(self, text): """write text to the stream""" if re.match('^--+$', text.strip()) or re.match('^==+$', text.strip()): if self.currout: self.outdict[self.currout].remove(self.next_title) self.outdict[self.currout].pop() self.currout = self.next_title self.outdict[self.currout] = [''] if text.strip(): self.next_title = text.strip() if text.startswith(os.linesep): self.contents.append('') if self.currout: self.outdict[self.currout].append('') self.contents[-1] += text.strip(os.linesep) if self.currout: self.outdict[self.currout][-1] += text.strip(os.linesep) if text.endswith(os.linesep) and text.strip(): self.contents.append('') if self.currout: self.outdict[self.currout].append('') def fix_contents(self): """finalize what the contents of the dict should look like before output""" for item in self.outdict: num_empty = self.outdict[item].count('') for _ in xrange(num_empty): self.outdict[item].remove('') if self.outdict[item]: self.outdict[item].pop(0) def output_contents(self): """output contents of dict to the gui, and set the rating""" self.fix_contents() self.gui.tabs = self.outdict try: self.gui.rating.set(self.outdict['Global evaluation'][0]) except: self.gui.rating.set('Error') self.gui.refresh_results_window() #reset stream variables for next run self.contents = [] self.outdict = {} self.currout = None self.next_title = None class LintGui(object): """Build and control a window to interact with pylint""" def __init__(self, root=None): """init""" self.root = root or Tk() self.root.title('Pylint') #reporter self.reporter = None #message queue for output from reporter self.msg_queue = Queue.Queue() self.msgs = [] self.visible_msgs = [] self.filenames = [] self.rating = StringVar() self.tabs = {} self.report_stream = BasicStream(self) #gui objects self.lb_messages = None self.showhistory = None self.results = None self.btnRun = None self.information_box = None self.convention_box = None self.refactor_box = None self.warning_box = None self.error_box = None self.fatal_box = None self.txtModule = None self.status = None self.msg_type_dict = None self.init_gui() def init_gui(self): """init helper""" #setting up frames top_frame = Frame(self.root) mid_frame = Frame(self.root) radio_frame = Frame(self.root) res_frame = Frame(self.root) msg_frame = Frame(self.root) check_frame = Frame(self.root) history_frame = Frame(self.root) btn_frame = Frame(self.root) rating_frame = Frame(self.root) top_frame.pack(side=TOP, fill=X) mid_frame.pack(side=TOP, fill=X) history_frame.pack(side=TOP, fill=BOTH, expand=True) radio_frame.pack(side=TOP, fill=BOTH, expand=True) rating_frame.pack(side=TOP, fill=BOTH, expand=True) res_frame.pack(side=TOP, fill=BOTH, expand=True) check_frame.pack(side=TOP, fill=BOTH, expand=True) msg_frame.pack(side=TOP, fill=BOTH, expand=True) btn_frame.pack(side=TOP, fill=X) # Binding F5 application-wide to run lint self.root.bind('', self.run_lint) #Message ListBox rightscrollbar = Scrollbar(msg_frame) rightscrollbar.pack(side=RIGHT, fill=Y) bottomscrollbar = Scrollbar(msg_frame, orient=HORIZONTAL) bottomscrollbar.pack(side=BOTTOM, fill=X) self.lb_messages = Listbox(msg_frame, yscrollcommand=rightscrollbar.set, xscrollcommand=bottomscrollbar.set, bg="white") self.lb_messages.bind("", self.show_sourcefile) self.lb_messages.pack(expand=True, fill=BOTH) rightscrollbar.config(command=self.lb_messages.yview) bottomscrollbar.config(command=self.lb_messages.xview) #History ListBoxes rightscrollbar2 = Scrollbar(history_frame) rightscrollbar2.pack(side=RIGHT, fill=Y) bottomscrollbar2 = Scrollbar(history_frame, orient=HORIZONTAL) bottomscrollbar2.pack(side=BOTTOM, fill=X) self.showhistory = Listbox(history_frame, yscrollcommand=rightscrollbar2.set, xscrollcommand=bottomscrollbar2.set, bg="white") self.showhistory.pack(expand=True, fill=BOTH) rightscrollbar2.config(command=self.showhistory.yview) bottomscrollbar2.config(command=self.showhistory.xview) self.showhistory.bind('', self.select_recent_file) self.set_history_window() #status bar self.status = Label(self.root, text="", bd=1, relief=SUNKEN, anchor=W) self.status.pack(side=BOTTOM, fill=X) #labelbl_ratingls lbl_rating_label = Label(rating_frame, text='Rating:') lbl_rating_label.pack(side=LEFT) lbl_rating = Label(rating_frame, textvariable=self.rating) lbl_rating.pack(side=LEFT) Label(mid_frame, text='Recently Used:').pack(side=LEFT) Label(top_frame, text='Module or package').pack(side=LEFT) #file textbox self.txt_module = Entry(top_frame, background='white') self.txt_module.bind('', self.run_lint) self.txt_module.pack(side=LEFT, expand=True, fill=X) #results box rightscrollbar = Scrollbar(res_frame) rightscrollbar.pack(side=RIGHT, fill=Y) bottomscrollbar = Scrollbar(res_frame, orient=HORIZONTAL) bottomscrollbar.pack(side=BOTTOM, fill=X) self.results = Listbox(res_frame, yscrollcommand=rightscrollbar.set, xscrollcommand=bottomscrollbar.set, bg="white", font="Courier") self.results.pack(expand=True, fill=BOTH, side=BOTTOM) rightscrollbar.config(command=self.results.yview) bottomscrollbar.config(command=self.results.xview) #buttons Button(top_frame, text='Open', command=self.file_open).pack(side=LEFT) Button(top_frame, text='Open Package', command=(lambda: self.file_open(package=True))).pack(side=LEFT) self.btnRun = Button(top_frame, text='Run', command=self.run_lint) self.btnRun.pack(side=LEFT) Button(btn_frame, text='Quit', command=self.quit).pack(side=BOTTOM) #radio buttons self.information_box = IntVar() self.convention_box = IntVar() self.refactor_box = IntVar() self.warning_box = IntVar() self.error_box = IntVar() self.fatal_box = IntVar() i = Checkbutton(check_frame, text="Information", fg=COLORS['(I)'], variable=self.information_box, command=self.refresh_msg_window) c = Checkbutton(check_frame, text="Convention", fg=COLORS['(C)'], variable=self.convention_box, command=self.refresh_msg_window) r = Checkbutton(check_frame, text="Refactor", fg=COLORS['(R)'], variable=self.refactor_box, command=self.refresh_msg_window) w = Checkbutton(check_frame, text="Warning", fg=COLORS['(W)'], variable=self.warning_box, command=self.refresh_msg_window) e = Checkbutton(check_frame, text="Error", fg=COLORS['(E)'], variable=self.error_box, command=self.refresh_msg_window) f = Checkbutton(check_frame, text="Fatal", fg=COLORS['(F)'], variable=self.fatal_box, command=self.refresh_msg_window) i.select() c.select() r.select() w.select() e.select() f.select() i.pack(side=LEFT) c.pack(side=LEFT) r.pack(side=LEFT) w.pack(side=LEFT) e.pack(side=LEFT) f.pack(side=LEFT) #check boxes self.box = StringVar() # XXX should be generated report = Radiobutton( radio_frame, text="Report", variable=self.box, value="Report", command=self.refresh_results_window) raw_met = Radiobutton( radio_frame, text="Raw metrics", variable=self.box, value="Raw metrics", command=self.refresh_results_window) dup = Radiobutton( radio_frame, text="Duplication", variable=self.box, value="Duplication", command=self.refresh_results_window) ext = Radiobutton( radio_frame, text="External dependencies", variable=self.box, value="External dependencies", command=self.refresh_results_window) stat = Radiobutton( radio_frame, text="Statistics by type", variable=self.box, value="Statistics by type", command=self.refresh_results_window) msg_cat = Radiobutton( radio_frame, text="Messages by category", variable=self.box, value="Messages by category", command=self.refresh_results_window) msg = Radiobutton( radio_frame, text="Messages", variable=self.box, value="Messages", command=self.refresh_results_window) source_file = Radiobutton( radio_frame, text="Source File", variable=self.box, value="Source File", command=self.refresh_results_window) report.select() report.grid(column=0, row=0, sticky=W) raw_met.grid(column=1, row=0, sticky=W) dup.grid(column=2, row=0, sticky=W) msg.grid(column=3, row=0, sticky=W) stat.grid(column=0, row=1, sticky=W) msg_cat.grid(column=1, row=1, sticky=W) ext.grid(column=2, row=1, sticky=W) source_file.grid(column=3, row=1, sticky=W) #dictionary for check boxes and associated error term self.msg_type_dict = { 'I': lambda: self.information_box.get() == 1, 'C': lambda: self.convention_box.get() == 1, 'R': lambda: self.refactor_box.get() == 1, 'E': lambda: self.error_box.get() == 1, 'W': lambda: self.warning_box.get() == 1, 'F': lambda: self.fatal_box.get() == 1 } self.txt_module.focus_set() def select_recent_file(self, event): """adds the selected file in the history listbox to the Module box""" if not self.showhistory.size(): return selected = self.showhistory.curselection() item = self.showhistory.get(selected) #update module self.txt_module.delete(0, END) self.txt_module.insert(0, item) def refresh_msg_window(self): """refresh the message window with current output""" #clear the window self.lb_messages.delete(0, END) self.visible_msgs = [] for msg in self.msgs: if self.msg_type_dict.get(msg.C)(): self.visible_msgs.append(msg) msg_str = convert_to_string(msg) self.lb_messages.insert(END, msg_str) fg_color = COLORS.get(msg_str[:3], 'black') self.lb_messages.itemconfigure(END, fg=fg_color) def refresh_results_window(self): """refresh the results window with current output""" #clear the window self.results.delete(0, END) try: for res in self.tabs[self.box.get()]: self.results.insert(END, res) except: pass def process_incoming(self): """process the incoming messages from running pylint""" while self.msg_queue.qsize(): try: msg = self.msg_queue.get(0) if msg == "DONE": self.report_stream.output_contents() return False #adding message to list of msgs self.msgs.append(msg) #displaying msg if message type is selected in check box if self.msg_type_dict.get(msg.C)(): self.visible_msgs.append(msg) msg_str = convert_to_string(msg) self.lb_messages.insert(END, msg_str) fg_color = COLORS.get(msg_str[:3], 'black') self.lb_messages.itemconfigure(END, fg=fg_color) except Queue.Empty: pass return True def periodic_call(self): """determine when to unlock the run button""" if self.process_incoming(): self.root.after(100, self.periodic_call) else: #enabling button so it can be run again self.btnRun.config(state=NORMAL) def mainloop(self): """launch the mainloop of the application""" self.root.mainloop() def quit(self, _=None): """quit the application""" self.root.quit() def halt(self): """program halt placeholder""" return def file_open(self, package=False, _=None): """launch a file browser""" if not package: filename = askopenfilename(parent=self.root, filetypes=[('pythonfiles', '*.py'), ('allfiles', '*')], title='Select Module') else: filename = askdirectory(title="Select A Folder", mustexist=1) if filename == (): return self.txt_module.delete(0, END) self.txt_module.insert(0, filename) def update_filenames(self): """update the list of recent filenames""" filename = self.txt_module.get() if not filename: filename = os.getcwd() if filename+'\n' in self.filenames: index = self.filenames.index(filename+'\n') self.filenames.pop(index) #ensure only 10 most recent are stored if len(self.filenames) == 10: self.filenames.pop() self.filenames.insert(0, filename+'\n') def set_history_window(self): """update the history window with info from the history file""" #clear the window self.showhistory.delete(0, END) # keep the last 10 most recent files try: view_history = open(HOME+HISTORY, 'r') for hist in view_history.readlines(): if not hist in self.filenames: self.filenames.append(hist) self.showhistory.insert(END, hist.split('\n')[0]) view_history.close() except IOError: # do nothing since history file will be created later return def run_lint(self, _=None): """launches pylint""" self.update_filenames() self.root.configure(cursor='watch') self.reporter = GUIReporter(self, output=self.report_stream) module = self.txt_module.get() if not module: module = os.getcwd() #cleaning up msgs and windows self.msgs = [] self.visible_msgs = [] self.lb_messages.delete(0, END) self.tabs = {} self.results.delete(0, END) self.btnRun.config(state=DISABLED) #setting up a worker thread to run pylint worker = Thread(target=lint_thread, args=(module, self.reporter, self,)) self.periodic_call() worker.start() # Overwrite the .pylint-gui-history file with all the new recently added files # in order from filenames but only save last 10 files write_history = open(HOME+HISTORY, 'w') write_history.writelines(self.filenames) write_history.close() self.set_history_window() self.root.configure(cursor='') def show_sourcefile(self, event=None): selected = self.lb_messages.curselection() if not selected: return msg = self.visible_msgs[int(selected[0])] scroll = msg.line - 3 if scroll < 0: scroll = 0 self.tabs["Source File"] = open(msg.path, "r").readlines() self.box.set("Source File") self.refresh_results_window() self.results.yview(scroll) self.results.select_set(msg.line - 1) def lint_thread(module, reporter, gui): """thread for pylint""" gui.status.text = "processing module(s)" pylint.lint.Run(args=[module], reporter=reporter, exit=False) gui.msg_queue.put("DONE") def Run(args): """launch pylint gui from args""" if args: print 'USAGE: pylint-gui\n launch a simple pylint gui using Tk' sys.exit(1) gui = LintGui() gui.mainloop() sys.exit(0) if __name__ == '__main__': Run(sys.argv[1:]) pylint-1.1.0/elisp/0000775000175000017500000000000012255772544013643 5ustar sytsyt00000000000000pylint-1.1.0/elisp/startup0000664000175000017500000000142212031346026015247 0ustar sytsyt00000000000000;; -*-emacs-lisp-*- ;; ;; Emacs startup file for the Debian GNU/Linux %PACKAGE% package ;; ;; Originally contributed by Nils Naumann ;; Modified by Dirk Eddelbuettel ;; Adapted for dh-make by Jim Van Zandt ;; The %PACKAGE% package follows the Debian/GNU Linux 'emacsen' policy and ;; byte-compiles its elisp files for each 'emacs flavor' (emacs19, ;; xemacs19, emacs20, xemacs20...). The compiled code is then ;; installed in a subdirectory of the respective site-lisp directory. ;; We have to add this to the load-path: (setq load-path (cons (concat "/usr/share/" (symbol-name debian-emacs-flavor) "/site-lisp/%PACKAGE%") load-path)) (load-library "pylint") pylint-1.1.0/elisp/pylint-flymake.el0000664000175000017500000000110512031346026017107 0ustar sytsyt00000000000000;; Configure flymake for python (when (load "flymake" t) (defun flymake-pylint-init () (let* ((temp-file (flymake-init-create-temp-buffer-copy 'flymake-create-temp-inplace)) (local-file (file-relative-name temp-file (file-name-directory buffer-file-name)))) (list "epylint" (list local-file)))) (add-to-list 'flymake-allowed-file-name-masks '("\\.py\\'" flymake-pylint-init))) ;; Set as a minor mode for python (add-hook 'python-mode-hook '(lambda () (flymake-mode))) pylint-1.1.0/elisp/pylint.el0000664000175000017500000001176412073062370015500 0ustar sytsyt00000000000000;;; pylint.el --- minor mode for running `pylint' ;; Copyright (c) 2009, 2010 Ian Eure ;; Author: Ian Eure ;; Keywords: languages python ;; Version: 1.01 ;; pylint.el is free software; you can redistribute it and/or modify it ;; under the terms of the GNU General Public License as published by the Free ;; Software Foundation; either version 2, or (at your option) any later ;; version. ;; ;; It is distributed in the hope that it will be useful, but WITHOUT ANY ;; WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS ;; FOR A PARTICULAR PURPOSE. See the GNU General Public License for more ;; details. ;; ;; You should have received a copy of the GNU General Public License along ;; with your copy of Emacs; see the file COPYING. If not, write to the Free ;; Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA ;; 02111-1307, USA. ;;; Commentary: ;; ;; Specialized compile mode for pylint. You may want to add the ;; following to your init.el: ;; ;; (autoload 'pylint "pylint") ;; (add-hook 'python-mode-hook 'pylint-add-menu-items) ;; (add-hook 'python-mode-hook 'pylint-add-key-bindings) ;;; Code: (require 'compile) (defgroup pylint nil "Minor mode for running the Pylint Python checker" :prefix "pylint-" :group 'tools :group 'languages) (defvar pylint-last-buffer nil "The most recent PYLINT buffer. A PYLINT buffer becomes most recent when you select PYLINT mode in it. Notice that using \\[next-error] or \\[compile-goto-error] modifies `complation-last-buffer' rather than `pylint-last-buffer'.") (defconst pylint-regexp-alist (let ((base "^\\(.*\\):\\([0-9]+\\):\s+\\(\\[%s.*\\)$")) (list (list (format base "[FE]") 1 2) (list (format base "[RWC]") 1 2 nil 1))) "Regexp used to match PYLINT hits. See `compilation-error-regexp-alist'.") (defcustom pylint-options '("--reports=n" "--output-format=parseable") "Options to pass to pylint.py" :type '(repeat string) :group 'pylint) (defcustom pylint-command "pylint" "PYLINT command." :type '(file) :group 'pylint) (defcustom pylint-ask-about-save nil "Non-nil means \\[pylint] asks which buffers to save before compiling. Otherwise, it saves all modified buffers without asking." :type 'boolean :group 'pylint) (define-compilation-mode pylint-mode "PYLINT" (setq pylint-last-buffer (current-buffer)) (set (make-local-variable 'compilation-error-regexp-alist) pylint-regexp-alist) (set (make-local-variable 'compilation-disable-input) t)) (defvar pylint-mode-map (let ((map (make-sparse-keymap))) (set-keymap-parent map compilation-minor-mode-map) (define-key map " " 'scroll-up) (define-key map "\^?" 'scroll-down) (define-key map "\C-c\C-f" 'next-error-follow-minor-mode) (define-key map "\r" 'compile-goto-error) ;; ? (define-key map "n" 'next-error-no-select) (define-key map "p" 'previous-error-no-select) (define-key map "{" 'compilation-previous-file) (define-key map "}" 'compilation-next-file) (define-key map "\t" 'compilation-next-error) (define-key map [backtab] 'compilation-previous-error) map) "Keymap for PYLINT buffers. `compilation-minor-mode-map' is a cdr of this.") ;;;###autoload (defun pylint () "Run PYLINT, and collect output in a buffer, much like `compile'. While pylint runs asynchronously, you can use \\[next-error] (M-x next-error), or \\\\[compile-goto-error] in the grep \ output buffer, to go to the lines where pylint found matches. \\{pylint-mode-map}" (interactive) (save-some-buffers (not pylint-ask-about-save) nil) (let* ((tramp (tramp-tramp-file-p (buffer-file-name))) (file (or (and tramp (aref (tramp-dissect-file-name (buffer-file-name)) 3)) (buffer-file-name))) (command (mapconcat 'identity (list pylint-command (mapconcat 'identity pylint-options " ") (comint-quote-filename file)) " "))) (compilation-start command 'pylint-mode))) ;;;###autoload (defun pylint-add-key-bindings () (let ((map (cond ((boundp 'py-mode-map) py-mode-map) ((boundp 'python-mode-map) python-mode-map)))) ;; shortcuts in the tradition of python-mode and ropemacs (define-key map (kbd "C-c m l") 'pylint) (define-key map (kbd "C-c m p") 'previous-error) (define-key map (kbd "C-c m n") 'next-error) nil)) ;;;###autoload (defun pylint-add-menu-items () (let ((map (cond ((boundp 'py-mode-map) py-mode-map) ((boundp 'python-mode-map) python-mode-map)))) (define-key map [menu-bar Python pylint-separator] '("--" . pylint-seperator)) (define-key map [menu-bar Python next-error] '("Next error" . next-error)) (define-key map [menu-bar Python prev-error] '("Previous error" . previous-error)) (define-key map [menu-bar Python lint] '("Pylint" . pylint)) nil)) (provide 'pylint) ;;; pylint.el ends here pylint-1.1.0/ChangeLog0000664000175000017500000012324712255665513014307 0ustar sytsyt00000000000000ChangeLog for Pylint ==================== 2013-12-22 -- 1.1.0 * Add new check for use of deprecated pragma directives "pylint:disable-msg" or "pylint:enable-msg" (I0022, deprecated-pragma) which was previously emmited as a regular warn(). * Avoid false used-before-assignment for except handler defined identifier used on the same line (#111). * Combine 'no-space-after-operator', 'no-space-after-comma' and 'no-space-before-operator' into a new warning 'bad-whitespace'. * Add a new warning 'superfluous-parens' for unnecessary parentheses after certain keywords. * Fix a potential crash in the redefine-in-handler warning if the redefined name is a nested getattr node. * Add a new option for the multi-statement warning to allow single-line if statements. * Add 'bad-context-manager' error, checking that '__exit__' special method accepts the right number of arguments. * Run pylint as a python module 'python -m pylint' (anatoly techtonik). * Check for non-exception classes inside an except clause. * epylint support options to give to pylint after the file to analyze and have basic input validation (bitbucket #53 and #54), patches provided by felipeochoa and Brian Lane. * Added a new warning, 'non-iterator-returned', for non-iterators returned by '__iter__'. * Add new checks for unpacking non-sequences in assignments (unpacking-non-sequence) as well as unbalanced tuple unpacking (unbalanced-tuple-unpacking). * useless-else-on-loop not emited if there is a break in the else clause of inner loop (#117). * don't mark `input` as a bad function when using python3 (#110). * badly-implemented-container caused several problems in its current implementation. Deactivate it until we have something better. See #112 for instance. * Use attribute regexp for properties in python3, as in python2 * Create the PYLINTHOME directory when needed, it might fail and lead to spurious warnings on import of pylint.config. * Fix setup.py so that pylint properly install on Windows when using python3 * Various documentation fixes and enhancements * Added a __main__.py file so you can run "python -m pylint" * Fix issue #55 (false-positive trailing-whitespace on Windows) 2013-08-06 -- 1.0.0 * Add check for the use of 'exec' function * New --msg-template option to control output, deprecating "msvc" and "parseable" output formats as well as killing `--include-ids` and `--symbols` options * Do not emit [fixme] for every line if the config value 'notes' is empty, but [fixme] is enabled. * Emit warnings about lines exceeding the column limit when those lines are inside multiline docstrings. * Do not double-check parameter names with the regex for parameters and inline variables. * Added a new warning missing-final-newline (C0304) for files missing the final newline. * Methods that are decorated as properties are now treated as attributes for the purposes of name checking. * Names of derived instance class member are not checked any more. * Names in global statements are now checked against the regular expression for constants. * For toplevel name assignment, the class name regex will be used if pylint can detect that value on the right-hand side is a class (like collections.namedtuple()). * Simplified invalid-name message * Added a new warning invalid-encoded-data (W0512) for files that contain data that cannot be decoded with the specified or default encoding. * New warning bad-open-mode (W1501) for calls to open (or file) that specify invalid open modes (Original implementation by Sasha Issayev). * New warning old-style-class (C1001) for classes that do not have any base class. * Add new name type 'class_attribute' for attributes defined in class scope. By default, allow both const and variable names. * New warning trailing-whitespace (C0303) that warns about trailing whitespace. * Added a new warning unpacking-in-except (W0712) about unpacking exceptions in handlers, which is unsupported in Python 3. * Add a configuration option for missing-docstring to optionally exempt short functions/methods/classes from the check. * Add the type of the offending node to missing-docstring and empty-docstring. * New utility classes for per-checker unittests in testutils.py * Do not warn about redefinitions of variables that match the dummy regex. * Do not treat all variables starting with _ as dummy variables, only _ itself. * Make the line-too-long warning configurable by adding a regex for lines for with the length limit should not be enforced * Do not warn about a long line if a pylint disable option brings it above the length limit * Do not flag names in nested with statements as undefined. * Added a new warning 'old-raise-syntax' for the deprecated syntax raise Exception, args * Support for PEP 3102 and new missing-kwoa (E1125) message for missing mandatory keyword argument (logilab.org's #107788) * Fix spelling of max-branchs option, now max-branches * Added a new base class and interface for checkers that work on the tokens rather than the syntax, and only tokenize the input file once. * Follow astng renaming to astroid * bitbucket #37: check for unbalanced unpacking in assignments * bitbucket #25: fix incomplete-protocol false positive for read-only containers like tuple * bitbucket #16: fix False positive E1003 on Python 3 for argument-less super() * bitbucket #6: put back documentation in source distribution * bitbucket #15: epylint shouldn't hang anymore when there is a large output on pylint'stderr * bitbucket #7: fix epylint w/ python3 * bitbucket #3: remove string module from the default list of deprecated modules 2013-04-25 -- 0.28.0 * bitbucket #1: fix "dictionary changed size during iteration" crash * #74013: new E1310[bad-str-strip-call] message warning when a call to a {l,r,}strip method contains duplicate characters (patch by Torsten Marek) * #123233: new E0108[duplicate-argument-name] message reporting duplicate argument names * #81378: emit W0120[useless-else-on-loop] for loops without break * #124660: internal dependencies should not appear in external dependencies report * #124662: fix name error causing crash when symbols are included in output messages * #123285: apply pragmas for warnings attached to lines to physical source code lines * #123259: do not emit E0105 for yield expressions inside lambdas * #123892: don't crash when attempting to show source code line that can't be encoded with the current locale settings * Simplify checks for dangerous default values by unifying tests for all different mutable compound literals. * Improve the description for E1124[redundant-keyword-arg] 2013-02-26 -- 0.27.0 * #20693: replace pylint.el by Ian Eure version (patch by J.Kotta) * #105327: add support for --disable=all option and deprecate the 'disable-all' inline directive in favour of 'skip-file' (patch by A.Fayolle) * #110840: add messages I0020 and I0021 for reporting of suppressed messages and useless suppression pragmas. (patch by Torsten Marek) * #112728: add warning E0604 for non-string objects in __all__ (patch by Torsten Marek) * #120657: add warning W0110/deprecated-lambda when a map/filter of a lambda could be a comprehension (patch by Martin Pool) * #113231: logging checker now looks at instances of Logger classes in addition to the base logging module. (patch by Mike Bryant) * #111799: don't warn about octal escape sequence, but warn about \o which is not octal in Python (patch by Martin Pool) * #110839: bind to Run button in pylint-gui * #115580: fix erroneous W0212 (access to protected member) on super call (patch by Martin Pool) * #110853: fix a crash when an __init__ method in a base class has been created by assignment rather than direct function definition (patch by Torsten Marek) * #110838: fix pylint-gui crash when include-ids is activated (patch by Omega Weapon) * #112667: fix emission of reimport warnings for mixed imports and extend the testcase (patch by Torsten Marek) * #112698: fix crash related to non-inferable __all__ attributes and invalid __all__ contents (patch by Torsten Marek) * Python 3 related fixes: * #110213: fix import of checkers broken with python 3.3, causing "No such message id W0704" breakage * #120635: redefine cmp function used in pylint.reporters * Include full warning id for I0020 and I0021 and make sure to flush warnings after each module, not at the end of the pylint run. (patch by Torsten Marek) * Changed the regular expression for inline options so that it must be preceeded by a # (patch by Torsten Marek) * Make dot output for import graph predictable and not depend on ordering of strings in hashes. (patch by Torsten Marek) * Add hooks for import path setup and move pylint's sys.path modifications into them. (patch by Torsten Marek) 2012-10-05 -- 0.26.0 * #106534: add --ignore-imports option to code similarity checking and 'symilar' command line tool (patch by Ry4an Brase) * #104571: check for anomalous backslash escape, introducing new W1401 and W1402 messages (patch by Martin Pool) * #100707: check for boolop being used as exception class, introducing new W0711 message (patch by Tim Hatch) * #4014: improve checking of metaclass methods first args, introducing new C0204 message (patch by lothiraldan@gmail.com finalized by sthenault) * #4685: check for consistency of a module's __all__ variable, introducing new E0603 message * #105337: allow custom reporter in output-format (patch by Kevin Jing Qiu) * #104420: check for protocol completness and avoid false R0903 (patch by Peter Hammond) * #100654: fix grammatical error for W0332 message (using 'l' as long int identifier) * #103656: fix W0231 false positive for missing call to object.__init__ (patch by lothiraldan@gmail.com) * #63424: fix similarity report disabling by properly renaming it to RP0801 * #103949: create a console_scripts entry point to be used by easy_install, buildout and pip * fix cross-interpreter issue (non compatible access to __builtins__) * stop including tests files in distribution, they causes crash when installed with python3 (#72022, #82417, #76910) 2012-07-17 -- 0.25.2 * #93591: Correctly emit warnings about clobbered variable names when an except handler contains a tuple of names instead of a single name. (patch by tmarek@google.com) * #7394: W0212 (access to protected member) not emited on assigments (patch by lothiraldan@gmail.com) * #18772; no prototype consistency check for mangled methods (patch by lothiraldan@gmail.com) * #92911: emit W0102 when sets are used as default arguments in functions (patch by tmarek@google.com) * #77982: do not emit E0602 for loop variables of comprehensions used as argument values inside a decorator (patch by tmarek@google.com) * #89092: don't emit E0202 (attribute hiding a method) on @property methods * #92584: fix pylint-gui crash due to internal API change * #87192: fix crash when decorators are accessed through more than one dot (for instance @a.b is fine, @a.b.c crash) * #88914: fix parsing of --generated-members options, leading to crash when using a regexp value set * fix potential crashes with utils.safe_infer raising InferenceError 2011-12-08 -- 0.25.1 * #81078: Warn if names in exception handlers clobber overwrite existing names (patch by tmarek@google.com) * #81113: Fix W0702 messages appearing with the wrong line number. (patch by tmarek@google.com) * #50461, #52020, #51222: Do not issue warnings when using 2.6's property.setter/deleter functionality (patch by dneil@google.com) * #9188, #4024: Do not trigger W0631 if a loop variable is assigned in the else branch of a for loop. 2011-10-07 -- 0.25.0 * #74742: make allowed name for first argument of class method configurable (patch by Google) * #74087: handle case where inference of a module return YES; this avoid some cases of "TypeError: '_Yes' object does not support indexing" (patch by Google) * #74745: make "too general" exception names configurable (patch by Google) * #74747: crash occurs when lookup up a special attribute in class scope (patch by google) * #76920: crash if on eg "pylint --rcfile" (patch by Torsten Marek) * #77237: warning for E0202 may be very misleading * #73941: HTML report messages table is badly rendered 2011-07-18 -- 0.24.0 * #69738: add regular expressions support for "generated-members" * ids of logging and string_format checkers have been changed: logging: 65 -> 12, string_format: 99 -> 13 Also add documentation to say that ids of range 1-50 shall be reserved to pylint internal checkers * #69993: Additional string format checks for logging module: check for missing arguments, too many arguments, or invalid string formats in the logging checker module. Contributed by Daniel Arena * #69220: add column offset to the reports. If you've a custom reporter, this change may break it has now location gain a new item giving the column offset. * #60828: Fix false positive in reimport check * #70495: absolute imports fail depending on module path (patch by Jacek Konieczny) * #22273: Fix --ignore option documentation to match reality 2011-01-11 -- 0.23.0 * documentation update, add manpages * several performance improvements * finalize python3 support * new W0106 warning 'Expression "%s" is assigned to nothing' * drop E0501 and E0502 messages about wrong source encoding: not anymore interesting since it's a syntax error for python >= 2.5 and we now only support this python version and above. * don't emit W0221 or W0222 when methods as variable arguments (eg *arg and/or **args). Patch submitted by Charles Duffy. 2010-11-15 -- 0.22.0 * python versions: minimal python3.x support; drop python < 2.5 support 2010-10-27 -- 0.21.4 * fix #48066: pylint crashes when redirecting output containing non-ascii characters * fix #19799: "pylint -blah" exit with status 2 * update documentation 2010-09-28 -- 0.21.3 * restored python 2.3 compatibility. Along with logilab-astng 0.21.3 and logilab-common 0.52, this will much probably be the latest release supporting python < 2.5. 2010-08-26 -- 0.21.2 * fix #36193: import checker raise exception on cyclic import * fix #28796: regression in --generated-members introduced pylint 0.20 * some documentation cleanups 2010-06-04 -- 0.21.1 * fix #28962: pylint crash with new options, due to missing stats data while writing the Statistics by types report * updated man page to 0.21 or greater command line usage (fix debian #582494) 2010-05-11 -- 0.21.0 * command line updated (closes #9774, #9787, #9992, #22962): * all enable-* / disable-* options have been merged into --enable / --disable * BACKWARD INCOMPATIBLE CHANGE: short name of --errors-only becomes -E, -e being affected to --enable * pylint --help output much simplified, with --long-help available to get the complete one * revisited gui, thanks to students from Toronto university (they are great contributors to this release!) * fix #21591: html reporter produces no output if reports is set to 'no' * fix #4581: not Missing docstring (C0111) warning if a method is overridden * fix #4683: Non-ASCII characters count double if utf8 encode * fix #9018: when using defining-attr-method, method order matters * fix #4595: Comma not followed by a space should not occurs on trailing comma in list/tuple/dict definition * fix #22585: [Patch] fix man warnings for pyreverse.1 manpage * fix #20067: AttributeError: 'NoneType' object has no attribute 'name' with with 2010-03-01 -- 0.20.0 * fix #19498: fix windows batch file * fix #19339: pylint.el : non existing py-mod-map (closes Debian Bug report logs - #475939) * implement #18860, new W0199 message on assert (a, b) * implement #9776, 'W0150' break or return statement in finally block may swallow exception. * fix #9263, __init__ and __new__ are checked for unused arguments * fix #20991, class scope definitions ignored in a genexpr * fix #5975, Abstract intermediate class not recognized as such * fix #5977, yield and return statement have their own counters, no more R0911 (Too many return statements) when a function have many yield stamtements * implement #5564, function / method arguments with leading "_" are ignored in arguments / local variables count. * implement #9982, E0711 specific error message when raising NotImplemented * remove --cache-size option 2009-12-18 -- 0.19.0 * implement #18947, #5561: checker for function arguments * include James Lingard string format checker * include simple message (ids) listing by Vincent Férotin (#9791) * --errors-only does not hide fatal error anymore * include james Lingard patches for ++/-- and duplicate key in dicts * include James Lingard patches for function call arguments checker * improved flymake code and doc provided by Derek Harland * refactor and fix the imports checker * fix #18862: E0601 false positive with lambda functions * fix #8764: More than one statement on a single line false positive with try/except/finally * fix #9215: false undefined variable error in lambda function * fix for w0108 false positive (Nathaniel) * fix test/fulltest.sh * #5821 added a utility function to run pylint in another process (patch provide by Vincent Férotin) 2009-03-25 -- 0.18.0 * tests ok with python 2.4, 2.5, 2.6. 2.3 not tested * fix #8687, W0613 false positive on inner function * fix #8350, C0322 false positive on multi-line string * fix #8332: set E0501 line no to the first line where non ascii character has been found * avoid some E0203 / E0602 false negatives by detecting respectively AttributeError / NameError * implements #4037: don't issue W0142 (* or ** magic) when they are barely passed from */** arguments * complete #5573: more complete list of special methods, also skip W0613 for python internal method * don't show information messages by default * integration of Yuen Ho Wong's patches on emacs lisp files 2009-03-19 -- 0.17.0 * semicolon check : move W0601 to W0301 * remove rpython : remove all rpython checker, modules and tests * astng 0.18 compatibility: support for _ast module modifies interfaces 2009-01-28 -- 0.16.0 * change [en|dis]able-msg-cat options: only accept message categories identified by their first letter (eg IRCWEF) without the need for comma as separator * add epylint.bat script to fix Windows installation * setuptools/easy_install support * include a modified version of Maarten ter Huurne patch to avoid W0613 warning on arguments from overridden method * implement #5575 drop dumb W0704 message) by adding W0704 to ignored messages by default * new W0108 message, checking for suspicious lambda (provided by Nathaniel Manista) * fix W0631, false positive reported by Paul Hachmann * fix #6951: false positive with W0104 * fix #6949 * patches by Mads Kiilerich: * implement #4691, make pylint exits with a non zero return status if any messages other then Information are issued * fix #3711, #5626 (name resolution bug w/ decorator and class members) * fix #6954 2008-10-13 -- 0.15.2 * fix #5672: W0706 weirdness ( W0706 removed ) * fix #5998: documentation points to wrong url for mailing list * fix #6022: no error message on wrong module names * fix #6040: pytest doesn't run test/func_test.py 2008-09-15 -- 0.15.1 * fix #4910: default values are missing in manpage * fix #5991: missing files in 0.15.0 tarball * fix #5993: epylint should work with python 2.3 2008-09-10 -- 0.15.0 * include pyreverse package and class diagram generation * included Stefan Rank's patch to deal with 2.4 relative import * included Robert Kirkpatrick's tutorial and typos fixes * fix bug in reenabling message * fix #2473: invoking pylint on __init__.py (hopefully) * typecheck: acquired-members option has been dropped in favor of the more generic generated-members option. If the zope option is set, the behaviour is now to add some default values to generated-members. * flymake integration: added bin/epylint and elisp/pylint-flymake.el 2008-01-14 -- 0.14.0 * fix #3733: Messages (dis)appear depending on order of file names * fix #4026: pylint.el should require compile * fix a bug in colorized reporter, spotted by Dave Borowitz * applied patch from Stefan Rank to avoid W0410 false positive when multiple "from __future__" import statements * implement #4012: flag back tick as deprecated (new W0333 message) * new ignored-class option on typecheck checker allowing to skip members checking based on class name (patch provided by Thomas W Barr) 2007-06-07 -- 0.13.2 * fix disable-checker option so that it won't accidentally enable the rpython checker which is disabled by default * added note about the gedit plugin into documentation 2007-03-02 -- 0.13.1 * fix some unexplained 0.13.0 packaging issue which led to a bunch of files missing from the distribution 2007-02-28 -- 0.13.0 * new RPython (Restricted Python) checker for PyPy fellow or people wanting to get a compiled version of their python program using the translator of the PyPy project. For more information about PyPy or RPython, visit http://codespeak.net/pypy/ * new E0104 and E0105 messages introduced to respectively warn about "return" and "yield" outside function or method * new E0106 message when "yield" and "return something" are mixed in a function or method * new W0107 message for unnecessary pass statement * new W0614 message to differentiate between unused `import X` and unused `from X import *` (#3209, patch submitted by Daniel Drake) * included Daniel Drake's patch to have a different message E1003 instead of E1001 when a missing member is found but an inference failure has been detected * msvs reporter for Visual Studio line number reporting (#3285) * allow disable-all option inline (#3218, patch submitted by Daniel Drake) * --init-hook option to call arbitrary code necessary to set environment (eg sys.path) (#3156) * One more Daniel's patch fixing a command line option parsing problem, this'll definitely be the DDrake release :) * fix #3184: crashes on "return" outside function * fix #3205: W0704 false positive * fix #3123: W0212 false positive on static method * fix #2485: W0222 false positive * fix #3259: when a message is explicitly enabled, check the checker emitting it is enabled 2006-11-23 -- 0.12.2 * fix #3143: W0233 bug w/ YES objects * fix #3119: Off-by-one error counting lines in a file * fix #3117: ease sys.stdout overriding for reporters * fix #2508: E0601 false positive with lambda * fix #3125: E1101 false positive and a message duplication. Only the last part is actually fixed since the initial false positive is due to dynamic setting of attributes on the decimal.Context class. * fix #3149: E0101 false positives and introduced E0100 for generator __init__ methods * fixed some format checker false positives 2006-09-25 -- 0.12.1 * fixed python >= 2.4 format false positive with multiple lines statement * fixed some 2.5 issues * fixed generator expression scope bug (depends on astng 0.16.1) * stop requiring __revision__ 2006-08-10 -- 0.12.0 * usability changes: - parseable, html and color options are now handled by a single output-format option - enable- and disable-all options are now handled by two (exclusive) enable-checker and disable-checker options taking a comma separated list of checker names as value - renamed debug-mode option to errors-only * started a reference user manual * new W0212 message for access to protected member from client code (close #14081) * new W0105 and W0106 messages extracted from W0104 (statement seems to have no effect) respectively when the statement is actually string (that's sometimes used instead of comments for documentation) or an empty statement generated by a useless semicolon * reclassified W0302 to C0302 * fix so that global messages are not anymore connected to the last analyzed module (close #10106) * fix some bugs related to local disabling of messages * fix cr/lf pb when generating the rc file on windows platforms 2006-04-19 -- 0.11.0 * fix crash caused by the exceptions checker in some case * fix some E1101 false positive with abstract method or classes defining __getattr__ * dirty fix to avoid "_socketobject" has not "connect" member. The actual problem is that astng isn't able to understand the code used to create socket.socket object with exec * added an option in the similarity checker to ignore docstrings, enabled by default * included patch from Benjamin Niemann to allow block level enabling/disabling of messages 2006-03-06 -- 0.10.0 * WARNING, this release include some configuration changes (see below), so you may have to check and update your own configuration file(s) if you use one * this release require the 0.15 version of astng or superior (it will save you a lot of pylint crashes...) * W0705 has been reclassified to E0701, and is now detecting more inheriting problem, and a false positive when empty except clause is following an Exception catch has been fixed (close #10422) * E0212 and E0214 (metaclass/class method should have mcs/cls as first argument have been reclassified to C0202 and C0203 since this not as well established as "self" for instance method (E0213) * W0224 has been reclassified into F0220 (failed to resolve interfaces implemented by a class) * a new typecheck checker, introducing the following checks: - E1101, access to unexistent member (implements #10430), remove the need of E0201 and so some options has been moved from the classes checker to this one - E1102, calling a non callable object - E1111 and W1111 when an assignment is done on a function call but the inferred function returns None (implements #10431) * change in the base checker: - checks module level and instance attribute names (new const-rgx and attr-rgx configuration option) (implements #10209 and #10440) - list comprehension and generator expression variables have their own regular expression (the inlinevar-rgx option) (implements #9146) - the C0101 check with its min-name-length option has been removed (this can be specified in the regxp after all...) - W0103 and W0121 are now handled by the variables checker (W0103 is now W0603 and W0604 has been splitted into different messages) - W0131 and W0132 messages have been reclassified to C0111 and C0112 respectively - new W0104 message on statement without effect * regexp support for dummy-variables (dummy-variables-rgx option replace dummy-variables) (implements #10027) * better global statement handling, see W0602, W0603, W0604 messages (implements #10344 and #10236) * --debug-mode option, disabling all checkers without error message and filtering others to only display error * fixed some R0201 (method could be a function) false positive 2006-01-10 -- 0.9.0 * a lot of updates to follow astng 0.14 API changes, so install logilab-astng 0.14 or greater before using this version of pylint * checker number 10 ! newstyle will search for problems regarding old style / new style classes usage problems (rely on astng 0.14 new style detection feature) * new 'load-plugins' options to load additional pylint plugins (usable from the command line or from a configuration file) (implements #10031) * check if a "pylintrc" file exists in the current working directory before using the one specified in the PYLINTRC environment variable or the default ~/.pylintrc or /etc/pylintrc * fixed W0706 (Identifier used to raise an exception is assigned...) false positive and reraising a catched exception instance * fixed E0611 (No name get in module blabla) false positive when accessing to a class'__dict__ * fixed some E0203 ("access to member before its definition") false positive * fixed E0214 ("metaclass method first argument should be mcs) false positive with staticmethod used on a metaclass * fixed packaging which was missing the test/regrtest_data directory * W0212 (method could be a function) has been reclassified in the REFACTOR category as R0201, and is no more considerer when a method overrides an abstract method from an ancestor class * include module name in W0401 (wildcard import), as suggested by Amaury * when using the '--parseable', path are written relative to the current working directory if in a sub-directory of it (#9789) * 'pylint --version' shows logilab-astng and logilab-common versions * fixed pylint.el to handle space in file names * misc lint style fixes 2005-11-07 -- 0.8.1 * fix "deprecated module" false positive when the code imports a module whose name starts with a deprecated module's name (close #10061) * fix "module has no name __dict__" false positive (close #10039) * fix "access to undefined variable __path__" false positive (close #10065) * fix "explicit return in __init__" false positive when return is actually in an inner function (close #10075) 2005-10-21 -- 0.8.0 * check names imported from a module exists in the module (E0611), patch contributed by Amaury Forgeot d'Arc * print a warning (W0212) for methods that could be a function (implements #9100) * new --defining-attr-methods option on classes checker * new --acquired-members option on the classes checker, used when --zope=yes to avoid false positive on acquired attributes (listed using this new option) (close #8616) * generate one E0602 for each use of an undefined variable (previously, only one for the first use but not for the following) (implements #1000) * make profile option saveable * fix Windows .bat file, patch contributed by Amaury Forgeot d'Arc * fix one more false positive for E0601 (access before definition) with for loop such as "for i in range(10): print i" (test func_noerror_defined_and_used_on_same_line) * fix false positive for E0201 (undefined member) when accessing to __name__ on a class object * fix astng checkers traversal order * fix bug in format checker when parsing a file from a platform using different new line characters (close #9239) * fix encoding detection regexp * fix --rcfile handling (support for --rcfile=file, close #9590) 2005-05-27 -- 0.7.0 * WARNING: pylint is no longer a logilab subpackage. Users may have to manually remove the old logilab/pylint directory. * introduce a new --additional-builtins option to handle user defined builtins * --reports option has now -r as short alias, and -i for --include-ids * fix a bug in the variables checker which may causing some false positives when variables are defined and used within the same statement (test func_noerror_defined_and_used_on_same_line) * this time, real fix of the "disable-msg in the config file" problem, test added to unittest_lint * fix bug with --list-messages and python -OO * fix possible false positive for W0201 2005-04-14 -- 0.6.4 * allow to parse files without extension when a path is given on the command line (test noext) * don't fail if we are unable to read an inline option (e.g. inside a module), just produce an information message (test func_i0010) * new message E0103 for break or continue outside loop (close #8883, test func_continue_not_in_loop) * fix bug in the variables checker, causing non detection of some actual name error (close #8884, test func_nameerror_on_string_substitution) * fix bug in the classes checker which was making pylint crash if "object" is assigned in a class inheriting from it (test func_noerror_object_as_class_attribute) * fix problem with the similar checker when related options are defined in a configuration file * new --generate-man option to generate pylint's man page (require the latest logilab.common (>= 0.9.3) * packaged (generated...) man page 2005-02-24 -- 0.6.3 * fix scope problem which may cause false positive and true negative on E0602 * fix problem with some options such as disable-msg causing error when they are coming from the configuration file 2005-02-16 -- 0.6.2 * fix false positive on E0201 ("access to undefined member") with metaclasses * fix false positive on E0203 ("access to member before its definition") when attributes are defined in a parent class * fix false positive on W0706 ("identifier used to raise an exception assigned to...") * fix interpretation of "\t" as value for the indent-string configuration variable * fix --rcfile so that --rcfile=pylintrc (only --rcfile pylintrc was working in earlier release) * new raw checker example in the examples/ directory 2005-02-04 -- 0.6.1 * new --rcfile option to specify the configuration file without the PYLINTRC environment variable * added an example module for a custom pylint checker (see the example/ directory) * some fixes to handle fixes in common 0.9.1 (should however still working with common 0.9.0, even if upgrade is recommended) 2005-01-20 -- 0.6.0 * refix pylint emacs mode * no more traceback when just typing "pylint" * fix a bug which may cause crashes on resolving parent classes * fix problems with the format checker: don't chock on files containing multiple CR, avoid C0322, C0323, C0324 false positives with triple quoted string with quote inside * correctly detect access to member defined latter in __init__ method * now depends on common 0.8.1 to fix problem with interface resolution (close #8606) * new --list-msgs option describing available checkers and their messages * added windows specific documentation to the README file, contributed by Brian van den Broek * updated doc/features.txt (actually this file is now generated using the --list-msgs option), more entries into the FAQ * improved tests coverage 2004-10-19 -- 0.5.0 * avoid to import analyzed modules ! * new Refactor and Convention message categories. Some Warnings have been remaped into those new categories * added "similar", a tool to find copied and pasted lines of code, both using a specific command line tool and integrated as a pylint's checker * imports checker may report import dependencies as a dot graph * new checker regrouping most Refactor detection (with some new metrics) * more command line options storable in the configuration file * fix bug with total / undocumented number of methods 2004-07-08 -- 0.4.2 * fix pylint emacs mode * fix classes checkers to handler twisted interfaces 2004-05-14 -- 0.4.1 * fix the setup.py script to allow bdist_winst (well, the generated installer has not been tested...) with the necessary logilab/__init__.py file * fix file naming convention as suggested by Andreas Amoroso * fix stupid crash bug with bad method names 2004-05-10 -- 0.4.0 * fix file path with --parsable * --parsable option has been renamed to --parseable * added patch from Andreas Amoroso to output message to files instead of standard output * added Run to the list of correct variable names * fix variable names regexp and checking of local classes names * some basic handling of metaclasses * no-docstring-rgx apply now on classes too * new option to specify a different regexp for methods than for functions * do not display the evaluation report when no statements has been analysed * fixed crash with a class nested in a method * fixed format checker to deals with triple quoted string and lines with code and comment mixed * use logilab.common.ureports to layout reports 2004-02-17 -- 0.3.3 * added a parsable text output, used when the --parsable option is provided * added an emacs mode using this output, available in the distrib's elisp directory * fixed some typos in messages * change include-ids options to yn, and allow it to be in the configuration file * do not chock on corrupted stats files * fixed bug in the format checker which may stop pylint execution * provide scripts for unix and windows to wrap the minimal pylint tk gui 2003-12-23 -- 0.3.2 * html-escape messages in the HTML reporter (bug reported by Juergen Hermann) * added "TODO" to the list of default note tags * added "rexec" to the list of default deprecated modules * fixed typos in some messages 2003-12-05 -- 0.3.1 * bug fix in format and classes checkers * remove print statement from imports checkers * provide a simple tk gui, essentially useful for windows users 2003-11-20 -- 0.3.0 * new exceptions checker, checking for string exception and empty except clauses. * imports checker checks for reimport of modules * classes checker checks for calls to ancestor's __init__ and abstract method not overridden. It doesn't complain anymore for unused import in __init__ files, and provides a new option ignore-interface-methods, useful when you're using zope Interface implementation in your project * base checker checks for black listed builtins call (controled by the bad-functions option) and for use of * and ** * format checker checks for use of <> and "l" as long int marker * major internal API changes * use the rewrite of astng, based on compiler.ast * added unique id for messages, as suggested by Wolfgang Grafen * added unique id for reports * can take multiple modules or files as argument * new options command line options : --disable-msg, --enable-msg, --help-msg, --include-ids, --reports, --disable-report, --cache-size * --version shows the version of the python interpreter * removed some options which are now replaced by [en|dis]able-msg, or disable-report * read disable-msg and enable-msg options in source files (should be in comments on the top of the file, in the form "# pylint: disable-msg=W0402" * new message for modules importing themselves instead of the "cyclic import" message * fix bug with relative and cyclic imports * fix bug in imports checker (cycle was not always detected) * still fixes in format checker : don't check comment and docstring, check first line after an indent * black and white list now apply to all identifiers, not only variables, so changed the configuration option from (good|bad)-variable-names to (good|bad)-names * added string, rexec and Bastion to the default list of deprecated modules * do not print redefinition warning for function/class/method defined in mutually exclusive branches 2003-10-10 -- 0.2.1 * added some documentation, fixed some typos * set environment variable PYLINT_IMPORT to 1 during pylint execution. * check that variables "imported" using the global statement exist * indentation problems are now warning instead of errors * fix checkers.initialize to try to load all files with a known python extension (patch from wrobell) * fix a bunch of messages * fix sample configuration file * fix the bad-construction option * fix encoding checker * fix format checker 2003-09-12 -- 0.2.0 * new source encoding / FIXME checker (pep 263) * new --zope option which trigger Zope import. Useful to check Zope products code. * new --comment option which enable the evaluation note comment (disabled by default). * a ton of bug fixes * easy functional test infrastructure 2003-06-18 -- 0.1.2 * bug fix release * remove dependency to pyreverse 2003-06-01 -- 0.1.1 * much more functionalities ! 2003-05-19 -- 0.1 * initial release pylint-1.1.0/config.py0000664000175000017500000001264312255070544014343 0ustar sytsyt00000000000000# Copyright (c) 2003-2013 LOGILAB S.A. (Paris, FRANCE). # This program is free software; you can redistribute it and/or modify it under # the terms of the GNU General Public License as published by the Free Software # Foundation; either version 2 of the License, or (at your option) any later # version. # # This program is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details # # You should have received a copy of the GNU General Public License along with # this program; if not, write to the Free Software Foundation, Inc., # 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. """utilities for Pylint configuration : * pylintrc * pylint.d (PYLINTHOME) """ from __future__ import with_statement import pickle import os import sys from os.path import exists, isfile, join, expanduser, abspath, dirname # pylint home is used to save old runs results ################################ USER_HOME = expanduser('~') if 'PYLINTHOME' in os.environ: PYLINT_HOME = os.environ['PYLINTHOME'] if USER_HOME == '~': USER_HOME = dirname(PYLINT_HOME) elif USER_HOME == '~': PYLINT_HOME = ".pylint.d" else: PYLINT_HOME = join(USER_HOME, '.pylint.d') def get_pdata_path(base_name, recurs): """return the path of the file which should contain old search data for the given base_name with the given options values """ base_name = base_name.replace(os.sep, '_') return join(PYLINT_HOME, "%s%s%s"%(base_name, recurs, '.stats')) def load_results(base): """try to unpickle and return data from file if it exists and is not corrupted return an empty dictionary if it doesn't exists """ data_file = get_pdata_path(base, 1) try: with open(data_file) as stream: return pickle.load(stream) except: return {} if sys.version_info < (3, 0): _PICK_MOD = 'w' else: _PICK_MOD = 'wb' def save_results(results, base): """pickle results""" if not exists(PYLINT_HOME): try: os.mkdir(PYLINT_HOME) except OSError: print >> sys.stderr, 'Unable to create directory %s' % PYLINT_HOME data_file = get_pdata_path(base, 1) try: with open(data_file, _PICK_MOD) as stream: pickle.dump(results, stream) except (IOError, OSError), ex: print >> sys.stderr, 'Unable to create file %s: %s' % (data_file, ex) # location of the configuration file ########################################## def find_pylintrc(): """search the pylint rc file and return its path if it find it, else None """ # is there a pylint rc file in the current directory ? if exists('pylintrc'): return abspath('pylintrc') if isfile('__init__.py'): curdir = abspath(os.getcwd()) while isfile(join(curdir, '__init__.py')): curdir = abspath(join(curdir, '..')) if isfile(join(curdir, 'pylintrc')): return join(curdir, 'pylintrc') if 'PYLINTRC' in os.environ and exists(os.environ['PYLINTRC']): pylintrc = os.environ['PYLINTRC'] else: user_home = expanduser('~') if user_home == '~' or user_home == '/root': pylintrc = ".pylintrc" else: pylintrc = join(user_home, '.pylintrc') if not isfile(pylintrc): if isfile('/etc/pylintrc'): pylintrc = '/etc/pylintrc' else: pylintrc = None return pylintrc PYLINTRC = find_pylintrc() ENV_HELP = ''' The following environment variables are used: * PYLINTHOME Path to the directory where the persistent for the run will be stored. If not found, it defaults to ~/.pylint.d/ or .pylint.d (in the current working directory). * PYLINTRC Path to the configuration file. See the documentation for the method used to search for configuration file. ''' % globals() # evaluation messages ######################################################### def get_note_message(note): """return a message according to note note is a float < 10 (10 is the highest note) """ assert note <= 10, "Note is %.2f. Either you cheated, or pylint's \ broken!" % note if note < 0: msg = 'You have to do something quick !' elif note < 1: msg = 'Hey! This is really dreadful. Or maybe pylint is buggy?' elif note < 2: msg = "Come on! You can't be proud of this code" elif note < 3: msg = 'Hum... Needs work.' elif note < 4: msg = 'Wouldn\'t you be a bit lazy?' elif note < 5: msg = 'A little more work would make it acceptable.' elif note < 6: msg = 'Just the bare minimum. Give it a bit more polish. ' elif note < 7: msg = 'This is okay-ish, but I\'m sure you can do better.' elif note < 8: msg = 'If you commit now, people should not be making nasty \ comments about you on c.l.py' elif note < 9: msg = 'That\'s pretty good. Good work mate.' elif note < 10: msg = 'So close to being perfect...' else: msg = 'Wow ! Now this deserves our uttermost respect.\nPlease send \ your code to python-projects@logilab.org' return msg pylint-1.1.0/reporters/0000775000175000017500000000000012255772544014554 5ustar sytsyt00000000000000pylint-1.1.0/reporters/html.py0000664000175000017500000000501112175763430016062 0ustar sytsyt00000000000000# Copyright (c) 2003-2013 LOGILAB S.A. (Paris, FRANCE). # This program is free software; you can redistribute it and/or modify it under # the terms of the GNU General Public License as published by the Free Software # Foundation; either version 2 of the License, or (at your option) any later # version. # # This program is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along with # this program; if not, write to the Free Software Foundation, Inc., # 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. """HTML reporter""" import sys from cgi import escape from logilab.common.ureports import HTMLWriter, Section, Table from pylint.interfaces import IReporter from pylint.reporters import BaseReporter, Message class HTMLReporter(BaseReporter): """report messages and layouts in HTML""" __implements__ = IReporter name = 'html' extension = 'html' def __init__(self, output=sys.stdout): BaseReporter.__init__(self, output) self.msgs = [] def add_message(self, msg_id, location, msg): """manage message of different type and in the context of path""" msg = Message(self, msg_id, location, msg) self.msgs += (msg.category, msg.module, msg.obj, str(msg.line), str(msg.column), escape(msg.msg)) def set_output(self, output=None): """set output stream messages buffered for old output is processed first""" if self.out and self.msgs: self._display(Section()) BaseReporter.set_output(self, output) def _display(self, layout): """launch layouts display overridden from BaseReporter to add insert the messages section (in add_message, message is not displayed, just collected so it can be displayed in an html table) """ if self.msgs: # add stored messages to the layout msgs = ['type', 'module', 'object', 'line', 'col_offset', 'message'] msgs += self.msgs sect = Section('Messages') layout.append(sect) sect.append(Table(cols=6, children=msgs, rheaders=1)) self.msgs = [] HTMLWriter().format(layout, self.out) def register(linter): """Register the reporter classes with the linter.""" linter.register_reporter(HTMLReporter) pylint-1.1.0/reporters/__init__.py0000664000175000017500000001064412176131371016657 0ustar sytsyt00000000000000# Copyright (c) 2003-2013 LOGILAB S.A. (Paris, FRANCE). # This program is free software; you can redistribute it and/or modify it under # the terms of the GNU General Public License as published by the Free Software # Foundation; either version 2 of the License, or (at your option) any later # version. # # This program is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along with # this program; if not, write to the Free Software Foundation, Inc., # 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. """utilities methods and classes for reporters""" import sys import locale import os from pylint.utils import MSG_TYPES from pylint import utils CMPS = ['=', '-', '+'] # py3k has no more cmp builtin if sys.version_info >= (3, 0): def cmp(a, b): return (a > b) - (a < b) def diff_string(old, new): """given a old and new int value, return a string representing the difference """ diff = abs(old - new) diff_str = "%s%s" % (CMPS[cmp(old, new)], diff and ('%.2f' % diff) or '') return diff_str class Message(object): """This class represent a message to be issued by the reporters""" def __init__(self, reporter, msg_id, location, msg): self.msg_id = msg_id self.abspath, self.module, self.obj, self.line, self.column = location self.path = self.abspath.replace(reporter.path_strip_prefix, '') self.msg = msg self.C = msg_id[0] self.category = MSG_TYPES[msg_id[0]] self.symbol = reporter.linter.check_message_id(msg_id).symbol def format(self, template): """Format the message according to the given template. The template format is the one of the format method : cf. http://docs.python.org/2/library/string.html#formatstrings """ return template.format(**(self.__dict__)) class BaseReporter(object): """base class for reporters symbols: show short symbolic names for messages. """ extension = '' def __init__(self, output=None): self.linter = None # self.include_ids = None # Deprecated # self.symbols = None # Deprecated self.section = 0 self.out = None self.out_encoding = None self.encode = None self.set_output(output) # Build the path prefix to strip to get relative paths self.path_strip_prefix = os.getcwd() + os.sep def add_message(self, msg_id, location, msg): """Client API to send a message""" # Shall we store the message objects somewhere, do some validity checking ? raise NotImplementedError def set_output(self, output=None): """set output stream""" self.out = output or sys.stdout # py3k streams handle their encoding : if sys.version_info >= (3, 0): self.encode = lambda x: x return def encode(string): if not isinstance(string, unicode): return string encoding = (getattr(self.out, 'encoding', None) or locale.getdefaultlocale()[1] or sys.getdefaultencoding()) # errors=replace, we don't want to crash when attempting to show # source code line that can't be encoded with the current locale # settings return string.encode(encoding, 'replace') self.encode = encode def writeln(self, string=''): """write a line in the output buffer""" print >> self.out, self.encode(string) def display_results(self, layout): """display results encapsulated in the layout tree""" self.section = 0 if hasattr(layout, 'report_id'): layout.children[0].children[0].data += ' (%s)' % layout.report_id self._display(layout) def _display(self, layout): """display the layout""" raise NotImplementedError() # Event callbacks def on_set_current_module(self, module, filepath): """starting analyzis of a module""" pass def on_close(self, stats, previous_stats): """global end of analyzis""" pass def initialize(linter): """initialize linter with reporters in this package """ utils.register_plugins(linter, __path__[0]) pylint-1.1.0/reporters/guireporter.py0000664000175000017500000000137512254613024017465 0ustar sytsyt00000000000000""" reporter used by gui.py """ import sys from pylint.interfaces import IReporter from pylint.reporters import BaseReporter, Message from logilab.common.ureports import TextWriter class GUIReporter(BaseReporter): """saves messages""" __implements__ = IReporter extension = '' def __init__(self, gui, output=sys.stdout): """init""" BaseReporter.__init__(self, output) self.gui = gui def add_message(self, msg_id, location, msg): """manage message of different type and in the context of path""" message = Message(self, msg_id, location, msg) self.gui.msg_queue.put(message) def _display(self, layout): """launch layouts display""" TextWriter().format(layout, self.out) pylint-1.1.0/reporters/text.py0000664000175000017500000001212112255070545016077 0ustar sytsyt00000000000000# Copyright (c) 2003-2013 LOGILAB S.A. (Paris, FRANCE). # This program is free software; you can redistribute it and/or modify it under # the terms of the GNU General Public License as published by the Free Software # Foundation; either version 2 of the License, or (at your option) any later # version. # # This program is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along with # this program; if not, write to the Free Software Foundation, Inc., # 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. """Plain text reporters: :text: the default one grouping messages by module :colorized: an ANSI colorized text reporter """ import warnings from logilab.common.ureports import TextWriter from logilab.common.textutils import colorize_ansi from pylint.interfaces import IReporter from pylint.reporters import BaseReporter, Message TITLE_UNDERLINES = ['', '=', '-', '.'] class TextReporter(BaseReporter): """reports messages and layouts in plain text""" __implements__ = IReporter name = 'text' extension = 'txt' line_format = '{C}:{line:3d},{column:2d}: {msg} ({symbol})' def __init__(self, output=None): BaseReporter.__init__(self, output) self._modules = {} self._template = None def on_set_current_module(self, module, filepath): self._template = unicode(self.linter.config.msg_template or self.line_format) def write_message(self, msg): """Convenience method to write a formated message with class default template""" self.writeln(msg.format(self._template)) def add_message(self, msg_id, location, msg): """manage message of different type and in the context of path""" m = Message(self, msg_id, location, msg) if m.module not in self._modules: if m.module: self.writeln('************* Module %s' % m.module) self._modules[m.module] = 1 else: self.writeln('************* ') self.write_message(m) def _display(self, layout): """launch layouts display""" print >> self.out TextWriter().format(layout, self.out) class ParseableTextReporter(TextReporter): """a reporter very similar to TextReporter, but display messages in a form recognized by most text editors : :: """ name = 'parseable' line_format = '{path}:{line}: [{msg_id}({symbol}), {obj}] {msg}' def __init__(self, output=None): warnings.warn('%s output format is deprecated. This is equivalent ' 'to --msg-template=%s' % (self.name, self.line_format)) TextReporter.__init__(self, output) class VSTextReporter(ParseableTextReporter): """Visual studio text reporter""" name = 'msvs' line_format = '{path}({line}): [{msg_id}({symbol}){obj}] {msg}' class ColorizedTextReporter(TextReporter): """Simple TextReporter that colorizes text output""" name = 'colorized' COLOR_MAPPING = { "I" : ("green", None), 'C' : (None, "bold"), 'R' : ("magenta", "bold, italic"), 'W' : ("blue", None), 'E' : ("red", "bold"), 'F' : ("red", "bold, underline"), 'S' : ("yellow", "inverse"), # S stands for module Separator } def __init__(self, output=None, color_mapping=None): TextReporter.__init__(self, output) self.color_mapping = color_mapping or \ dict(ColorizedTextReporter.COLOR_MAPPING) def _get_decoration(self, msg_id): """Returns the tuple color, style associated with msg_id as defined in self.color_mapping """ try: return self.color_mapping[msg_id[0]] except KeyError: return None, None def add_message(self, msg_id, location, msg): """manage message of different types, and colorize output using ansi escape codes """ msg = Message(self, msg_id, location, msg) if msg.module not in self._modules: color, style = self._get_decoration('S') if msg.module: modsep = colorize_ansi('************* Module %s' % msg.module, color, style) else: modsep = colorize_ansi('************* %s' % msg.module, color, style) self.writeln(modsep) self._modules[msg.module] = 1 color, style = self._get_decoration(msg.C) for attr in ('msg', 'symbol', 'category', 'C'): setattr(msg, attr, colorize_ansi(getattr(msg, attr), color, style)) self.write_message(msg) def register(linter): """Register the reporter classes with the linter.""" linter.register_reporter(TextReporter) linter.register_reporter(ParseableTextReporter) linter.register_reporter(VSTextReporter) linter.register_reporter(ColorizedTextReporter) pylint-1.1.0/doc/0000775000175000017500000000000012255772544013274 5ustar sytsyt00000000000000pylint-1.1.0/doc/message-control.rst0000664000175000017500000000447612133451371017126 0ustar sytsyt00000000000000 Messages control ---------------- An example available from the examples directory: .. sourcecode:: python """pylint option block-disable""" __revision__ = None class Foo(object): """block-disable test""" def __init__(self): pass def meth1(self, arg): """this issues a message""" print self def meth2(self, arg): """and this one not""" # pylint: disable=W0613 print self\ + "foo" def meth3(self): """test one line disabling""" # no error print self.bla # pylint: disable=E1101 # error print self.blop def meth4(self): """test re-enabling""" # pylint: disable=E1101 # no error print self.bla print self.blop # pylint: enable=E1101 # error print self.blip def meth5(self): """test IF sub-block re-enabling""" # pylint: disable=E1101 # no error print self.bla if self.blop: # pylint: enable=E1101 # error print self.blip else: # no error print self.blip # no error print self.blip def meth6(self): """test TRY/EXCEPT sub-block re-enabling""" # pylint: disable=E1101 # no error print self.bla try: pylint: enable=E1101 # error print self.blip except UndefinedName: # pylint: disable=E0602 # no error print self.blip # no error print self.blip def meth7(self): """test one line block opening disabling""" if self.blop: # pylint: disable=E1101 # error print self.blip else: # error print self.blip # error print self.blip def meth8(self): """test late disabling""" # error print self.blip # pylint: disable=E1101 # no error print self.bla print self.blop pylint-1.1.0/doc/faq.rst0000664000175000017500000002376312160765264014604 0ustar sytsyt00000000000000.. -*- coding: utf-8 -*- ========================== Frequently Asked Questions ========================== 1. About Pylint =============== 1.1 What is Pylint? -------------------- Pylint is a `static code checker`_, meaning it can analyse your code without actually running it. Pylint checks for errors, tries to enforce a coding standard, and tries to enforce a coding style. .. _`static code checker`: http://en.wikipedia.org/wiki/Static_code_analysis 1.2 How is Pylint different from Pychecker? ------------------------------------------- A major difference between Pylint and Pychecker_ is that Pylint checks for style issues, while Pychecker explicitly does not. There are a few other differences, such as the fact that Pylint does not import live modules while Pychecker does (see `6.2 Why does Pychecker catch problems with imports that Pylint doesn't?`_). .. _Pychecker: http://pychecker.sf.net 1.3 Who wrote Pylint? --------------------- Pylint's main author and maintainer for the first ten years of its life has been Sylvain Thénault, while he worked at Logilab_ where the project was born. For a full list of contributors, see the "Contributors" section of Pylint's README file. .. _Logilab: http://www.logilab.fr/ 1.4 Who uses Pylint? -------------------- Everybody knows someone who uses Pylint. 2. Installation =============== 2.1 How do I install Pylint? ---------------------------- Everything should be explained on http://docs.pylint.org/installation 2.2 What kind of versioning system does Pylint use? --------------------------------------------------- Pylint uses the Mercurial_ distributed version control system. The URL of the repository is: https://bitbucket.org/logilab/pylint. To get the latest version of Pylint from the repository, simply invoke :: hg clone https://bitbucket.org/logilab/pylint .. _Mercurial: http://mercurial.selenic.com/ 2.3 What are Pylint's dependencies? ----------------------------------- Pylint requires the latest `astroid`_ and `logilab-common`_ packages. It should be compatible with any Python version greater than 2.5.0. .. _`astroid`: https://bitbucket.org/logilab/astroid .. _`logilab-common`: http://www.logilab.org/project/logilab-common 3. Running Pylint ================= 3.1 Can I give pylint a file as an argument instead of a module? ----------------------------------------------------------------- Pylint expects the name of a package or module as its argument. As a convenience, you can give it a file name if it's possible to guess a module name from the file's path using the python path. Some examples : "pylint mymodule.py" should always work since the current working directory is automatically added on top of the python path "pylint directory/mymodule.py" will work if "directory" is a python package (i.e. has an __init__.py file) or if "directory" is in the python path. "pylint /whatever/directory/mymodule.py" will work if either: - "/whatever/directory" is in the python path - your cwd is "/whatever/directory" - "directory" is a python package and "/whatever" is in the python path - "directory" is a python package and your cwd is "/whatever" and so on... 3.2 Where is the persistent data stored to compare between successive runs? ---------------------------------------------------------------------------- Analysis data are stored as a pickle file in a directory which is localized using the following rules: * value of the PYLINTHOME environment variable if set * ".pylint.d" subdirectory of the user's home directory if it is found (not always findable on Windows platforms) * ".pylint.d" directory in the current directory 3.3 How do I find the option name (for pylintrc) corresponding to a specific command line option? -------------------------------------------------------------------------------------------------------- You can always generate a sample pylintrc file with --generate-rcfile Every option present on the command line before this will be included in the rc file For example:: pylint --disable=W0702,C0103 --class-rgx='[A-Z][a-z]+' --generate-rcfile 3.4 I'd rather not run Pylint from the command line. Can I integrate it with my editor? --------------------------------------------------------------------------------------- Much probably. Read http://docs.pylint.org/ide-integration 4. Message Control ================== 4.1 Is it possible to locally disable a particular message? ----------------------------------------------------------- Yes, this feature has been added in Pylint 0.11. This may be done by adding "#pylint: disable=W0123,E4567" at the desired block level or at the end of the desired line of code 4.2 Is there a way to disable a message for a particular module only? --------------------------------------------------------------------- Yes, you can disable or enable (globally disabled) messages at the module level by adding the corresponding option in a comment at the top of the file: :: # pylint: disable=W0401, E0202 # pylint: enable=C0302 4.3 How can I tell Pylint to never check a given module? -------------------------------------------------------- With Pylint < 0.25, add "#pylint: disable-all" at the beginning of the module. Pylint 0.26.1 and up have renamed that directive to "#pylint: skip-file" (but the first version will be kept for backward compatibility). In order to ease finding which modules are ignored a Information-level message I0013 is emited. With recent versions of Pylint, if you use the old syntax, an additional I0014 message is emited. 4.4 Do I have to remember all these numbers? -------------------------------------------- No, starting from 0.25.3, you can use symbolic names for messages:: # pylint: disable=fixme, line-too-long You can show these symbols in the output with the `-sy` option. 4.5 I have a callback function where I have no control over received arguments. How do I avoid getting unused argument warnings? ---------------------------------------------------------------------------------------------------------------------------------- Prefix (ui) the callback's name by `cb_`, as in cb_onclick(...). By doing so arguments usage won't be checked. Another solution is to use one of the names defined in the "dummy-variables" configuration variable for unused argument ("_" and "dummy" by default). 4.6 What is the format of the configuration file? --------------------------------------------------- Pylint uses ConfigParser from the standard library to parse the configuration file. It means that if you need to disable a lot of messages, you can use tricks like: :: disable= W0401, # because I do not want it E0202, # I have a good reason, trust me C0302 # that's it 4.7 Why do I get a lot of spurious "unused variables messages" when using psyobj from psyco_? ---------------------------------------------------------------------------------------------- This is actually due to a bug in psyco, making the locals() function for objects inheriting from *psyobj* returning an empty dictionary. For the moment, the only way to fix this is to use the PYLINT_IMPORT environment variable to not use psyco during Pylint checking. Sample code :: import os try: if os.environ.has_key('PYLINT_IMPORT'): raise ImportError() from psyco.classes import psyobj except ImportError: class psyobj: pass NOTICE: this problem should not occur with Pylint >= 0.5 since from this version Pylint is not looking anymore for information in living objects (i.e. it no longer imports analysed modules) .. _psyco: http://psyco.sf.net 5. Classes and Inheritance ========================== 5.1 When is Pylint considering a class as an interface? ------------------------------------------------------- A class is considered as an interface if there is a class named "Interface" somewhere in its inheritance tree. 5.2 When is Pylint considering that a class is implementing a given interface? -------------------------------------------------------------------------------- Pylint is using the Zope 2 interfaces conventions, and so is considering that a class is implementing interfaces listed in its __implements__ attribute. 5.3 When is Pylint considering a class as an abstract class? ------------------------------------------------------------- A class is considered as an abstract class if at least one of its methods is doing nothing but raising NotImplementedError. 5.4 How do I avoid "access to undefined member" messages in my mixin classes? ------------------------------------------------------------------------------- To do so you have to set the ignore-mixin-members option to "yes" (this is the default value) and to name your mixin class with a name which ends with "mixin" (whatever case). 6. Troubleshooting ================== 6.1 Pylint gave my code a negative rating out of ten. That can't be right! -------------------------------------------------------------------------- Even though the final rating Pylint renders is nominally out of ten, there's no lower bound on it. By default, the formula to calculate score is :: 10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10) However, this option can be changed in the Pylint rc file. If having negative values really bugs you, you can set the formula to be the minimum of 0 and the above expression. 6.2 Why does Pychecker catch problems with imports that Pylint doesn't? ------------------------------------------------------------------------ Pychecker and Pylint use different approaches. pychecker imports the modules and rummages around in the result, hence it sees my mangled sys.path. Pylint doesn't import any of the candidate modules and thus doesn't include any of import's side effects (good and bad). It traverses an AST representation of the code. 6.3 I think I found a bug in Pylint. What should I do? ------------------------------------------------------- Read http://docs.pylint.org/contribute#bug-reports-feedback 6.4 I have a question about Pylint that isn't answered here. ------------------------------------------------------------ Read http://docs.pylint.org/contribute#mailing-lists pylint-1.1.0/doc/index.rst0000664000175000017500000000126212142132502015111 0ustar sytsyt00000000000000 Pylint User Manual ================== Pylint's home page is at http://www.pylint.org and its forge is at https://bitbucket.org/logilab/pylint .. toctree:: :maxdepth: 2 intro run output message-control features extend ide-integration contribute tutorial faq wiki backlinks installation Content wanted -------------- It would be nice to include in the documentation the following information: - pylint plugins (how to write one, how to install a 3rd party plugin, how to configure Pylint to run it) - pylint brain project : what it is, how to install it... Please send your pull requests via bitbucket if you can help with the above. pylint-1.1.0/doc/wiki.rst0000664000175000017500000000015212133455704014756 0ustar sytsyt00000000000000====================== Pylint messages Wiki ====================== http://pylint-messages.wikidot.com/ pylint-1.1.0/doc/intro.rst0000664000175000017500000000721712133454460015155 0ustar sytsyt00000000000000.. -*- coding: utf-8 -*- ============== Introduction ============== What is Pylint? --------------- Pylint is a tool that checks for errors in Python code, tries to enforce a coding standard and looks for bad code smells. This is similar but nevertheless different from what pychecker_ provides, especially since pychecker explicitly does not bother with coding style. The default coding style used by Pylint is close to `PEP 008`_ (aka `Guido's style guide`_). For more information about code smells, refer to Martin Fowler's `refactoring book`_ Pylint will display a number of messages as it analyzes the code, as well as some statistics about the number of warnings and errors found in different files. The messages are classified under various categories such as errors and warnings (more below). If you run Pylint twice, it will display the statistics from the previous run together with the ones from the current run, so that you can see if the code has improved or not. Last but not least, the code is given an overall mark, based on the number an severity of the warnings and errors. This has proven to be very motivating for some programmers. Pylint was born in 2003 at Logilab_, that funded Sylvain Thénault to lead its development up to now. .. _pychecker: http://pychecker.sf.net .. _`PEP 008`: http://www.python.org/dev/peps/pep-0008/ .. _`Guido's style guide`: http://www.python.org/doc/essays/styleguide.html .. _`refactoring book`: http://www.refactoring.com/ .. _Logilab: http://www.logilab.fr What Pylint is not? ------------------- What Pylint says is not to be taken as gospel and Pylint isn't smarter than you are: it may warn you about things that you have conscientiously done. Pylint tries hard to report as few false positives as possible for errors, but it may be too verbose with warnings. That's for example because it tries to detect things that may be dangerous in a context, but are not in others, or because it checks for some things that you don't care about. Generally, you shouldn't expect Pylint to be totally quiet about your code, so don't necessarily be alarmed if it gives you a hell lot of messages for your project! :Quoting Alexandre Fayolle: My usage pattern for Pylint is to generally run ``pylint -E`` quite often to get stupid errors flagged before launching an application (or before committing). I generally run Pylint with all the bells and whistles activated some time before a release, when I want to cleanup the code. And when I do that I simply ignore tons of the false warnings (and I can do that without being driven mad by this dumb program which is not smart enough to understand the dynamicity of Python because I only run it once or twice a week in this mode) :Quoting Marteen Ter Huurne: In our project we just accepted that we have to make some modifications in our code to please Pylint: - stick to more naming conventions (unused variables ending in underscores, mix-in class names ending in "Mixin") - making all abstract methods explicit (rather than just not defining them in the superclass) - add ``# pylint: disable=X0123`` comments: - for messages which are useful in general, but not in a specific case - for Pylint bugs - for Pylint limitations (for instance Twisted's modules create a lot of definitions dynamically so Pylint does not know about them) The effort is worth it, since Pylint helps us a lot in keeping the code clean and finding errors early. Although most errors found by Pylint would also be found by the regression tests, by fixing them before committing, we save time. And our regression tests do not cover all code either, just the most complex parts. pylint-1.1.0/doc/extend.rst0000664000175000017500000000272512142132502015276 0ustar sytsyt00000000000000 Extending Pylint ================ Writing your own checker ------------------------ You can find some simple examples in the examples directory of the distribution (custom.py and custom_raw.py). I'll try to quickly explain the essentials here. First, there are two kinds of checkers : * raw checkers, which are analysing each module as a raw file stream * ast checkers, which are working on an ast representation of the module The ast representation used is an extension of the one provided with the standard Python distribution in the `ast package`_. The extension adds additional information and methods on the tree nodes to ease navigation and code introspection. An AST checker is a visitor, and should implement `visit_` or `leave_` methods for the nodes it's interested in. To get description of the different classes used in an ast tree, look at the `ast package`_ documentation. Checkers are ordered by priority. For each module, Pylint's engine: 1. give the module source file as a stream to raw checkers 2. get an ast representation for the module 3. make a depth first descent of the tree, calling visit_<> on each AST checker when entering a node, and living_<> on the back traversal Notice that the source code is probably the best source of documentation, it should be clear and well documented. Don't hesitate to ask for any information on the code-quality mailing list. .. _`ast package`: http://docs.python.org/2/library/ast pylint-1.1.0/doc/ide-integration.rst0000664000175000017500000001006712142132502017067 0ustar sytsyt00000000000000 ================= IDE integration ================= To use Pylint with Emacs, see http://www.emacswiki.org/emacs/PythonProgrammingInEmacs#toc8 To use Pylint with Vim, see http://www.vim.org/scripts/script.php?script_id=891 To use Pylint with Eclipse, see http://pydev.org To use Pylint with Komodo_, see http://mateusz.loskot.net/2006/01/15/running-pylint-from-komodo/ To use Pylint with gedit_, see http://live.gnome.org/Gedit/PylintPlugin To use Pylint with WingIDE_, see http://www.wingware.com/doc/edit/pylint Pylint is integrated in Eric_ IDE, see the `Project > Check` menu. Pylint is integrated in Spyder_, see http://packages.python.org/spyder/pylint.html Pylint is integrated in pyscripter_, see the `Tool -> Tools` menu. .. _Eric: http://eric-ide.python-projects.org/ .. _pyscripter: http://code.google.com/p/pyscripter/ .. _pydev: http://pydev.org .. _Komodo: http://www.activestate.com/Products/Komodo/ .. _gedit: http://www.gnome.org/projects/gedit/ .. _WingIDE: http://www.wingware.com/ .. _spyder: http://code.google.com/p/spyderlib/ Using Pylint thru flymake in Emacs ================================== To enable flymake for Python, insert the following into your .emacs: .. sourcecode:: common-lisp ;; Configure flymake for Python (setq pylint "epylint") (when (load "flymake" t) (defun flymake-pylint-init () (let* ((temp-file (flymake-init-create-temp-buffer-copy 'flymake-create-temp-inplace)) (local-file (file-relative-name temp-file (file-name-directory buffer-file-name)))) (list (expand-file-name pylint "") (list local-file)))) (add-to-list 'flymake-allowed-file-name-masks '("\\.py\\'" flymake-pylint-init))) ;; Set as a minor mode for Python (add-hook 'python-mode-hook '(lambda () (flymake-mode))) Above stuff is in pylint/elisp/pylint-flymake.el, which should be automatically installed on Debian systems, in which cases you don't have to put it in your .emacs file. Other things you may find useful to set: .. sourcecode:: common-lisp ;; Configure to wait a bit longer after edits before starting (setq-default flymake-no-changes-timeout '3) ;; Keymaps to navigate to the errors (add-hook 'python-mode-hook '(lambda () (define-key python-mode-map "\C-cn" 'flymake-goto-next-error))) (add-hook 'python-mode-hook '(lambda () (define-key python-mode-map "\C-cp" 'flymake-goto-prev-error))) Finally, by default flymake only displays the extra information about the error when you hover the mouse over the highlighted line. The following will use the minibuffer to display messages when you the cursor is on the line. .. sourcecode:: common-lisp ;; To avoid having to mouse hover for the error message, these functions make flymake error messages ;; appear in the minibuffer (defun show-fly-err-at-point () "If the cursor is sitting on a flymake error, display the message in the minibuffer" (require 'cl) (interactive) (let ((line-no (line-number-at-pos))) (dolist (elem flymake-err-info) (if (eq (car elem) line-no) (let ((err (car (second elem)))) (message "%s" (flymake-ler-text err))))))) (add-hook 'post-command-hook 'show-fly-err-at-point) Alternative, if you only wish to pollute the minibuffer after an explicit flymake-goto-* then use the following instead of a post-command-hook .. sourcecode:: common-lisp (defadvice flymake-goto-next-error (after display-message activate compile) "Display the error in the mini-buffer rather than having to mouse over it" (show-fly-err-at-point)) (defadvice flymake-goto-prev-error (after display-message activate compile) "Display the error in the mini-buffer rather than having to mouse over it" (show-fly-err-at-point)) Setup the MS Visual Studio .NET 2003 editor to call Pylint ========================================================== .. image:: _static/vs2003_config.jpeg The output of Pylint is then shown in the "Output" pane of the editor. pylint-1.1.0/doc/_build/0000775000175000017500000000000012255772544014532 5ustar sytsyt00000000000000pylint-1.1.0/doc/_build/html/0000775000175000017500000000000012255772544015476 5ustar sytsyt00000000000000pylint-1.1.0/doc/_build/html/output.html0000664000175000017500000002221512220525540017706 0ustar sytsyt00000000000000 Pylint output — Pylint 1.0.0 documentation

Pylint output¶

The default format for the output is raw text. You can change this by passing pylint the --output-format=<value> option. Possible values are: parseable, colorized, msvs (visual studio) and html.

Moreover you can customize the exact way information are displayed using the –msg-template=<format string> option. The format string uses the Python new format syntax and the following fields are available :

path
relative path to the file
abspath
absolute path to the file
line
line number
column
column number
module
module name
obj
object within the module (if any)
msg
text of the message
msg_id
the message code (eg. I0011)
symbol
symbolic name of the message (eg. locally-disabled)
C
one letter indication of the message category
category
fullname of the message category

For exemple the former (pre 1.0) default format can be obtained with:

pylint --msg-template='{msg_id}:{line:3d},{column}: {obj}: {msg}'

A few other examples:

  • the new default format:

    {C}:{line:3d},{column:2d}: {msg} ({symbol})
  • Visual Studio compatible format (former ‘msvs’ output format):

    {path}({line}): [{msg_id}{obj}] {msg}
  • Parseable (Emacs and all, former ‘parseable’ output format) format:

    {path}:{line}: [{msg_id}({symbol}), {obj}] {msg}

Source code analysis section¶

For each python module, Pylint will first display a few ‘*’ characters followed by the name of the module. Then, a number of messages with the following format:

MESSAGE_TYPE: LINE_NUM:[OBJECT:] MESSAGE

You can get another output format, useful since it’s recognized by most editors or other development tools using the --output-format=parseable option.

The message type can be:

  • [R]efactor for a “good practice” metric violation
  • [C]onvention for coding standard violation
  • [W]arning for stylistic problems, or minor programming issues
  • [E]rror for important programming issues (i.e. most probably bug)
  • [F]atal for errors which prevented further processing

Sometimes the line of code which caused the error is displayed with a caret pointing to the error. This may be generalized in future versions of Pylint.

Example (extracted from a run of Pylint on itself...):

************* Module pylint.checkers.format
W: 50: Too long line (86/80)
W:108: Operator not followed by a space
     print >>sys.stderr, 'Unable to match %r', line
            ^
W:141: Too long line (81/80)
W: 74:searchall: Unreachable code
W:171:FormatChecker.process_tokens: Redefining built-in (type)
W:150:FormatChecker.process_tokens: Too many local variables (20/15)
W:150:FormatChecker.process_tokens: Too many branches (13/12)

Reports section¶

Following the analysis message, Pylint will display a set of reports, each one focusing on a particular aspect of the project, such as number of messages by categories, modules dependencies...

For instance, the metrics report displays summaries gathered from the current run.

  • the number of processed modules
  • for each module, the percentage of errors and warnings
  • the total number of errors and warnings
  • percentage of classes, functions and modules with docstrings, and a comparison from the previous run
  • percentage of classes, functions and modules with correct name (according to the coding standard), and a comparison from the previous run
  • a list of external dependencies found in the code, and where they appear

Also, a global evaluation for the code is computed.

Table Of Contents

Previous topic

Running Pylint

Next topic

Messages control

This Page

pylint-1.1.0/doc/_build/html/faq.html0000664000175000017500000006450512220525536017132 0ustar sytsyt00000000000000 Frequently Asked Questions — Pylint 1.0.0 documentation

Frequently Asked Questions¶

1. About Pylint¶

1.1 What is Pylint?¶

Pylint is a static code checker, meaning it can analyse your code without actually running it. Pylint checks for errors, tries to enforce a coding standard, and tries to enforce a coding style.

1.2 How is Pylint different from Pychecker?¶

A major difference between Pylint and Pychecker is that Pylint checks for style issues, while Pychecker explicitly does not. There are a few other differences, such as the fact that Pylint does not import live modules while Pychecker does (see 6.2 Why does Pychecker catch problems with imports that Pylint doesn’t?).

1.3 Who wrote Pylint?¶

Pylint’s main author and maintainer for the first ten years of its life has been Sylvain Thénault, while he worked at Logilab where the project was born. For a full list of contributors, see the “Contributors” section of Pylint’s README file.

1.4 Who uses Pylint?¶

Everybody knows someone who uses Pylint.

2. Installation¶

2.1 How do I install Pylint?¶

Everything should be explained on http://docs.pylint.org/installation

2.2 What kind of versioning system does Pylint use?¶

Pylint uses the Mercurial distributed version control system. The URL of the repository is: https://bitbucket.org/logilab/pylint. To get the latest version of Pylint from the repository, simply invoke

hg clone https://bitbucket.org/logilab/pylint

2.3 What are Pylint’s dependencies?¶

Pylint requires the latest astroid and logilab-common packages. It should be compatible with any Python version greater than 2.5.0.

3. Running Pylint¶

3.1 Can I give pylint a file as an argument instead of a module?¶

Pylint expects the name of a package or module as its argument. As a convenience, you can give it a file name if it’s possible to guess a module name from the file’s path using the python path. Some examples :

“pylint mymodule.py” should always work since the current working directory is automatically added on top of the python path

“pylint directory/mymodule.py” will work if “directory” is a python package (i.e. has an __init__.py file) or if “directory” is in the python path.

“pylint /whatever/directory/mymodule.py” will work if either:

  • “/whatever/directory” is in the python path
  • your cwd is “/whatever/directory”
  • “directory” is a python package and “/whatever” is in the python path
  • “directory” is a python package and your cwd is “/whatever” and so on...

3.2 Where is the persistent data stored to compare between successive runs?¶

Analysis data are stored as a pickle file in a directory which is localized using the following rules:

  • value of the PYLINTHOME environment variable if set

  • ”.pylint.d” subdirectory of the user’s home directory if it is found

    (not always findable on Windows platforms)

  • ”.pylint.d” directory in the current directory

3.3 How do I find the option name (for pylintrc) corresponding to a specific command line option?¶

You can always generate a sample pylintrc file with –generate-rcfile Every option present on the command line before this will be included in the rc file

For example:

pylint --disable=W0702,C0103 --class-rgx='[A-Z][a-z]+' --generate-rcfile

3.4 I’d rather not run Pylint from the command line. Can I integrate it with my editor?¶

Much probably. Read http://docs.pylint.org/ide-integration

4. Message Control¶

4.1 Is it possible to locally disable a particular message?¶

Yes, this feature has been added in Pylint 0.11. This may be done by adding “#pylint: disable=W0123,E4567” at the desired block level or at the end of the desired line of code

4.2 Is there a way to disable a message for a particular module only?¶

Yes, you can disable or enable (globally disabled) messages at the module level by adding the corresponding option in a comment at the top of the file:

# pylint: disable=W0401, E0202
# pylint: enable=C0302

4.3 How can I tell Pylint to never check a given module?¶

With Pylint < 0.25, add “#pylint: disable-all” at the beginning of the module. Pylint 0.26.1 and up have renamed that directive to “#pylint: skip-file” (but the first version will be kept for backward compatibility).

In order to ease finding which modules are ignored a Information-level message I0013 is emited. With recent versions of Pylint, if you use the old syntax, an additional I0014 message is emited.

4.4 Do I have to remember all these numbers?¶

No, starting from 0.25.3, you can use symbolic names for messages:

# pylint: disable=fixme, line-too-long

You can show these symbols in the output with the -sy option.

4.5 I have a callback function where I have no control over received arguments. How do I avoid getting unused argument warnings?¶

Prefix (ui) the callback’s name by cb_, as in cb_onclick(...). By doing so arguments usage won’t be checked. Another solution is to use one of the names defined in the “dummy-variables” configuration variable for unused argument (“_” and “dummy” by default).

4.6 What is the format of the configuration file?¶

Pylint uses ConfigParser from the standard library to parse the configuration file. It means that if you need to disable a lot of messages, you can use tricks like:

disable= W0401, # because I do not want it
 E0202, # I have a good reason, trust me
 C0302  # that's it

4.7 Why do I get a lot of spurious “unused variables messages” when using psyobj from psyco?¶

This is actually due to a bug in psyco, making the locals() function for objects inheriting from psyobj returning an empty dictionary. For the moment, the only way to fix this is to use the PYLINT_IMPORT environment variable to not use psyco during Pylint checking. Sample code

import os
try:
        if os.environ.has_key('PYLINT_IMPORT'):
                raise ImportError()
from psyco.classes import psyobj
except ImportError:
        class psyobj:
                pass

NOTICE: this problem should not occur with Pylint >= 0.5 since from this version Pylint is not looking anymore for information in living objects (i.e. it no longer imports analysed modules)

5. Classes and Inheritance¶

5.1 When is Pylint considering a class as an interface?¶

A class is considered as an interface if there is a class named “Interface” somewhere in its inheritance tree.

5.2 When is Pylint considering that a class is implementing a given interface?¶

Pylint is using the Zope 2 interfaces conventions, and so is considering that a class is implementing interfaces listed in its __implements__ attribute.

5.3 When is Pylint considering a class as an abstract class?¶

A class is considered as an abstract class if at least one of its methods is doing nothing but raising NotImplementedError.

5.4 How do I avoid “access to undefined member” messages in my mixin classes?¶

To do so you have to set the ignore-mixin-members option to “yes” (this is the default value) and to name your mixin class with a name which ends with “mixin” (whatever case).

6. Troubleshooting¶

6.1 Pylint gave my code a negative rating out of ten. That can’t be right!¶

Even though the final rating Pylint renders is nominally out of ten, there’s no lower bound on it. By default, the formula to calculate score is

10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10)

However, this option can be changed in the Pylint rc file. If having negative values really bugs you, you can set the formula to be the minimum of 0 and the above expression.

6.2 Why does Pychecker catch problems with imports that Pylint doesn’t?¶

Pychecker and Pylint use different approaches. pychecker imports the modules and rummages around in the result, hence it sees my mangled sys.path. Pylint doesn’t import any of the candidate modules and thus doesn’t include any of import’s side effects (good and bad). It traverses an AST representation of the code.

6.3 I think I found a bug in Pylint. What should I do?¶

Read http://docs.pylint.org/contribute#bug-reports-feedback

6.4 I have a question about Pylint that isn’t answered here.¶

Read http://docs.pylint.org/contribute#mailing-lists

Table Of Contents

Previous topic

A Beginner’s Guide to Code Standards in Python - Pylint Tutorial

Next topic

Pylint messages Wiki

This Page

pylint-1.1.0/doc/_build/html/extend.html0000664000175000017500000001363512220525536017650 0ustar sytsyt00000000000000 Extending Pylint — Pylint 1.0.0 documentation

Extending Pylint¶

Writing your own checker¶

You can find some simple examples in the examples directory of the distribution (custom.py and custom_raw.py). I’ll try to quickly explain the essentials here.

First, there are two kinds of checkers : * raw checkers, which are analysing each module as a raw file stream * ast checkers, which are working on an ast representation of the module

The ast representation used is an extension of the one provided with the standard Python distribution in the ast package. The extension adds additional information and methods on the tree nodes to ease navigation and code introspection.

An AST checker is a visitor, and should implement visit_<lowered class name> or leave_<lowered class name> methods for the nodes it’s interested in. To get description of the different classes used in an ast tree, look at the ast package documentation. Checkers are ordered by priority. For each module, Pylint’s engine:

  1. give the module source file as a stream to raw checkers
  2. get an ast representation for the module
  3. make a depth first descent of the tree, calling visit_<> on each AST checker when entering a node, and living_<> on the back traversal

Notice that the source code is probably the best source of documentation, it should be clear and well documented. Don’t hesitate to ask for any information on the code-quality mailing list.

Table Of Contents

Previous topic

Pylint features

Next topic

IDE integration

This Page

pylint-1.1.0/doc/_build/html/ide-integration.html0000664000175000017500000003355412220525537021446 0ustar sytsyt00000000000000 IDE integration — Pylint 1.0.0 documentation

IDE integration¶

To use Pylint with Emacs, see http://www.emacswiki.org/emacs/PythonProgrammingInEmacs#toc8

To use Pylint with Vim, see http://www.vim.org/scripts/script.php?script_id=891

To use Pylint with Eclipse, see http://pydev.org

To use Pylint with Komodo, see http://mateusz.loskot.net/2006/01/15/running-pylint-from-komodo/

To use Pylint with gedit, see http://live.gnome.org/Gedit/PylintPlugin

To use Pylint with WingIDE, see http://www.wingware.com/doc/edit/pylint

Pylint is integrated in Eric IDE, see the Project > Check menu.

Pylint is integrated in Spyder, see http://packages.python.org/spyder/pylint.html

Pylint is integrated in pyscripter, see the Tool -> Tools menu.

Using Pylint thru flymake in Emacs¶

To enable flymake for Python, insert the following into your .emacs:

;; Configure flymake for Python
(setq pylint "epylint")
(when (load "flymake" t)
  (defun flymake-pylint-init ()
    (let* ((temp-file (flymake-init-create-temp-buffer-copy
                       'flymake-create-temp-inplace))
           (local-file (file-relative-name
                        temp-file
                        (file-name-directory buffer-file-name))))
      (list (expand-file-name pylint "") (list local-file))))
  (add-to-list 'flymake-allowed-file-name-masks
               '("\\.py\\'" flymake-pylint-init)))

;; Set as a minor mode for Python
(add-hook 'python-mode-hook '(lambda () (flymake-mode)))

Above stuff is in pylint/elisp/pylint-flymake.el, which should be automatically installed on Debian systems, in which cases you don’t have to put it in your .emacs file.

Other things you may find useful to set:

;; Configure to wait a bit longer after edits before starting
(setq-default flymake-no-changes-timeout '3)

;; Keymaps to navigate to the errors
(add-hook 'python-mode-hook '(lambda () (define-key python-mode-map "\C-cn" 'flymake-goto-next-error)))
(add-hook 'python-mode-hook '(lambda () (define-key python-mode-map "\C-cp" 'flymake-goto-prev-error)))

Finally, by default flymake only displays the extra information about the error when you hover the mouse over the highlighted line. The following will use the minibuffer to display messages when you the cursor is on the line.

;; To avoid having to mouse hover for the error message, these functions make flymake error messages
;; appear in the minibuffer
(defun show-fly-err-at-point ()
  "If the cursor is sitting on a flymake error, display the message in the minibuffer"
  (require 'cl)
  (interactive)
  (let ((line-no (line-number-at-pos)))
    (dolist (elem flymake-err-info)
      (if (eq (car elem) line-no)
      (let ((err (car (second elem))))
        (message "%s" (flymake-ler-text err)))))))

(add-hook 'post-command-hook 'show-fly-err-at-point)

Alternative, if you only wish to pollute the minibuffer after an explicit flymake-goto-* then use the following instead of a post-command-hook

(defadvice flymake-goto-next-error (after display-message activate compile)
  "Display the error in the mini-buffer rather than having to mouse over it"
  (show-fly-err-at-point))

(defadvice flymake-goto-prev-error (after display-message activate compile)
  "Display the error in the mini-buffer rather than having to mouse over it"
  (show-fly-err-at-point))

Setup the MS Visual Studio .NET 2003 editor to call Pylint¶

_images/vs2003_config.jpeg

The output of Pylint is then shown in the “Output” pane of the editor.

Table Of Contents

Previous topic

Extending Pylint

Next topic

Contribute

This Page

pylint-1.1.0/doc/_build/html/wiki.html0000664000175000017500000001005112220525540017304 0ustar sytsyt00000000000000 Pylint messages Wiki — Pylint 1.0.0 documentation

Previous topic

Frequently Asked Questions

Next topic

Some projects using Pylint

This Page

pylint-1.1.0/doc/_build/html/features.html0000664000175000017500000027316612220525765020212 0ustar sytsyt00000000000000 Pylint features — Pylint 1.0.0 documentation

Pylint features¶

Options¶

General options¶

rcfile:

Specify a configuration file.

init-hook:

Python code to execute, usually for sys.path manipulation such as pygtk.require().

errors-only:

In error mode, checkers without error messages are disabled and for others, only the ERROR messages are displayed, and no reports are done by default

profile:

Profiled execution.

ignore:

Add files or directories to the blacklist. They should be base names, not paths.

Default: .hg,test

persistent:

Pickle collected data for later comparisons.

Default: yes

load-plugins:

List of plugins (as comma separated values of python modules names) to load, usually to register additional checkers.

long-help:

more verbose help.

Commands options¶

help-msg:Display a help message for the given message id and exit. The value may be a comma separated list of message ids.
list-msgs:Generate pylint’s messages.
full-documentation:
 Generate pylint’s full documentation.
generate-rcfile:
 Generate a sample configuration file according to the current configuration. You can put other options before this one to get them in the generated configuration.
generate-man:Generate pylint’s man page.

Messages control options¶

enable:Enable the message, report, category or checker with the given id(s). You can either give multiple identifier separated by comma (,) or put this option multiple time. See also the “–disable” option for examples.
disable:Disable the message, report, category or checker with the given id(s). You can either give multiple identifiers separated by comma (,) or put this option multiple times (only on the command line, not in the configuration file where it should appear only once).You can also use “–disable=all” to disable everything first and then reenable specific checks. For example, if you want to run only the similarities checker, you can use “–disable=all –enable=similarities”. If you want to run only the classes checker, but have no Warning level messages displayed, use”–disable=all –enable=classes –disable=W”

Reports options¶

output-format:

Set the output format. Available formats are text, parseable, colorized, msvs (visual studio) and html. You can also give a reporter class, eg mypackage.mymodule.MyReporterClass.

Default: text

files-output:

Put messages in a separate file for each module / package specified on the command line instead of printing them on stdout. Reports (if any) will be written in a file name “pylint_global.[txt|html]”.

reports:

Tells whether to display a full report or only the messages

Default: yes

evaluation:

Python expression which should return a note less than 10 (10 is the highest note). You have access to the variables errors warning, statement which respectively contain the number of errors / warnings messages and the total number of statements analyzed. This is used by the global evaluation report (RP0004).

Default: 10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10)

comment:

Add a comment according to your evaluation note. This is used by the global evaluation report (RP0004).

msg-template:

Template used to display messages. This is a python new-style format string used to format the message information. See doc for all details

logging checker¶

Messages¶

logging-unsupported-format (E1200):
 Unsupported logging format character %r (%#02x) at index %d Used when an unsupported format character is used in a logging statement format string.
logging-format-truncated (E1201):
 Logging format string ends in middle of conversion specifier Used when a logging statement format string terminates before the end of a conversion specifier.
logging-too-many-args (E1205):
 Too many arguments for logging format string Used when a logging format string is given too few arguments.
logging-too-few-args (E1206):
 Not enough arguments for logging format string Used when a logging format string is given too many arguments
logging-not-lazy (W1201):
 Specify string format arguments as logging function parameters Used when a logging statement has a call form of “logging.<logging method>(format_string % (format_args...))”. Such calls should leave string interpolation to the logging method itself and be written “logging.<logging method>(format_string, format_args...)” so that the program may avoid incurring the cost of the interpolation in those cases in which no message will be logged. For more, see http://www.python.org/dev/peps/pep-0282/.

string checker¶

Messages¶

bad-format-character (E1300):
 Unsupported format character %r (%#02x) at index %d Used when a unsupported format character is used in a format string.
truncated-format-string (E1301):
 Format string ends in middle of conversion specifier Used when a format string terminates before the end of a conversion specifier.
mixed-format-string (E1302):
 Mixing named and unnamed conversion specifiers in format string Used when a format string contains both named (e.g. ‘%(foo)d’) and unnamed (e.g. ‘%d’) conversion specifiers. This is also used when a named conversion specifier contains * for the minimum field width and/or precision.
format-needs-mapping (E1303):
 Expected mapping for format string, not %s Used when a format string that uses named conversion specifiers is used with an argument that is not a mapping.
missing-format-string-key (E1304):
 Missing key %r in format string dictionary Used when a format string that uses named conversion specifiers is used with a dictionary that doesn’t contain all the keys required by the format string.
too-many-format-args (E1305):
 Too many arguments for format string Used when a format string that uses unnamed conversion specifiers is given too few arguments.
too-few-format-args (E1306):
 Not enough arguments for format string Used when a format string that uses unnamed conversion specifiers is given too many arguments
bad-str-strip-call (E1310):
 Suspicious argument in %s.%s call The argument to a str.{l,r,}strip call contains a duplicate character,
bad-format-string-key (W1300):
 Format string dictionary key should be a string, not %s Used when a format string that uses named conversion specifiers is used with a dictionary whose keys are not all strings.
unused-format-string-key (W1301):
 Unused key %r in format string dictionary Used when a format string that uses named conversion specifiers is used with a dictionary that conWtains keys not required by the format string.

format checker¶

Options¶

max-line-length:
 

Maximum number of characters on a single line.

Default: 80

ignore-long-lines:
 

Regexp for a line that is allowed to be longer than the limit.

Default: ^\s*(# )?<?https?://\S+>?$

max-module-lines:
 

Maximum number of lines in a module

Default: 1000

indent-string:

String used as indentation unit. This is usually ” ” (4 spaces) or “t” (1 tab).

Default: '    '

Messages¶

unnecessary-semicolon (W0301):
 Unnecessary semicolon Used when a statement is ended by a semi-colon (”;”), which isn’t necessary (that’s python, not C ;).
bad-indentation (W0311):
 Bad indentation. Found %s %s, expected %s Used when an unexpected number of indentation’s tabulations or spaces has been found.
mixed-indentation (W0312):
 Found indentation with %ss instead of %ss Used when there are some mixed tabs and spaces in a module.
old-ne-operator (W0331):
 Use of the <> operator Used when the deprecated “<>” operator is used instead of ”!=”.
lowercase-l-suffix (W0332):
 Use of “l” as long integer identifier Used when a lower case “l” is used to mark a long integer. You should use a upper case “L” since the letter “l” looks too much like the digit “1”
backtick (W0333):
 Use of the `` operator Used when the deprecated “``” (backtick) operator is used instead of the str() function.
line-too-long (C0301):
 Line too long (%s/%s) Used when a line is longer than a given number of characters.
too-many-lines (C0302):
 Too many lines in module (%s) Used when a module has too much lines, reducing its readability.
trailing-whitespace (C0303):
 Trailing whitespace Used when there is whitespace between the end of a line and the newline.
missing-final-newline (C0304):
 Final newline missing Used when the last line in a file is missing a newline.
multiple-statements (C0321):
 More than one statement on a single line Used when more than on statement are found on the same line.
no-space-before-operator (C0322):
 Operator not preceded by a space Used when one of the following operator (!= | <= | == | >= | < | > | = | += | -= | *= | /= | %) is not preceded by a space.
no-space-after-operator (C0323):
 Operator not followed by a space Used when one of the following operator (!= | <= | == | >= | < | > | = | += | -= | *= | /= | %) is not followed by a space.
no-space-after-comma (C0324):
 Comma not followed by a space Used when a comma (”,”) is not followed by a space.

imports checker¶

Options¶

deprecated-modules:
 

Deprecated modules which should not be used, separated by a comma

Default: regsub,string,TERMIOS,Bastion,rexec

import-graph:

Create a graph of every (i.e. internal and external) dependencies in the given file (report RP0402 must not be disabled)

ext-import-graph:
 

Create a graph of external dependencies in the given file (report RP0402 must not be disabled)

int-import-graph:
 

Create a graph of internal dependencies in the given file (report RP0402 must not be disabled)

Messages¶

wildcard-import (W0401):
 Wildcard import %s Used when from module import * is detected.
deprecated-module (W0402):
 Uses of a deprecated module %r Used a module marked as deprecated is imported.
relative-import (W0403):
 Relative import %r, should be %r Used when an import relative to the package directory is detected.
reimported (W0404):
 Reimport %r (imported line %s) Used when a module is reimported multiple times.
import-self (W0406):
 Module import itself Used when a module is importing itself.
misplaced-future (W0410):
 __future__ import is not the first non docstring statement Python 2.5 and greater require __future__ import to be the first non docstring statement in the module.
cyclic-import (R0401):
 Cyclic import (%s) Used when a cyclic import between two or more modules is detected.
import-error (F0401):
 Unable to import %s Used when pylint has been unable to import a module.

Reports¶

RP0401:External dependencies
RP0402:Modules dependencies graph

variables checker¶

Options¶

init-import:

Tells whether we should check for unused import in __init__ files.

dummy-variables-rgx:
 

A regular expression matching the beginning of the name of dummy variables (i.e. not used).

Default: _|dummy

additional-builtins:
 

List of additional names supposed to be defined in builtins. Remember that you should avoid to define new builtins when possible.

Messages¶

used-before-assignment (E0601):
 Using variable %r before assignment Used when a local variable is accessed before it’s assignment.
undefined-variable (E0602):
 Undefined variable %r Used when an undefined variable is accessed.
undefined-all-variable (E0603):
 Undefined variable name %r in __all__ Used when an undefined variable name is referenced in __all__.
invalid-all-object (E0604):
 Invalid object %r in __all__, must contain only strings Used when an invalid (non-string) object occurs in __all__.
no-name-in-module (E0611):
 No name %r in module %r Used when a name cannot be found in a module.
global-variable-undefined (W0601):
 Global variable %r undefined at the module level Used when a variable is defined through the “global” statement but the variable is not defined in the module scope.
global-variable-not-assigned (W0602):
 Using global for %r but no assignment is done Used when a variable is defined through the “global” statement but no assignment to this variable is done.
global-statement (W0603):
 Using the global statement Used when you use the “global” statement to update a global variable. PyLint just try to discourage this usage. That doesn’t mean you can not use it !
global-at-module-level (W0604):
 Using the global statement at the module level Used when you use the “global” statement at the module level since it has no effect
unused-import (W0611):
 Unused import %s Used when an imported module or variable is not used.
unused-variable (W0612):
 Unused variable %r Used when a variable is defined but not used.
unused-argument (W0613):
 Unused argument %r Used when a function or method argument is not used.
unused-wildcard-import (W0614):
 Unused import %s from wildcard import Used when an imported module or variable is not used from a ‘from X import *‘ style import.
redefined-outer-name (W0621):
 Redefining name %r from outer scope (line %s) Used when a variable’s name hide a name defined in the outer scope.
redefined-builtin (W0622):
 Redefining built-in %r Used when a variable or function override a built-in.
redefine-in-handler (W0623):
 Redefining name %r from %s in exception handler Used when an exception handler assigns the exception to an existing name
undefined-loop-variable (W0631):
 Using possibly undefined loop variable %r Used when an loop variable (i.e. defined by a for loop or a list comprehension or a generator expression) is used outside the loop.
unbalanced-tuple-unpacking (W0632):
 Possible unbalanced tuple unpacking: left side has %d label(s), right side has %d value(s) Used when there is an unbalanced tuple unpacking in assignment

basic checker¶

Options¶

required-attributes:
 

Required attributes for module, separated by a comma

bad-functions:

List of builtins function names that should not be used, separated by a comma

Default: map,filter,apply,input

module-rgx:

Regular expression which should only match correct module names

Default: (([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$

const-rgx:

Regular expression which should only match correct module level names

Default: (([A-Z_][A-Z0-9_]*)|(__.*__))$

class-rgx:

Regular expression which should only match correct class names

Default: [A-Z_][a-zA-Z0-9]+$

function-rgx:

Regular expression which should only match correct function names

Default: [a-z_][a-z0-9_]{2,30}$

method-rgx:

Regular expression which should only match correct method names

Default: [a-z_][a-z0-9_]{2,30}$

attr-rgx:

Regular expression which should only match correct instance attribute names

Default: [a-z_][a-z0-9_]{2,30}$

argument-rgx:

Regular expression which should only match correct argument names

Default: [a-z_][a-z0-9_]{2,30}$

variable-rgx:

Regular expression which should only match correct variable names

Default: [a-z_][a-z0-9_]{2,30}$

class-attribute-rgx:
 

Regular expression which should only match correct attribute names in class bodies

Default: ([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__))$

inlinevar-rgx:

Regular expression which should only match correct list comprehension / generator expression variable names

Default: [A-Za-z_][A-Za-z0-9_]*$

good-names:

Good variable names which should always be accepted, separated by a comma

Default: i,j,k,ex,Run,_

bad-names:

Bad variable names which should always be refused, separated by a comma

Default: foo,bar,baz,toto,tutu,tata

no-docstring-rgx:
 

Regular expression which should only match function or class names that do not require a docstring.

Default: __.*__

docstring-min-length:
 

Minimum line length for functions/classes that require docstrings, shorter ones are exempt.

Default: -1

Messages¶

init-is-generator (E0100):
 __init__ method is a generator Used when the special class method __init__ is turned into a generator by a yield in its body.
return-in-init (E0101):
 Explicit return in __init__ Used when the special class method __init__ has an explicit return value.
function-redefined (E0102):
 %s already defined line %s Used when a function / class / method is redefined.
not-in-loop (E0103):
 %r not properly in loop Used when break or continue keywords are used outside a loop.
return-outside-function (E0104):
 Return outside function Used when a “return” statement is found outside a function or method.
yield-outside-function (E0105):
 Yield outside function Used when a “yield” statement is found outside a function or method.
return-arg-in-generator (E0106):
 Return with argument inside generator Used when a “return” statement with an argument is found outside in a generator function or method (e.g. with some “yield” statements).
nonexistent-operator (E0107):
 Use of the non-existent %s operator Used when you attempt to use the C-style pre-increment orpre-decrement operator – and ++, which doesn’t exist in Python.
duplicate-argument-name (E0108):
 Duplicate argument name %s in function definition Duplicate argument names in function definitions are syntax errors.
unreachable (W0101):
 Unreachable code Used when there is some code behind a “return” or “raise” statement, which will never be accessed.
dangerous-default-value (W0102):
 Dangerous default value %s as argument Used when a mutable value as list or dictionary is detected in a default value for an argument.
pointless-statement (W0104):
 Statement seems to have no effect Used when a statement doesn’t have (or at least seems to) any effect.
pointless-string-statement (W0105):
 String statement has no effect Used when a string is used as a statement (which of course has no effect). This is a particular case of W0104 with its own message so you can easily disable it if you’re using those strings as documentation, instead of comments.
expression-not-assigned (W0106):
 Expression “%s” is assigned to nothing Used when an expression that is not a function call is assigned to nothing. Probably something else was intended.
unnecessary-pass (W0107):
 Unnecessary pass statement Used when a “pass” statement that can be avoided is encountered.
unnecessary-lambda (W0108):
 Lambda may not be necessary Used when the body of a lambda expression is a function call on the same argument list as the lambda itself; such lambda expressions are in all but a few cases replaceable with the function being called in the body of the lambda.
duplicate-key (W0109):
 Duplicate key %r in dictionary Used when a dictionary expression binds the same key multiple times.
deprecated-lambda (W0110):
 map/filter on lambda could be replaced by comprehension Used when a lambda is the first argument to “map” or “filter”. It could be clearer as a list comprehension or generator expression. This message can’t be emitted when using Python >= 3.0.
useless-else-on-loop (W0120):
 Else clause on loop without a break statement Loops should only have an else clause if they can exit early with a break statement, otherwise the statements under else should be on the same scope as the loop itself.
old-raise-syntax (W0121):
 Use raise ErrorClass(args) instead of raise ErrorClass, args. Used when the alternate raise syntax ‘raise foo, bar’ is used instead of ‘raise foo(bar)’. This message can’t be emitted when using Python >= 3.0.
exec-used (W0122):
 Use of exec Used when you use the “exec” statement (function for Python 3), to discourage its usage. That doesn’t mean you can not use it !
bad-builtin (W0141):
 Used builtin function %r Used when a black listed builtin function is used (see the bad-function option). Usual black listed functions are the ones like map, or filter , where Python offers now some cleaner alternative like list comprehension.
star-args (W0142):
 Used * or * magic* Used when a function or method is called using *args or **kwargs to dispatch arguments. This doesn’t improve readability and should be used with care.
lost-exception (W0150):
 %s statement in finally block may swallow exception Used when a break or a return statement is found inside the finally clause of a try...finally block: the exceptions raised in the try clause will be silently swallowed instead of being re-raised.
assert-on-tuple (W0199):
 Assert called on a 2-uple. Did you mean ‘assert x,y’? A call of assert on a tuple will always evaluate to true if the tuple is not empty, and will always evaluate to false if it is.
blacklisted-name (C0102):
 Black listed name “%s” Used when the name is listed in the black list (unauthorized names).
invalid-name (C0103):
 Invalid %s name “%s” Used when the name doesn’t match the regular expression associated to its type (constant, variable, class...).
missing-docstring (C0111):
 Missing %s docstring Used when a module, function, class or method has no docstring. Some special methods like __init__ doesn’t necessary require a docstring.
empty-docstring (C0112):
 Empty %s docstring Used when a module, function, class or method has an empty docstring (it would be too easy ;).
missing-module-attribute (C0121):
 Missing required attribute “%s” Used when an attribute required for modules is missing.

Reports¶

RP0101:Statistics by type

miscellaneous checker¶

Options¶

notes:

List of note tags to take in consideration, separated by a comma.

Default: FIXME,XXX,TODO

Messages¶

fixme (W0511):Used when a warning note as FIXME or XXX is detected.
invalid-encoded-data (W0512):
 Cannot decode using encoding “%s”, unexpected byte at position %d Used when a source line cannot be decoded using the specified source file encoding. This message can’t be emitted when using Python >= 3.0.

open_mode checker¶

Messages¶

bad-open-mode (W1501):
 “%s” is not a valid mode for open. Python supports: r, w, a modes with b, +, and U options. See http://docs.python.org/2/library/functions.html#open

metrics checker¶

Reports¶

RP0701:Raw metrics

classes checker¶

Options¶

ignore-iface-methods:
 

List of interface methods to ignore, separated by a comma. This is used for instance to not check methods defines in Zope’s Interface base class.

Default: isImplementedBy,deferred,extends,names,namesAndDescriptions,queryDescriptionFor,getBases,getDescriptionFor,getDoc,getName,getTaggedValue,getTaggedValueTags,isEqualOrExtendedBy,setTaggedValue,isImplementedByInstancesOf,adaptWith,is_implemented_by

defining-attr-methods:
 

List of method names used to declare (i.e. assign) instance attributes.

Default: __init__,__new__,setUp

valid-classmethod-first-arg:
 

List of valid names for the first argument in a class method.

Default: cls

valid-metaclass-classmethod-first-arg:
 

List of valid names for the first argument in a metaclass class method.

Default: mcs

Messages¶

method-hidden (E0202):
 An attribute affected in %s line %s hide this method Used when a class defines a method which is hidden by an instance attribute from an ancestor class or set by some client code.
access-member-before-definition (E0203):
 Access to member %r before its definition line %s Used when an instance member is accessed before it’s actually assigned.
no-method-argument (E0211):
 Method has no argument Used when a method which should have the bound instance as first argument has no argument defined.
no-self-argument (E0213):
 Method should have “self” as first argument Used when a method has an attribute different the “self” as first argument. This is considered as an error since this is a so common convention that you shouldn’t break it!
interface-is-not-class (E0221):
 Interface resolved to %s is not a class Used when a class claims to implement an interface which is not a class.
missing-interface-method (E0222):
 Missing method %r from %s interface Used when a method declared in an interface is missing from a class implementing this interface
attribute-defined-outside-init (W0201):
 Attribute %r defined outside __init__ Used when an instance attribute is defined outside the __init__ method.
bad-staticmethod-argument (W0211):
 Static method with %r as first argument Used when a static method has “self” or a value specified in valid-classmethod-first-arg option or valid-metaclass-classmethod-first-arg option as first argument.
protected-access (W0212):
 Access to a protected member %s of a client class Used when a protected member (i.e. class member with a name beginning with an underscore) is access outside the class or a descendant of the class where it’s defined.
arguments-differ (W0221):
 Arguments number differs from %s method Used when a method has a different number of arguments than in the implemented interface or in an overridden method.
signature-differs (W0222):
 Signature differs from %s method Used when a method signature is different than in the implemented interface or in an overridden method.
abstract-method (W0223):
 Method %r is abstract in class %r but is not overridden Used when an abstract method (i.e. raise NotImplementedError) is not overridden in concrete class.
super-init-not-called (W0231):
 __init__ method from base class %r is not called Used when an ancestor class method has an __init__ method which is not called by a derived class.
no-init (W0232):
 Class has no __init__ method Used when a class has no __init__ method, neither its parent classes.
non-parent-init-called (W0233):
 __init__ method from a non direct base class %r is called Used when an __init__ method is called on a class which is not in the direct ancestors for the analysed class.
non-iterator-returned (W0234):
 __iter__ returns non-iterator Used when an __iter__ method returns something which is not an iterable (i.e. has no next method)
no-self-use (R0201):
 Method could be a function Used when a method doesn’t use its bound instance, and so could be written as a function.
bad-classmethod-argument (C0202):
 Class method %s should have %s as first argument Used when a class method has a first argument named differently than the value specified in valid-classmethod-first-arg option (default to “cls”), recommended to easily differentiate them from regular instance methods.
bad-mcs-method-argument (C0203):
 Metaclass method %s should have %s as first argument Used when a metaclass method has a first agument named differently than the value specified in valid-classmethod-first-arg option (default to “cls”), recommended to easily differentiate them from regular instance methods.
bad-mcs-classmethod-argument (C0204):
 Metaclass class method %s should have %s as first argument Used when a metaclass class method has a first argument named differently than the value specified in valid-metaclass-classmethod-first-arg option (default to “mcs”), recommended to easily differentiate them from regular instance methods.
method-check-failed (F0202):
 Unable to check methods signature (%s / %s) Used when PyLint has been unable to check methods signature compatibility for an unexpected reason. Please report this kind if you don’t make sense of it.
unresolved-interface (F0220):
 failed to resolve interfaces implemented by %s (%s) Used when a PyLint as failed to find interfaces implemented by a class

design checker¶

Options¶

max-args:

Maximum number of arguments for function / method

Default: 5

ignored-argument-names:
 

Argument names that match this expression will be ignored. Default to name with leading underscore

Default: _.*

max-locals:

Maximum number of locals for function / method body

Default: 15

max-returns:

Maximum number of return / yield for function / method body

Default: 6

max-branches:

Maximum number of branch for function / method body

Default: 12

max-statements:

Maximum number of statements in function / method body

Default: 50

max-parents:

Maximum number of parents for a class (see R0901).

Default: 7

max-attributes:

Maximum number of attributes for a class (see R0902).

Default: 7

min-public-methods:
 

Minimum number of public methods for a class (see R0903).

Default: 2

max-public-methods:
 

Maximum number of public methods for a class (see R0904).

Default: 20

Messages¶

too-many-ancestors (R0901):
 Too many ancestors (%s/%s) Used when class has too many parent classes, try to reduce this to get a simpler (and so easier to use) class.
too-many-instance-attributes (R0902):
 Too many instance attributes (%s/%s) Used when class has too many instance attributes, try to reduce this to get a simpler (and so easier to use) class.
too-few-public-methods (R0903):
 Too few public methods (%s/%s) Used when class has too few public methods, so be sure it’s really worth it.
too-many-public-methods (R0904):
 Too many public methods (%s/%s) Used when class has too many public methods, try to reduce this to get a simpler (and so easier to use) class.
too-many-return-statements (R0911):
 Too many return statements (%s/%s) Used when a function or method has too many return statement, making it hard to follow.
too-many-branches (R0912):
 Too many branches (%s/%s) Used when a function or method has too many branches, making it hard to follow.
too-many-arguments (R0913):
 Too many arguments (%s/%s) Used when a function or method takes too many arguments.
too-many-locals (R0914):
 Too many local variables (%s/%s) Used when a function or method has too many local variables.
too-many-statements (R0915):
 Too many statements (%s/%s) Used when a function or method has too many statements. You should then split it in smaller functions / methods.
abstract-class-not-used (R0921):
 Abstract class not referenced Used when an abstract class is not used as ancestor anywhere.
abstract-class-little-used (R0922):
 Abstract class is only referenced %s times Used when an abstract class is used less than X times as ancestor.
interface-not-implemented (R0923):
 Interface not implemented Used when an interface class is not implemented anywhere.
incomplete-protocol (R0924):
 Badly implemented %s, implements %s but not %s A class implements some of the special methods for a particular protocol, but not all of them

string_constant checker¶

Messages¶

anomalous-backslash-in-string (W1401):
 Anomalous backslash in string: ‘%s’. String constant might be missing an r prefix. Used when a backslash is in a literal string but not as an escape.
anomalous-unicode-escape-in-string (W1402):
 Anomalous Unicode escape in byte string: ‘%s’. String constant might be missing an r or u prefix. Used when an escape like u is encountered in a byte string where it has no effect.

similarities checker¶

Options¶

min-similarity-lines:
 

Minimum lines number of a similarity.

Default: 4

ignore-comments:
 

Ignore comments when computing similarities.

Default: yes

ignore-docstrings:
 

Ignore docstrings when computing similarities.

Default: yes

ignore-imports:

Ignore imports when computing similarities.

Messages¶

duplicate-code (R0801):
 Similar lines in %s files Indicates that a set of similar lines has been detected among multiple file. This usually means that the code should be refactored to avoid this duplication.

Reports¶

RP0801:Duplication

exceptions checker¶

Options¶

overgeneral-exceptions:
 

Exceptions that will emit a warning when being caught. Defaults to “Exception”

Default: Exception

Messages¶

bad-except-order (E0701):
 Bad except clauses order (%s) Used when except clauses are not in the correct order (from the more specific to the more generic). If you don’t fix the order, some exceptions may not be catched by the most specific handler.
raising-bad-type (E0702):
 Raising %s while only classes, instances or string are allowed Used when something which is neither a class, an instance or a string is raised (i.e. a TypeError will be raised).
raising-non-exception (E0710):
 Raising a new style class which doesn’t inherit from BaseException Used when a new style class which doesn’t inherit from BaseException is raised.
notimplemented-raised (E0711):
 NotImplemented raised - should raise NotImplementedError Used when NotImplemented is raised instead of NotImplementedError
catching-non-exception (E0712):
 Catching an exception which doesn’t inherit from BaseException: %s Used when a class which doesn’t inherit from BaseException is used as an exception in an except clause.
raising-string (W0701):
 Raising a string exception Used when a string exception is raised.
bare-except (W0702):
 No exception type(s) specified Used when an except clause doesn’t specify exceptions type to catch.
broad-except (W0703):
 Catching too general exception %s Used when an except catches a too general exception, possibly burying unrelated errors.
pointless-except (W0704):
 Except doesn’t do anything Used when an except clause does nothing but “pass” and there is no “else” clause.
nonstandard-exception (W0710):
 Exception doesn’t inherit from standard “Exception” class Used when a custom exception class is raised but doesn’t inherit from the builtin “Exception” class.
binary-op-exception (W0711):
 Exception to catch is the result of a binary “%s” operation Used when the exception to catch is of the form “except A or B:”. If intending to catch multiple, rewrite as “except (A, B):”
unpacking-in-except (W0712):
 Implicit unpacking of exceptions is not supported in Python 3 Python3 will not allow implicit unpacking of exceptions in except clauses. See http://www.python.org/dev/peps/pep-3110/ This message can’t be emitted when using Python >= 3.0.

newstyle checker¶

Messages¶

slots-on-old-class (E1001):
 Use of __slots__ on an old style class Used when an old style class uses the __slots__ attribute.
super-on-old-class (E1002):
 Use of super on an old style class Used when an old style class uses the super builtin.
bad-super-call (E1003):
 Bad first argument %r given to super() Used when another argument than the current class is given as first argument of the super builtin.
missing-super-argument (E1004):
 Missing argument to super() Used when the super builtin didn’t receive an argument on Python 2
property-on-old-class (W1001):
 Use of “property” on an old style class Used when PyLint detect the use of the builtin “property” on an old style class while this is relying on new style classes features
old-style-class (C1001):
 Old-style class defined. Used when a class is defined that does not inherit from anotherclass and does not inherit explicitly from “object”.

typecheck checker¶

Options¶

ignore-mixin-members:
 

Tells whether missing members accessed in mixin class should be ignored. A mixin class is detected if its name ends with “mixin” (case insensitive).

Default: yes

ignored-classes:
 

List of classes names for which member attributes should not be checked (useful for classes with attributes dynamically set).

Default: SQLObject

zope:

When zope mode is activated, add a predefined set of Zope acquired attributes to generated-members.

generated-members:
 

List of members which are set dynamically and missed by pylint inference system, and so shouldn’t trigger E0201 when accessed. Python regular expressions are accepted.

Default: REQUEST,acl_users,aq_parent

Messages¶

no-member (E1101):
 %s %r has no %r member Used when a variable is accessed for an unexistent member.
not-callable (E1102):
 %s is not callable Used when an object being called has been inferred to a non callable object
maybe-no-member (E1103):
 %s %r has no %r member (but some types could not be inferred) Used when a variable is accessed for an unexistent member, but astroid was not able to interpret all possible types of this variable.
assignment-from-no-return (E1111):
 Assigning to function call which doesn’t return Used when an assignment is done on a function call but the inferred function doesn’t return anything.
no-value-for-parameter (E1120):
 No value passed for parameter %s in function call Used when a function call passes too few arguments.
too-many-function-args (E1121):
 Too many positional arguments for function call Used when a function call passes too many positional arguments.
duplicate-keyword-arg (E1122):
 Duplicate keyword argument %r in function call Used when a function call passes the same keyword argument multiple times. This message can’t be emitted when using Python >= 2.6.
unexpected-keyword-arg (E1123):
 Passing unexpected keyword argument %r in function call Used when a function call passes a keyword argument that doesn’t correspond to one of the function’s parameter names.
redundant-keyword-arg (E1124):
 Parameter %r passed as both positional and keyword argument Used when a function call would result in assigning multiple values to a function parameter, one value from a positional argument and one from a keyword argument.
missing-kwoa (E1125):
 Missing mandatory keyword argument %r Used when a function call doesn’t pass a mandatory keyword-only argument. This message can’t be emitted when using Python < 3.0.
assignment-from-none (W1111):
 Assigning to function call which only returns None Used when an assignment is done on a function call but the inferred function returns nothing but None.
pylint-1.1.0/doc/_build/html/search.html0000664000175000017500000000616012220525765017625 0ustar sytsyt00000000000000 Search — Pylint 1.0.0 documentation

Search

Please activate JavaScript to enable the search functionality.

From here you can search these documents. Enter your search words into the box below and click "search". Note that the search function will automatically search for all of the words. Pages containing fewer words won't appear in the result list.

pylint-1.1.0/doc/_build/html/message-control.html0000664000175000017500000002536712220525540021463 0ustar sytsyt00000000000000 Messages control — Pylint 1.0.0 documentation

Messages control¶

An example available from the examples directory:

"""pylint option block-disable"""

__revision__ = None

class Foo(object):
    """block-disable test"""

    def __init__(self):
        pass

    def meth1(self, arg):
        """this issues a message"""
        print self

    def meth2(self, arg):
        """and this one not"""
        # pylint: disable=W0613
        print self\
              + "foo"

    def meth3(self):
        """test one line disabling"""
        # no error
        print self.bla # pylint: disable=E1101
        # error
        print self.blop

    def meth4(self):
        """test re-enabling"""
        # pylint: disable=E1101
        # no error
        print self.bla
        print self.blop
        # pylint: enable=E1101
        # error
        print self.blip

    def meth5(self):
        """test IF sub-block re-enabling"""
        # pylint: disable=E1101
        # no error
        print self.bla
        if self.blop:
            # pylint: enable=E1101
            # error
            print self.blip
        else:
            # no error
            print self.blip
        # no error
        print self.blip

    def meth6(self):
        """test TRY/EXCEPT sub-block re-enabling"""
        # pylint: disable=E1101
        # no error
        print self.bla
        try:
             pylint: enable=E1101
            # error
            print self.blip
        except UndefinedName: # pylint: disable=E0602
            # no error
            print self.blip
        # no error
        print self.blip

    def meth7(self):
        """test one line block opening disabling"""
        if self.blop: # pylint: disable=E1101
            # error
            print self.blip
        else:
            # error
            print self.blip
        # error
        print self.blip


    def meth8(self):
        """test late disabling"""
        # error
        print self.blip
        # pylint: disable=E1101
        # no error
        print self.bla
        print self.blop

Previous topic

Pylint output

Next topic

Pylint features

This Page

pylint-1.1.0/doc/_build/html/genindex.html0000664000175000017500000000571312220525765020164 0ustar sytsyt00000000000000 Index — Pylint 1.0.0 documentation
pylint-1.1.0/doc/_build/html/tutorial.html0000664000175000017500000007325312220525540020221 0ustar sytsyt00000000000000 A Beginner’s Guide to Code Standards in Python - Pylint Tutorial — Pylint 1.0.0 documentation
class article¶

A Beginner’s Guide to Code Standards in Python - Pylint Tutorial¶

Author:Robert Kirkpatrick

For a detailed description of Pylint, see http://www.pylint.org

Intro¶

Beginner to coding standards? Pylint can be your guide to reveal what’s really going on behind the scenes and help you to become a more aware programmer.

Sharing code is a rewarding endeavor. Putting your code ‘out there’ can be either an act of philanthropy, ‘coming of age’, or a basic extension of belief in open source. Whatever the motivation, your good intentions may not have the desired outcome if people find your code hard to use or understand. The Python community has formalized some recommended programming styles to help everyone write code in a common, agreed-upon style that makes the most sense for shared code. This style is captured in PEP-8. Pylint can be a quick and easy way of seeing if your code has captured the essence of PEP-8 and is therefore ‘friendly’ to other potential users.

Perhaps you’re not ready to share your code but you’d like to learn a bit more about writing better code and don’t know where to start. Pylint can tell you where you may have run astray and point you in the direction to figure out what you have done and how to do better.

This tutorial is all about approaching coding standards with little or no knowledge of in-depth programming or the code standards themselves. It’s the equivalent of skipping the manual and jumping right in.

My command line prompt for these examples is:

robertk01 Desktop$

Getting Started¶

Running Pylint with no arguments will invoke the help dialogue and give you a idea of the arguments available to you. Do that now, i.e.:

robertk01 Desktop$ pylint
...
a bunch of stuff
...

A couple of the options that we’ll focus on here are:

Master:
  --generate-rcfile=<file>
Commands:
  --help-msg=<msg-id>
Commands:
  --help-msg=<msg-id>
Message control:
  --disable=<msg-ids>
Reports:
  --files-output=<y_or_n>
  --reports=<y_or_n>
  --output-format=<format>

Also pay attention to the last bit of help output. This gives you a hint of what Pylint is going to ‘pick on’:

Output:
   Using the default text output, the message format is :
  MESSAGE_TYPE: LINE_NUM:[OBJECT:] MESSAGE
  There are 5 kind of message types :
  * (C) convention, for programming standard violation
  * (R) refactor, for bad code smell
  * (W) warning, for python specific problems
  * (E) error, for much probably bugs in the code
  * (F) fatal, if an error occurred which prevented pylint from doing
  further processing.

When Pylint is first run on a fresh piece of code, a common complaint is that it is too ‘noisy’. The current default configuration is set to enforce all possible warnings. We’ll use some of the options I noted above to make it suit your preferences a bit better (and thus make it ‘scream only when needed’).

Your First Pylint’ing¶

We’ll use a basic python script as fodder for our tutorial. I borrowed extensively from the code here: http://www.daniweb.com/code/snippet748.html The starting code we will use is called simplecaeser.py and is here in its entirety:

 1  #!/usr/bin/env python
 2
 3  import string
 4
 5  shift = 3
 6  choice = raw_input("would you like to encode or decode?")
 7  word = (raw_input("Please enter text"))
 8  letters = string.ascii_letters + string.punctuation + string.digits
 9  encoded = ''
10  if choice == "encode":
11      for letter in word:
12          if letter == ' ':
13              encoded = encoded + ' '
14          else:
15              x = letters.index(letter) + shift
16              encoded=encoded + letters[x]
17  if choice == "decode":
18      for letter in word:
19          if letter == ' ':
20              encoded = encoded + ' '
21          else:
22              x = letters.index(letter) - shift
23              encoded = encoded + letters[x]
24
25  print encoded

Let’s get started.

If we run this:

robertk01 Desktop$ pylint simplecaeser.py
No config file found, using default configuration
************* Module simplecaeser
C:  1, 0: Missing module docstring (missing-docstring)
W:  3, 0: Uses of a deprecated module 'string' (deprecated-module)
C:  5, 0: Invalid constant name "shift" (invalid-name)
C:  6, 0: Invalid constant name "choice" (invalid-name)
C:  7, 0: Invalid constant name "word" (invalid-name)
C:  8, 0: Invalid constant name "letters" (invalid-name)
C:  9, 0: Invalid constant name "encoded" (invalid-name)
C: 16,12: Operator not preceded by a space
            encoded=encoded + letters[x]
                   ^ (no-space-before-operator)


Report
======
19 statements analysed.

Duplication
-----------

+-------------------------+------+---------+-----------+
|                         |now   |previous |difference |
+=========================+======+=========+===========+
|nb duplicated lines      |0     |0        |=          |
+-------------------------+------+---------+-----------+
|percent duplicated lines |0.000 |0.000    |=          |
+-------------------------+------+---------+-----------+



Raw metrics
-----------

+----------+-------+------+---------+-----------+
|type      |number |%     |previous |difference |
+==========+=======+======+=========+===========+
|code      |21     |87.50 |21       |=          |
+----------+-------+------+---------+-----------+
|docstring |0      |0.00  |0        |=          |
+----------+-------+------+---------+-----------+
|comment   |1      |4.17  |1        |=          |
+----------+-------+------+---------+-----------+
|empty     |2      |8.33  |2        |=          |
+----------+-------+------+---------+-----------+



Statistics by type
------------------

+---------+-------+-----------+-----------+------------+---------+
|type     |number |old number |difference |%documented |%badname |
+=========+=======+===========+===========+============+=========+
|module   |1      |1          |=          |0.00        |0.00     |
+---------+-------+-----------+-----------+------------+---------+
|class    |0      |0          |=          |0.00        |0.00     |
+---------+-------+-----------+-----------+------------+---------+
|method   |0      |0          |=          |0.00        |0.00     |
+---------+-------+-----------+-----------+------------+---------+
|function |0      |0          |=          |0.00        |0.00     |
+---------+-------+-----------+-----------+------------+---------+



Messages by category
--------------------

+-----------+-------+---------+-----------+
|type       |number |previous |difference |
+===========+=======+=========+===========+
|convention |7      |7        |=          |
+-----------+-------+---------+-----------+
|refactor   |0      |0        |=          |
+-----------+-------+---------+-----------+
|warning    |1      |1        |=          |
+-----------+-------+---------+-----------+
|error      |0      |0        |=          |
+-----------+-------+---------+-----------+



Messages
--------

+-------------------------+------------+
|message id               |occurrences |
+=========================+============+
|invalid-name             |5           |
+-------------------------+------------+
|no-space-before-operator |1           |
+-------------------------+------------+
|missing-docstring        |1           |
+-------------------------+------------+
|deprecated-module        |1           |
+-------------------------+------------+



Global evaluation
-----------------
Your code has been rated at 5.79/10

Wow. That’s a lot of stuff. The first part is the ‘messages’ section while the second part is the ‘report’ section. There are two points I want to tackle here.

First point is that all the tables of statistics (i.e. the report) are a bit overwhelming so I want to silence them. To do that, I will use the “–reports=n” option.

Tip

Many of Pylint’s commonly used command line options have shortcuts. for example, “–reports=n” can be abbreviated to “-rn”. Pylint’s man page lists all these shortcuts.

Second, previous experience taught me that the default output for the messages needed a bit more info. We can see the first line is:

"C:  1: Missing docstring (missing-docstring)"

This basically means that line 1 violates a convention ‘C’. It’s telling me I really should have a docstring. I agree, but what if I didn’t fully understand what rule I violated. Knowing only that I violated a convention isn’t much help if I’m a newbie. Another information there is the message symbol between parens, missing-docstring here.

If I want to read up a bit more about that, I can go back to the command line and try this:

robertk01 Desktop$ pylint --help-msg=missing-docstring
No config file found, using default configuration
:missing-docstring (C0111): *Missing docstring*
  Used when a module, function, class or method has no docstring. Some special
  methods like __init__ doesn't necessary require a docstring. This message
  belongs to the basic checker.

Yeah, ok. That one was a bit of a no-brainer but I have run into error messages that left me with no clue about what went wrong, simply because I was unfamiliar with the underlying mechanism of code theory. One error that puzzled my newbie mind was:

:too-many-instance-attributes (R0902): *Too many instance attributes (%s/%s)*

I get it now thanks to Pylint pointing it out to me. If you don’t get that one, pour a fresh cup of coffee and look into it - let your programmer mind grow!

The Next Step¶

Now that we got some configuration stuff out of the way, let’s see what we can do with the remaining warnings.

If we add a docstring to describe what the code is meant to do that will help. I’m also going to be a bit cowboy and ignore the deprecated-module message because I like to take risks in life. A deprecation warning means that future versions of Python may not support that code so my code may break in the future. There are 5 invalid-name messages that we will get to later. Lastly, I violated the convention of using spaces around an operator such as “=” so I’ll fix that too. To sum up, I’ll add a docstring to line 2, put spaces around the = sign on line 16 and use the –disable=deprecated-module to ignore the deprecation warning.

Here is the updated code:

 1  #!/usr/bin/env python
 2  """This script prompts a user to enter a message to encode or decode
 3  using a classic Caeser shift substitution (3 letter shift)"""
 4
 5  import string
 6
 7  shift = 3
 8  choice = raw_input("would you like to encode or decode?")
 9  word = (raw_input("Please enter text"))
10  letters = string.ascii_letters + string.punctuation + string.digits
11  encoded = ''
12  if choice == "encode":
13      for letter in word:
14          if letter == ' ':
15              encoded = encoded + ' '
16          else:
17              x = letters.index(letter) + shift
18              encoded = encoded + letters[x]
19  if choice == "decode":
20      for letter in word:
21          if letter == ' ':
22              encoded = encoded + ' '
23          else:
24              x = letters.index(letter) - shift
25              encoded = encoded + letters[x]
26
27  print encoded

And here is what happens when we run it with our –disable=deprecated-module option:

robertk01 Desktop$ pylint --reports=n --disable=deprecated-module simplecaeser.py
No config file found, using default configuration
************* Module simplecaeser
C:  7, 0: Invalid constant name "shift" (invalid-name)
C:  8, 0: Invalid constant name "choice" (invalid-name)
C:  9, 0: Invalid constant name "word" (invalid-name)
C: 10, 0: Invalid constant name "letters" (invalid-name)
C: 11, 0: Invalid constant name "encoded" (invalid-name)

Nice! We’re down to just the invalid-name messages.

There are fairly well defined conventions around naming things like instance variables, functions, classes, etc. The conventions focus on the use of UPPERCASE and lowercase as well as the characters that separate multiple words in the name. This lends itself well to checking via a regular expression, thus the “should match (([A-Z_][A-Z1-9_]*)|(__.*__))$”.

In this case Pylint is telling me that those variables appear to be constants and should be all UPPERCASE. This rule is in fact a naming convention that is specific to the folks at Logilab who created Pylint. That is the way they have chosen to name those variables. You too can create your own in-house naming conventions but for the purpose of this tutorial, we want to stick to the PEP-8 standard. In this case, the variables I declared should follow the convention of all lowercase. The appropriate rule would be something like: “should match [a-z_][a-z0-9_]{2,30}$”. Notice the lowercase letters in the regular expression (a-z versus A-Z).

If we run that rule using a –const-rgx=’[a-z_][a-z0-9_]{2,30}$’ option, it will now be quite quiet:

robertk01 Desktop$ pylint --reports=n --disable=deprecated-module --const-rgx='[a-z_][a-z0-9_]{2,30}$'  simplecaeser.py
No config file found, using default configuration

Regular expressions can be quite a beast so take my word on this particular example but go ahead and read up on them if you want.

Tip

It would really be a pain in the butt to have to use all these options on the command line all the time. That’s what the rc file is for. We can configure our Pylint to store our options for us so we don’t have to declare them on the command line. Using the rc file is a nice way of formalizing your rules and quickly sharing them with others. Invoking pylint --generate-rcfile will create a sample rcfile with all the options set and explained in comments.

That’s it for the basic intro. More tutorials will follow.

Table Of Contents

Previous topic

Contribute

Next topic

Frequently Asked Questions

This Page

pylint-1.1.0/doc/_build/html/backlinks.html0000664000175000017500000001363312220525536020320 0ustar sytsyt00000000000000 Some projects using Pylint — Pylint 1.0.0 documentation

Some projects using Pylint¶

The following projects are known to use Pylint to help develop better code:

Also notice that the CheeseCake kwalitee reporting tool uses Pylint to analyze the source code.

Previous topic

Pylint messages Wiki

Next topic

Installation

This Page

pylint-1.1.0/doc/_build/html/index.html0000664000175000017500000002637512220525765017501 0ustar sytsyt00000000000000 Pylint User Manual — Pylint 1.0.0 documentation

Pylint User Manual¶

Pylint’s home page is at http://www.pylint.org and its forge is at https://bitbucket.org/logilab/pylint

Content wanted¶

It would be nice to include in the documentation the following information:

  • pylint plugins (how to write one, how to install a 3rd party plugin, how to configure Pylint to run it)
  • pylint brain project : what it is, how to install it...

Please send your pull requests via bitbucket if you can help with the above.

Table Of Contents

Next topic

Introduction

This Page

pylint-1.1.0/doc/_build/html/installation.html0000664000175000017500000002045612220525540021054 0ustar sytsyt00000000000000 Installation — Pylint 1.0.0 documentation

Installation¶

Dependencies¶

Pylint requires the latest astroid and logilab-common packages. It should be compatible with any Python version >= 2.5.

Distributions¶

The source tarball is available at http://download.logilab.org/pub/pylint.

You may apt-get a well-tested Debian or Ubuntu package by adding one of these lines:

deb http://download.logilab.org/production unstable/
deb http://download.logilab.org/production sid/
deb http://download.logilab.org/production squeeze/
deb http://download.logilab.org/production lenny/

to your /etc/apt/sources.list file. Pylint is also available in the standard Debian distribution (but add our public debian repository anyway if you want to get the latest releases and upgrades earlier)

Pylint is also available in Gentoo, Fedora 4, Ubuntu, FreeBSD, Darwin (and maybe others, if you know about more OSes, please drop us a note!).

Python packages¶

Pylint should be easily installable using setuptools and the Python Package Index. Try easy_install or pip, depending on your preference.

Source distribution installation¶

From the source distribution, extract the tarball, go to the extracted directory and simply run

python setup.py install

You’ll have to install dependencies in a similar way.

Windows users may get valuable information about Pylint installation on this page.

Note for Windows users¶

On Windows, once you have installed Pylint, the command line usage is

pylint.bat [options] module_or_package

But this will only work if pylint.bat is either in the current directory, or on your system path. (setup.py install install python.bat to the Scripts subdirectory of your Python installation – e.g. C:Python24Scripts.) You can do any of the following to solve this:

  1. change to the appropriate directory before running pylint.bat
  2. add the Scripts directory to your path statement in your autoexec.bat file (this file is found in the root directory of your boot-drive)
  3. create a ‘redirect’ batch file in a directory actually on your systems path

To effect (2), simply append the appropriate directory name to the PATH= statement in autoexec.bat. Be sure to use the Windows directory separator of ‘;’ between entries. Then, once you have rebooted (this is necessary so that the new path statement will take effect when autoexec.bat is run), you will be able to invoke Pylint with pylint.bat on the command line.

(3) is the best solution. Once done, you can call Pylint at the command line without the .bat, just as do non-Windows users by typing:

pylint [options] module_or_package

To effect option (3), simply create a plain text file pylint.bat with the single line:

C:\PythonDirectory\Scripts\pylint.bat

(where PythonDirectory is replaced by the actual Python installation directory on your system – e.g. C:Python24Scriptspylint.bat).

Table Of Contents

Previous topic

Some projects using Pylint

This Page

pylint-1.1.0/doc/_build/html/contribute.html0000664000175000017500000002751612220525701020534 0ustar sytsyt00000000000000 Contribute — Pylint 1.0.0 documentation

Contribute¶

Bug reports, feedback¶

You think you have found a bug in Pylint? Well, this may be the case since Pylint is under development.

Please take the time to check if it is already in the issue tracker at https://bitbucket.org/logilab/pylint

If you can not find it in the tracker, create a new issue there or discuss your problem on the code-quality@python.org mailing list.

The code-quality mailing list is also a nice place to provide feedback about Pylint, since it is shared with other tools that aim at improving the quality of python code.

Note that if you don’t find something you have expected in Pylint’s issue tracker, it may be because it is an issue with one of its dependencies, namely astroid and logilab-common:

Mailing lists¶

Use the code-quality@python.org mailing list for anything related to Pylint. This is in most cases better than sending an email directly to the author, since others will benefit from the exchange, and you’ll be more likely answered by someone subscribed to the list.

You can subscribe to this mailing list at http://mail.python.org/mailman/listinfo/code-quality

Archives are available at http://mail.python.org/pipermail/code-quality/

Archives before April 2013 are available at http://lists.logilab.org/pipermail/python-projects/

Forge¶

Pylint is developped using the mercurial distributed version control system.

You can clone Pylint and its dependencies from

hg clone https://bitbucket.org/logilab/pylint
hg clone https://bitbucket.org/logilab/astroid
hg clone http://hg.logilab.org/logilab/common

Got a change for Pylint? Below are a few steps you should take to make sure your patch gets accepted.

  • Test your code

    • Pylint keeps a set of unit tests in the /test directory. The test_func.py module uses external files to have some kind of easy functionnal testing. To get your patch accepted you must write (or change) a test input file in the test/input directory and message file in the test/messages directory. Then run python test_func.py to ensure that your test is green.
    • You should also run all the tests to ensure that your change isn’t breaking one.
  • Add a short entry to the ChangeLog describing the change, except for internal implementation only changes

  • Write a comprehensive commit message

  • Relate your change to an issue in the tracker if such an issue exists (see this page of Bitbucket documentation for more information on this)

  • Send a pull request from Bitbucket (more on this here)

Unit test setup¶

To run the pylint unit tests within your checkout (without having to install anything), you need to set PYTHONPATH so that pylint, astroid and the logilab-common are available. Assume you have those packages in ~/src. If you have a normal clone of logilab-common, it will not be properly structured to allow import of logilab.common. To remedy this, create the necessary structure:

cd ~/src
mkdir logilab
mv logilab-common logilab/common
touch logilab/__init__.py

Now, set PYTHONPATH to your src directory:

export PYTHONPATH=~/src

You now have access to the astroid, logilab.common and pylint packages without installing them. You can run all the unit tests like so:

cd ~/src/pylint/test
for f in *.py ; do
  echo $f
  python -S $f
done

The -S flag keeps distutils from interfering with sys.path. YMMV.

Adding new functionnal tests¶

Pylint comes with an easy way to write functional tests for new checks:

  • put a Python file in the test/input directory, whose name starts with func_ and should also contains the symbolic name of the tested check
  • add the expected message file in the test/messages directory, using the same name but a .txt extension instead of .py

The message file should use the default text output format (without reports) and lines should be sorted. E.g on Unix system, you may generate it using:

pylint -rn input/func_mycheck.py | sort > pylint messages/func_mycheck.txt

Also, here are a few naming convention which are used:

  • Python files starting with ‘func_noerror’ don’t have any message file associated as they are expected to provide no output at all
  • You may provide different input files (and associated output) depending on the Python interpreter version:
    • tests whose name ends with _py<xy>.py are used for Python >= x.y
    • tests whose name ends with _py<_xy>.py are used for Python < x.y
  • Similarly you may provide different message files for a single input, message file whose name ends with ‘_py<xy>.txt’ will be used for Python >= x.y, using the nearest version possible

Table Of Contents

Previous topic

IDE integration

Next topic

A Beginner’s Guide to Code Standards in Python - Pylint Tutorial

This Page

pylint-1.1.0/doc/_build/html/run.html0000664000175000017500000002732212220525765017167 0ustar sytsyt00000000000000 Running Pylint — Pylint 1.0.0 documentation

Running Pylint¶

Invoking Pylint¶

Pylint is meant to be called from the command line. The usage is

pylint [options] module_or_package

You should give Pylint the name of a python package or module. Pylint will import this package or module, so you should pay attention to your PYTHONPATH, since it is a common error to analyze an installed version of a module instead of the development version.

It is also possible to analyze python files, with a few restrictions. The thing to keep in mind is that Pylint will try to convert the file name to a module name, and only be able to process the file if it succeeds.

pylint mymodule.py

should always work since the current working directory is automatically added on top of the python path

pylint directory/mymodule.py

will work if “directory” is a python package (i.e. has an __init__.py file) or if “directory” is in the python path.

For more details on this see the Frequently Asked Questions.

You can also start a thin gui around Pylint (require TkInter) by typing

pylint-gui

This should open a window where you can enter the name of the package or module to check, at Pylint messages will be displayed in the user interface.

It is also possible to call Pylint from an other python program, thanks to py_run() function in lint module, assuming Pylint options are stored in pylint_options string, as:

from pylint import epylint as lint
lint.py_run(pylint_options)

To silently run Pylint on a module_name.py module, and get its standart output and error:

from pylint import epylint as lint
(pylint_stdout, pylint_stderr) = lint.py_run('module_name.py', True)

Command line options¶

First of all, we have two basic (but useful) options.

--version show program’s version number and exit
-h, --help show help about the command line options

Pylint is architectured around several checkers. By default all checkers are enabled. You can disable a specific checker or some of its messages or messages categories by specifying --disable=<id>. If you want to enable only some checkers or some message ids, first use --disable=all then --enable=<id> with <id> being a comma separated list of checker names and message identifiers. See the list of available features for a description of provided checkers with their functionalities. The --disable and --enable options can be used with comma separated lists mixing checkers, message ids and categories like -d C,W,E0611,design

It is possible to disable all messages with --disable=all. This is useful to enable only a few checkers or a few messages by first disabling everything, and then re-enabling only what you need.

Each checker has some specific options, which can take either a yes/no value, an integer, a python regular expression, or a comma separated list of values (which are generally used to override a regular expression in special cases). For a full list of options, use --help

Specifying all the options suitable for your setup and coding standards can be tedious, so it is possible to use a rc file to specify the default values. Pylint looks for /etc/pylintrc and ~/.pylintrc. The --generate-rcfile option will generate a commented configuration file according to the current configuration on standard output and exit. You can put other options before this one to use them in the configuration, or start with the default values and hand tune the configuration.

Other useful global options include:

--ignore=file Add <file> (may be a directory) to the black list. It should be a base name, not a path. You may set this option multiple times.
--persistent=y_or_n
 Pickle collected data for later comparisons.
--output-format=<format>
 Select output format (text, html, custom).
--msg-template=<template>
 Modifiy text output message template.
--list-msgs Generate pylint’s messages.
--full-documentation
 Generate pylint’s full documentation, in reST format.

Table Of Contents

Previous topic

Introduction

Next topic

Pylint output

This Page

pylint-1.1.0/doc/_build/html/intro.html0000664000175000017500000002150312220525540017500 0ustar sytsyt00000000000000 Introduction — Pylint 1.0.0 documentation

Introduction¶

What is Pylint?¶

Pylint is a tool that checks for errors in Python code, tries to enforce a coding standard and looks for bad code smells. This is similar but nevertheless different from what pychecker provides, especially since pychecker explicitly does not bother with coding style. The default coding style used by Pylint is close to PEP 008 (aka Guido’s style guide). For more information about code smells, refer to Martin Fowler’s refactoring book

Pylint will display a number of messages as it analyzes the code, as well as some statistics about the number of warnings and errors found in different files. The messages are classified under various categories such as errors and warnings (more below). If you run Pylint twice, it will display the statistics from the previous run together with the ones from the current run, so that you can see if the code has improved or not.

Last but not least, the code is given an overall mark, based on the number an severity of the warnings and errors. This has proven to be very motivating for some programmers.

Pylint was born in 2003 at Logilab, that funded Sylvain Thénault to lead its development up to now.

What Pylint is not?¶

What Pylint says is not to be taken as gospel and Pylint isn’t smarter than you are: it may warn you about things that you have conscientiously done.

Pylint tries hard to report as few false positives as possible for errors, but it may be too verbose with warnings. That’s for example because it tries to detect things that may be dangerous in a context, but are not in others, or because it checks for some things that you don’t care about. Generally, you shouldn’t expect Pylint to be totally quiet about your code, so don’t necessarily be alarmed if it gives you a hell lot of messages for your project!

Quoting Alexandre Fayolle:
 

My usage pattern for Pylint is to generally run pylint -E quite often to get stupid errors flagged before launching an application (or before committing). I generally run Pylint with all the bells and whistles activated some time before a release, when I want to cleanup the code. And when I do that I simply ignore tons of the false warnings (and I can do that without being driven mad by this dumb program which is not smart enough to understand the dynamicity of Python because I only run it once or twice a week in this mode)

Quoting Marteen Ter Huurne:
 

In our project we just accepted that we have to make some modifications in our code to please Pylint:

  • stick to more naming conventions (unused variables ending in underscores, mix-in class names ending in “Mixin”)
  • making all abstract methods explicit (rather than just not defining them in the superclass)
  • add # pylint: disable=X0123 comments:
    • for messages which are useful in general, but not in a specific case
    • for Pylint bugs
    • for Pylint limitations (for instance Twisted’s modules create a lot of definitions dynamically so Pylint does not know about them)

The effort is worth it, since Pylint helps us a lot in keeping the code clean and finding errors early. Although most errors found by Pylint would also be found by the regression tests, by fixing them before committing, we save time. And our regression tests do not cover all code either, just the most complex parts.

Table Of Contents

Previous topic

Pylint User Manual

Next topic

Running Pylint

This Page

pylint-1.1.0/doc/_build/html/_static/0000775000175000017500000000000012255772544017124 5ustar sytsyt00000000000000pylint-1.1.0/doc/_build/html/_static/vs2003_config.jpeg0000664000175000017500000007614612136155450022260 0ustar sytsyt00000000000000ÿØÿàJFIF``ÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀ‡Œ"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?×øƒñVðž¿m§éöº{ÂöqÌLðnmÇ òô®T|gñÿ—ÿOÿ]ýñ•~$j¦¹y‡ƒÜ¢Z¹Y™·Œ 6zqÁ®KGðÖ›¯3]xžßRÓ®[¶¶Iµ9¤¸¸ºÝ&Õð¦FÖ jô)F—"æ‰Ï7>mž>2øˆÿË–ÿ€§ÿЧŒ~"?òå¤à)ÿâ«SX±¶ºð¿†tùô´¶±ƒT»µ¾•fi¦ír†@vµ€Ý 9#®jü~ ðÜÞ3²ÒßÃZ¥¼?o¸…¥’a¶ž%ŠB ;JŘ2v†ùkKPJî=ÿoS¹ÏŒ>!?òå¤à)ÿâ©Ãâÿˆü¹i?ø øªŸBÒü7¡Øj  !~ ƒK+qw+²DbMÇ(È ÜÙÆìcV®ð÷I›P–Êæ¼¶šþöÕ. IKE‹*¾l‹"¤lH ³ŸC€5‡ïN£Ù™“üRñM§•ö+N‡ÎŒK™d˽F<ƒØŽ*1ñs_?òç¤ÿà1ÿâªŸŽ¦–Þo M ±ènŽŒC+ ÄGB+§Ôëþ*ðF•­_Ü>u¤ÛO4opBË6Ù0NOÞc…ÏÞ9À9£ÙÒI7ÿ€sNö¹Œ>-kçþ\ô¯ü?üUX‹âo‰æ¶šæ=3Ox ÛçJ¶lV=Ç ¸ç'žµjÛšD±XMu¥}—V“K½¸:?™*ù’ÆØˆlf2üÃqÀaœt9ÐþÅÓ¬|=­ZÅkqºµÒ%½²¶%å†W˜ï²Á±‚‰9oLRj‡HÿW°'>æø­®ÿϦ—ÿ€ÇÿЧŠšéÿ—M/ÿ¿úõWÇÚ%†udtè­â·¹Y#òçŽuPØbJÄãŽÝóqÀ®DV£Fk™D—9§kÐø¥®ùtÒÿðÿ¯O5³ÿ.šgþõë†ñUõj_Ê/k>çp>'kgþ]tÏüÿëÓ‡ÄÍhÿË®™ÿ€ßýzâH´}^—ò‡µŸsµµ“ÿ.ºoþõéÃâF²å×MÿÀþ½q‚ž)}^—ò‹ÚϹوÚÁÿ—m;ÿÿúôáñW?òí§à?ÿ^¸áO}^—ò‡µŸs°õsÿ.ÚwþÿõéÃâ¬åÛOÿÀþ½rž)}^—ò‡µŸs®?Õü»iÿøÿ×§ê§þ]ì?ðÿ¯\˜©W¥Ø=¬ûPñÞ¨åÞÃÿÇøÓ‡ŽuCÿ.öø?ƹaO¾¯K°{Y÷:‘ã}Lÿ˽þŠpñ®¤å…þŠæÁígÜèÇ‹õÿ,,¿ïÀ§êþXÙÿß\詟`ö³îtÅwÿóÆÏþü pñU÷üñ³ÿ¿°æðñEñÿ–6Ÿ÷àS‡‰¯Oü²´ÿ¿°…H){ }ƒÚϹ¶ÁígÜÓÅÉÿ–vÿ÷åœ5kƒüÿ÷å³V¤½>ÁígÜÐ¤çø ÿ¿+þñ©N‚ûò¿áYâ¤{}ƒÚϹ£ äóL‘*ÀØ(Ì+Ž ±¾Oùïeÿ~ÿTl?ãþÛþº¯ó®CÆ6:æ¯cÿä[ëëcS#e¼PwŽRU„™8Ú€ÍÀëˈQƒJ(è¢ÜÓ»;GTlË,¶¯æL¢¤–v :¨óô…yĉ^o»9é`0Æxºšé-`‚Ûš\Qé×–7 «Cö´¼ËK$ûÆùLb]Çã‚1Œc—ø‡ÿ#[ÿ×ÿ•c{Æö5ÚV:Ÿˆ¾Õë£þ^ôïûøÿüE{}z°{@>ëƒþ^ôïûøÿüE<|-×ü½iÿ÷ñÿøŠõÊ)}z°{J>ëcþ^´ÿûøÿüE8|1Ö‡ü½iÿ÷ñÿøŠõŠ(úõ`ö<¤|3Ö¿çêÃþþ?ÿN 5‘ÿ/6÷ñÿøšõJ(úõQ{\>kþ^lïãÿñ4áðãXòócÿ}¿ÿ^ŸE]ª?ȧí\ËÍýöÿüM8|<Õ‡ü¼YßoÿÄ×¥ÑG×j‡°æÃáö¬?åâËþûþ&ž<ªùx²ÿ¾Ûÿ‰¯F¢—×j‹Ø@ó±à-PËÅŸýößüM8xTòÞÏþûoþ&½ Š>»T>¯Ïǵ1ÿ-í?ï¶ÿâiÃÀú˜ÿ–öŸ÷Ûñ5ßQG×j‡ÕàpcÁZÿ–öŸ÷Ûñ4áàÍDËk_ûí¿øšî¨£ë•Cêð8àÝDËk_ûé¿øšpð~ ?嵯ýôßüMv´QõÊ¡õx`ðøÿ–Öß÷Óñ4áá;ñÿ-m¿ï¦ÿ ìh£ë•Cêð9á[áÿ-mÿï¦ÿ pð½èÿ–¶ÿ÷Ó…u´RúåPú¼PxfôË[ûèÿ…·T>¯Ðÿ–þgü)ÃBºòÒÌÿ…tQõºõx#D¹Çæž4küq~gü+nŠ>·P>¯iøâüÏøS†•8þ8ÿ3þ¯E[¨W”4ɇñGùŸð§ :aüIùŸð­:)}j }^p°”~gü)ÂÊAüIùš¿EZ¨WLZH;¯çNÎ;­Z¢­T«À¯äÌ£1ËåH>ì‹‚Tö# Ž=Á‘ÿåÏý ·ýþOþ"·è¨•yKr£J1Øç†I!iõ}Fáb•%Xå‘ –S‘Ÿ“Ú¼ïâ Ç‹$Çü«ÙkÆþ#ÈÝ/ýrOåK½Ê–§µ\ÿ­_úæŸú¬ÍcPþÉÑ/õ/+Íû%´“ù{¶ïØ¥±œgqZw?ëWþ¹§þ‚+3XÓÿµ´Ký7Íò¾×m$fÝÛ7©\ã#8ÏLÖe˜IãXæ—o%ªD'Y>ß#ÎØ:,¤©$aÆëy×p /=΃x¯IHÕ™ïÚAÀl'U˜ÍûHGù±‘¹àÓ5Ÿ Yë´eÞšy&¹)ËH^Ùí¸'…!Y{òôäšËO >‹%¥õ½´óCv%k}ÂUeÌ€ò œÊyÜze‰4xx‡Jk[«‘uû«[oµNLm˜ã˃‘Œ†)_¼ @4ýGQ–Úx,ìíÒâþuy#ŽI h ïf}­€ ¨À’ÃŒdŽb/ jºn¨‘JúcjK=½Ê_[$Ìcyf‘JySaHûC®I9ÚÑß§Ôténg‚òÎá-ïàWŽ9$ŒÈ…®õdܹ¢œ‚*9ÆAõèl(õm–÷EwÊ–ÂKˆáLä6)üÎ|­ÉÚMV¾ñ†›mc¨Í,¶qÜ0Y ’(æxC$eÚÍò7Ý$áXà€j;ß_ê p'Ô­ƒ_Ú +ò–ŒÄ ˜òùm‰\ÛÆpp0A.ü#ö–š|÷n!û]åò VágR£$à?^s·§<uüM¥Ä‘4²\Æw¶û9”™#| ¯î—*ØgÚRs€MV¾ñ†›mc¨Í,¶qÜ0Y ’(æxC$eÚÍò7Ý$áXà€j®£àöծ㼿“K¸ºhÞy%ÓQYÙL!ݼ¶Ãœ–Þ vðAšïÂ1_ii§ÏvâµÞ\;"Ånu*2Nõç;zsÁ )¯Ø<–ñ¨¼2ϱýŠmè EÙ˜Ôp_h8$p ]µ»‚ö–Ý÷¢É$Dà™£}Hü+oÞÞjV7·W¶k<|Ùìí¥ å„{üÓû£Àd`Àòx$ÚµŠx¡e¸¸óÜÉ#Ø \•\î© žøÏzšŠ( aEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP^7ñþFéë’*öJñ¿ˆßò7Kÿ\“ùSŽâgµ\ÿ­_úæŸúªw“5½”ó £œÓ f®\ÿ­_úæŸú¬ýOþAWŸõÁÿôH Úu¯‹µ-2ÒþtEŠæ™Ï(`¬Âuæ¬ÿdxÏþyè?ø7ÿ\æ¤5 _Fðþ—¦éwóéº:Œ ¢Á|ÊÒS¾E,Å>W~a•n×5]xø§B×–=R{y/4©•¢m„I}¶"@û ´ŽÛÞEýÛmÌXÁ!³vB¹¯ý‘ã?ùç ÿàDßüEÙ3ÿžzþMÿÄUEÖ¤´Ô®õ;-j=[M°²³¹»» 5Ź–ñ%&H#8U>IP2ìM=g_ñu…Õ¬3_Øé÷ h·qÃw:'<’Ê~Êa‘®|¥&"(í¸æEÚYÍìÿÏ=ÿ&ÿâ(þÈñŸüóÐð"oþ"—Nûü%cÏþÉþкþÍÎ6ÿhbo´ÿ··~ÝÜnó³Ç‘F§ÿßöö¥ÿ ¿öVß5?²ÿµü¿/ìþRnò·ü»¼ß7v>|lÝòùtYÄþÈñŸüóÐð"oþ"ìÿÏ=ÿ&ÿâ+#\ñf­gkªÏk¬ÄÎ/í—KÙû Å;Aq³o˜7à;œ”o;ó&$×ä¼´ñŽŸ}â;¸ìì.-ïŸWmÑí„°_DC7–"Z8ÔLæB3’¸,‚æŸöGŒÿ瞃ÿñÓüZ×n§Ã¦tEwŒ]K¹U‰ HÙ V÷Ú})‡YÕ“Lûeþ½öK+nîÎK± Q‹ x¤¹ÅÝYw3Çeœc  ä»XðeõÆ£âMRâæO9ŽŸl‘Ï´>%º¾X¥ãïEGÊ€§vT@¢È.'öGŒÿ瞃ÿñdxÏþyè?ø7ÿYŸa¶ðÌ>2¿ðö•¦ÙÞC©ÛÛ$éD-àxl̇xB3ÈIVPAb¬¼ž)Ö!Ñ­¤¸ñ¤Ð›‰•$Òî –öôjÀe!¸!ÝÃÑO ³«+Asoû#ÆóÏAÿÀ‰¿øŠ?²ë×pB𽤒ÇpÖ)©Y4LRK01Y|•B@¸‘p#Qò®CÜK ¹ÕÿdxÏþyè?ø7ÿGöGŒÿ瞃ÿñ‘¬ø‹^°¾›JÜö¶—rÂú­ýÄ6ŒäCm*FÒ$‹qóåˆԕˆü­»¤ð…öµª^jsê·±”·xa[HmŒJ®Ö¶ò¹ùÀ“¶«FæÝŸ”!d)dxÏþyè?ø7ÿGöGŒÿ瞃ÿñÜÑE\á¿²ÞØÁžî2òd(wœ2qœs×ò«•‡âõgý„í¿ô1Br¼oâ7üÒÿ×$þUì•ã¿än—þ¹'ò§ÁžÕsþµëšè"³õ?ù^×ÿÐMh\ÿ­_úæŸú¬ýOþAWŸõÁÿôK¨è^"’×FÑô»MRÔg‹G³¸•­ZTY•AóeBNb~€ö®’MwG‹™ªØ§—»~ë„vù›³Ïòeϧ–ÿÝ8áô¿ÞMý‰®A¡èz¦4K }Bs–ÒGæ9d"1Ÿ1y¯Ò¶-üåÿfù°Ø·‘â ½^ãåÏ™æ}£Êo»Ì‹æCÉ鳃òŠÐ“ }wGŽòêÎMVÅ.­"3ÜÂ×À»®r«‚OŠ/u›;;¼ßçÂ×qÙæ<Ë?Âí†î0xÈÅqúÇ‚õKI»Ñã{µYu «k–™÷É%Ôw ãÙ„U7Gæ Äùcå¾^“_Ñæ¹ðìV<‘½µÅ¤°@ìbˆ,Ç&̪¶Ñ¶< )ÇP…æ­¦é÷¶÷º…¥´÷o²Ú9¦Ti› a9c–ÔzÕ{¿h¶Oú¥ ŸO·k«¸PòèbíËcǨ®VÐ5íY5"Ðé°¾µ¦ 6ð ·ahªÓbHÏ”<âVrvŸ/1¸ç";¯ëQ6äv°Ýß^ÛjÊæq%ÊÜ<½ªa¹$0“åŽwʰþ)A¦=ÏØgŠâBÚÂâÒvPð¼ÒD£% )ù&GùIÎpH9Ƨö¶›²åÿ´-6Z£=ÃyˈUYÔ—çå£{£Ƹ;ŸêwËM+M´Ÿa³»˜-´bâ)¥’k?’ƒË 2ïœ5KÂ~ v¯c`ºTñßéK¤FòÊÖÞTH%Øû&Rß¿*Uv¯îÁ±; ]wG¾ÔgÓ¬õ[‹è7yÖÐÜ#ÉÓµ·(9$ž†´+‡Ð4bâêÙ¯-`´±Óõ½Fö2¹š}òÜ¢ƒ@H˜°`í«ÇÍ‘ÜPEPEPEPEPEPEPEPEPEPEPEPEP\æ£þ¼Àÿô6®Ž¹ÍGýxÿÿèmS!£>çR²Òì§žúæ;xŠ„ #c-¸S€OàkþÐV×ü+y#y[lhÎzáFjO²\ÿϼ¿÷Á©ÎÿÂcáïú Áúÿ…ð˜ø{þ‚°~¿á]Ù.çÞ_ûàÑöKŸù÷—þø4À[^èVïgÿ„òCfÊÐÂÐZ„P\ °£i+òpHU¨¯| ¬ö±E£Çoq·Î‰-T$›NWpÛƒƒÈÏJí~Ésÿ>òÿß²\ÿϼ¿÷Á¦/iâ_ XZ¥­å•µºgdP¦Ä\œœ09$þ57ü&>ÿ ¬¯øWEöKŸù÷—þø4}’çþ}åÿ¾ 9ßøL|=ÿAX?_ð¬ÝcÄN¦tË{+ø¦—ûFݶ)çÅvŸd¹ÿŸyïƒQÍÛÇæNn ¹ÆÑ’@'¹$îi€Úñ¿ˆßò7Kÿ\“ùW²WüFÿ‘º_úäŸÊˆî ö«Ÿõ«ÿ\ÓÿAŸ©ÿÈ*óþ¸?þ‚kBçýjÿ×4ÿÐEgêò ¼ÿ®ÿ š]@ÄÕ|b<=á_ [ìZXOŽº¤±ÊñŒ P•3`d,àqÔM%å×t¯±xŽïû.öÊká nñ8­Â…sbŒ%bNìò6‘F…s¢è~ÑõJòÒÁîtË;V¸º¸«„FdA¸ŸžCÇ'ŸN6,´½"ÊâÊÞÑ#Yô»!mbRÍ »•NH&ŸóÖ´$çßU¾½øM¦Ý½Ì‹¨j¶VVíwÈÑKuåÅç ¸åZ]øé€GQÍê~)ñTˆR Ì]yº…Ý•ï•ú5µ¬²£Ç°Œ> P®æäý« (ç Ñl<#u=…‡pÓ¶2ÁHÀ8ûÃcUðÿ…í’ãRÕ|»{pþc=Åëdz­E.)Kùˆ÷19ËØòt Ë… s>ªé«)ŽFeœÀ` (`qˆ8ÐüÔŸ¨xÊ]3Y±±¸°ŽD‘à‚îKWš_³O+[Éã/ùÝk• ^oÞàØêÇF¢Õ^1¦GòÊî¯Ë™–8Y£!¢ y8ȵl]øCÔu“4Þa¼‰áº’¯eY•³’D®Îb3)Ï–EÂ::Û½ºGv‘WRúuû9P@ò0ÿ¸Y—íNÞœP–7W"ðäs·h×d" ,e\‚Ufî¶Ó‚È V zsþÖõ“áï"Éý±«êúxÔ™¯åKhã@ïU1BŠeÚ ž e¸õšT60ivë¦Ú͓̊D“Ìù·ïÉ.X’ʼn%‰$’Nk4ß ßxL6·Q6ÕÖÊêËQxð¹XÄk4neEÛ¸îe\ä@ìüuý£:…¦ÿ†–ÒÞYeŸlë%ÊÂÑíˆ)VQöˆ·àŸànÔð\ó]xÃ×É4òé–Ï$’1fv1)$“É$óšŽ=ÃGXD`K«}§ìP\²F KÖku`…‘Z3)*<¬„ÆÅ…¾™§[XYÇåÚÚÄ›‰ÚŠQ“ÉÀ­X¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(®sQÿ^?àúWG\æ£þ¼Àÿô6©Ñ ?ê®?ë˜ÿЖ¡©¡ÿUqÿ\Çþ„µ H±dñ$0ßÞA%âÚÙH±\ß/Ɉ”WÉù÷í×-·’H‘µ\.«$ñê> Ò¦·›û?Tn`³ºšDF·Ž6U BÄ!Á߀[$¥H€èõ_XiÖš¡ŽâÚâ÷O´’êK%D›Uwr9*G8î*Kÿé–êîá–âÂÙîgµŠEi•w³9Œàr=k”ŸÁ×7ö—ËO.åo'¶šâîä÷ .¶8Hˆóˆ-óò‚ß,óø"{§¾¶‘Ñ`¯$Žé¯'«\ GÙ¡_8Ù9 xò¦€tã^ÑÙ-uk·ŒRÙ…Êbvi ÏÌr@ã½hW«xkPÖnÞêæ `×v‹iq jw J­!݈Âyà‰9FÙ¤ó;+Äÿê4Ïû Ûèb·+Äÿê4Ïû Ûèb„åxßÄoù¥ÿ®Iü«Ù+Æþ#ÈÝ/ýrOåN;ƒ=ªçýjÿ×4ÿÐEgêò ¼ÿ®ÿ šÐ¹ÿZ¿õÍ?ôYúŸü‚¯?ëƒÿè&—P¡Jt‹}V½·»žÎ] ÎÚÝ­m¤¹h$š@R5fQ 1|À`ù 1&cðÊÏáïO¡e}ÞZ@–‹ œ³G›«ÇHYãVHü¸å‰Hݵ@à•Ôš‰¦Ó4o ivðé¢yôËSjz´YÙ”(Hq™ó o®î7ƺ l2ÝOvžx’ilæHØÃ»ÍTrdeØçjpŒ@ Г‹Ñ¯.l>˦‹ï.¬tx­-â¼ÓžÕm®YãŠ_%|ÙAgb1»8 k¨·’ êÚŸÚlnþÏtñ}…ì,%¸XàŽA"F1…q# /ïr¤’àXñ?ˆ¬tÔ6²Åi<ñ¼¸¾“ɶ· ÎÑË,¥X Ý ¿`ãp5qüIg†nµÉ##´´7W6¬ O"˜Ý3òÉ´”žã·4ÍÞÛ\Zðñ³»}kP¸¹šÖímÝ¢ÜîÍÍ8P¢1óëä¿w»Rðmå×…|E*Ã8ŽãûZy,œÜÜ ®>Ìâ=¿>å“vz“±^½3VÔ¡Ñ´kíRádh,­ä¸‘c±TRÄ 3ê*åsúà{MsKÕæ‚{>Ò)ÒHà…¦xå,G(Ac…YS* 7¦Òäq÷6zÆÌBùfÿ–'-†óEw‘Á /3Åhó>ùYTí´.[ÔíU=€ªJàô="X~Üè°Ø]Ϩ&˜Ö“YßÉ0W¸hÕ‡î‹p l®Ò:Ö|vz–¢ú•¥“êRCv=¾¡¨iín_QE‰¡i”¢•}eŒDá¶¶]yé”P—ß[xÛG}b·ÖÓj‘\Þ^b)35Íš¢¼hT‰’ÍY6¡”}„±Üd³°ñ,–öéjRZ^=ňšHn-žä¹” ]åV+ ’Jr$‘Y½2Šò»øüYrãR»»³µžâc:Ú[^Ͳhã‚–ò$ËÔ4«Ï°ÜµÌR}žy4èËYK"mcq…ˆ"YV0»È 1âId,VÆ5ñÜ80-¼2—6ghÅØXˆ3Ä6™™ˆ!‚á¾\ý3ÅÚÔÚF³â9`¹¸±ŽÓNe2<2ÜÁg®dU( ÄìÂn9;×'&±à ê~»Ò`Ñt«O6)– RÂ3öy$@¦E 7 r'hç[šn“¦èÖío¥éö–03—híaX”¶É Îöͦ¿«ÂâÍQ³¯ôا̰Ǻí„H¯ä‰dUa¸aC»œÀÇ:î© ­Þ‡+ù7+åÝ4{ö£chòÁH²J7Ê 5Ì…äFcÃ)M…€="Šóø®b°ñŽ›¤ZÇ®ZȺ‚™þߨ½Ê\BÖ×» nšL)hIÁ xRF@ÁpÓÜøÖ4’öøG‰|…Ž;ÉcCöZͰª°|Ä ‚å»3dÐ(¯?ð›Oe¥ø2xoo®®5›D}B;»Énr¿f2€v&Y>f#18ØG¤é°ÙMeŸh–“&É`XT#®Áq‚6*®`A\>‹áyõ‹{Yn.îàÒn¼9§ÚK&-·` ¼Èßr—Q¶EB‡ç89IsáíûïhÉy³Lƒí>Wî³ä^]Ãó÷ Ûi$äíoµíò†4$¹-ï‚çÒ`Ó†…ΗÄ"ŽŽÂÓt³,Jñ³ ‰i³”'*XŒ×Iý…£ÿÐ*Çþ=>Ãÿéÿÿóǧú¿öz{W?­¦¥âM+û&ïÃ3Æ¿k´’vškym¥Dº‰¤ óîeØȹ \þ³à›¹/¦Š=6vÐ!»”ÚéÖÙ²¨xm¶ºÅr J¡Òç8÷HHv4Þ\¾›á? ]\Ae¾Ÿ§[Ëpmí"TT`ª02y=¹5%Ž…£é‘G†•cir™Ñ ·HÂÈT¡pኒ¹ëƒŽ•ÁßxSP:V³gs¡Éªj—:cÁcªÉ<35¿úÄb2ÈRL´«!Ê Sçn8ÜÀ÷„u›ˆ ¸²»Ôl¡y¥–[e³–KÙd)²Y#º0ñ¬n„€0{P´q€vøOÃvöw6pøJŽÖëoÚ!K(ÂK´åw(lFzT‹á­RÉDÓBX9{5©‹v,˜øù `F9¬xnm"óS¼Ô#‘ï$xcŽâk“pÍÚÛ£ÄZHÛsmRû‘€¸ë(?Lд}ÍþÉÒ¬l<ìyŸd·H·ã8ÎÐ3Œž¾¦´(¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ ç5õãþÿ¡µtuÎj?ëÇüÿCj™ è©aDa#H„]ØSŒò¡õ¥Ýmÿ<¥ÿ¿£ÿ‰©(†Š›u·üò—þþþ&ÖßóÊ_ûú?øš†Š›u·üò—þþþ&ÖßóÊ_ûú?øš†Š›u·üò—þþþ&ÖßóÊ_ûú?øš†Š›u·üò—þþþ&³uI4û{c ^{¸`ËÉ¡ÜpÉÆqÏ_Ê+Æþ#ÈÝ/ýrOå^É^7ñþFéë’*qÜíW?ëWþ¹§þ‚+?SÿUçýpýÖ…ÏúÕÿ®iÿ ŠÏÔÿäyÿ\ÿA4º‘‹ï4m;M²‚÷Jìþ²»‚Ââ2nuH 0‘ Ã)TaåÇ€zM{ưéÚ£qi¨[¥è[yP[Æï¾U ‘b2q<]7бàí6´m3TV“ϸÑì­ÝIBÆ®ÊGÎelóØtï!ðŽ槮ÜjPA$:ŒBÑR<©0ÔHXðDŽ~V*yH¡î•¡&\ž0¼±×¯ÚÿHÔ¢ÓmôË{¹Ôýœ›d¹I&Ù `V58Mç ЃrûÇV|Ww3Ù_}†´ª]ªÆRy`YXoÞeå•Tì8nW2]xjËìšjšµÜÇT²M.{›†Š6*^P›v¢¨rn Ž9ÂðNs÷l5®í§½¾û ÿid´VŒ$β,²¡Ù¼±KÃ3(Þp¼.$“ÄwV÷qC z-å¢,÷'WØë»ĸŠB¬ ×E+‚Ç€gê!ñ —‡áÕä‚ÒDbñIi1k’ í',Ñ‘·Ê\Gæañ³çÐ×ü5eyq6¯>­w¦˜Ò–hÚ/-VÜÌêXJŒ¸fl°à¢0Á\Ô—ž:…˜µ¼×uY¡’&‚ñY¡ò"NUÀŒá™wDˆ#$•R: (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ ç5õãþÿ¡µtuÎj?ëÇüÿCj™ Ãþªãþ¹ý jŽçR²Òì§žúæ;xŠ„ #c-¸S€OàkþÐV×ü*FWñr_Ëý‹vö÷2_’„HÈ’2[Í"¤›y1–EÜ;Œ÷¬[-OXOL¾kÅ>°¶Ï 7jï’•»`<­ÊCíÐ8 >rÇ$+}üWá™^'“Qµv‰·ÆÌ¤”lÈテ#èO­Au¯ø>ù%K»>áfUIVXƒ‡U%”6G HÏBM0 &Ôü‚¿e…î'óm,Ù#buï ÈB6É´Ác“´ý;Ä:½æ¼#’ÁK’îâÒ9ƧtFA¸7šYÉ1“Ê\NH\µ„ñ/…#ŽÞ4¼²T¶Ç¡0"•F>_”‘ÇbEFšÿƒâÔ%Ô#¸ÓÒöUÙ%ÊÄ޼p[#åô 5+˨ô?H—3+Ûy¾C Å‹(˜m?ÃóxîI©¬5½NKëgºk7´¼Ôn¬"Š($‹Ê3aÙËÙ`€«Ëg<`åj’ø_UÕ×S“ÄB;ˆöù$ZÛ9‡o#kI8ç-÷¸$ãgF½ðnˆ^h/íe½•¤i¯¤‰ò—rí¹•FOLcéE€ìëÄÿê4Ïû ÛèbøL|=ÿAX?_ð¬ÝcÄN¦tË{+ø¦—ûFݶ)çÅ ×WüFÿ‘º_úäŸÊ½’¼oâ7üÒÿ×$þTGpgµ\ÿ­_úæŸú¬ýOþAWŸõÁÿôZ?ëWþ¹§þ‚+?SÿUçýpýÒê9k Í¯\[Áo§é²Oÿ¾˜‘ê7.Dú{1¹X‰pF<¢üÝÇI¨ßxªIõ]M“ý>Î+›¸®6Åûä‘ZGµ¸_Þ]Äÿ˦XbQ^W£x³Ç2iVqXøžÎÙvÓì,å¶S$ÏÇ„R!*?Ö Øry=MPÑ|iñã\{K=EáºÔ®!–w’Î= È"Š9÷gj•ò†@ÁÈ<“ÏrÂM«Ý_#Uv=?VÁ³ižW‡fÓ`ÖöÁf–¿@om÷4»Á“xm¥¼ÐNï¼ ¨õŸkÖÓiC[‚ÞÖÒîX_U¿¸†Ñœˆm¥HÚC‘n>|¸Q’±Ÿ•·yÅĈúœlluI®e¬Bt䑨²»q¶"8±Á9¤¢¾[ÿ…½ã¯úä¤üEð·¼uÿAÏü”ƒÿˆ£ê;¯ëäÞ'Ô”WËð·¼uÿAÏü”ƒÿˆ£þ÷Ž¿è9ÿ’ñ}B§uý|ƒÛÄú’Šùoþ÷Ž¿è9ÿ’ñÂÞñ×ý?òRþ"¨T{xŸRQ_-ÿÂÞñ×ý?òRþ"ø[Þ:ÿ çþJAÿÄQõ ×õòoêJ+å¿ø[Þ:ÿ çþJAÿÄQÿ {Ç_ôÿÉH?øŠ>¡Sºþ¾Aíâ}IE|·ÿ {Ç_ôÿÉH?øŠ?áoxëþƒŸù)ÿGÔ*w_×È=¼O©(¯–ÿáoxëþƒŸù)ÿGü-ïÐsÿ% ÿâ(ú…Nëúù·‰õ%òßü-ïÐsÿ% ÿâ(ÿ…½ã¯úä¤üEP©Ý_ öñ>¤¢¾[ÿ…½ã¯úä¤üEð·¼uÿAÏü”ƒÿˆ£ê;¯ëäÞ'Ô”WËð·¼uÿAÏü”ƒÿˆ£þ÷Ž¿è9ÿ’ñ}B§uý|ƒÛÄú’Šùoþ÷Ž¿è9ÿ’ñÂÞñ×ý?òRþ"¨T{xŸRQ_-ÿÂÞñ×ý?òRþ"ø[Þ:ÿ çþJAÿÄQõ ×õòoêJç5õãþÿ¡µ|ýÿ {Ç_ôÿÉH?øŠöÍ*ò}CÃz5íÔžeÅÅŒrÊøs¶I8IéXWÃÊ’NEÓ¨¦ô-¤o+mÏ\(ÍIöKŸù÷—þø4Cþªãþ¹ý jÍÀ¶€Êc’NUBF¹f$€ù5Êj\û%ÏüûËÿ|>Ésÿ>òÿߨ‹ÈšæHT‚#ˆÌÒ†0¹ïgý¥?B IðÊÇ*8`J•`rÁÅZû%ÏüûËÿ|>Ésÿ>òÿߪ ˜ ‰ž2ò.äPã,=@î)vÈ‹’Ñ^GR¸Pwc‚A'å<M\û%ÏüûËÿ|>Ésÿ>òÿߪ ˜ ‰ž2ò.äPã,=@î)Dð•!H;‡!Žóíë@¾Ésÿ>òÿߣš7·Ì$Üs£$€OrHÜÔÜÁq»Èž9võØá±ùVG‰ÿÔiŸö¶ÿÐÅnWüFÿ‘º_úäŸÊ½’¼oâ7üÒÿ×$þTã¸3Ú®Ö¯ýsOýV~§ÿ «Ïúàÿú ­ Ÿõ«ÿ\ÓÿAZh’xd†MÛ$R­´ààŒRÄ-`ñU¿†í­´¿jEÍÜ÷Kt4¯7 "D¢¡do‘Žä#øHÇ[Üð7G¿ÑluK]ÅKt¤«Ë£´EXÛ]C‚·ž3œôÝÇ0I¥kW^ƒE›Ã>!‰¡Jšc¸iR[¦UÁÆ‹‘–ê Ÿ”ç5ï¿ÚÒzËÿ}/ÿGö´ž²ÿßKÿÄÓúï[ ØyŸ.ÂâŸúµü—ÿ‰£þÏÿе¬à ¿üM}Gý­'¬¿÷Òÿñ4kIë/ýô¿üM_ö‹ìOÕ×såÏøC®»Ÿ.ÂâŸúµü—ÿ‰£þÏÿе¬à ¿üM}Gý­'¬¿÷Òÿñ4kIë/ýô¿üMÚ/°}]w>\ÿ„3Å?ô-kø/ÿGü!ž)ÿ¡kXÿÀøšúûZOYï¥ÿâhþÖ“Ö_ûéøš?´_`úºî|¹ÿgŠèZÖ?ð_þ&øC®»Ÿ.ÂâŸúµü—ÿ‰£þÏÿе¬à ¿üM}Gý­'¬¿÷Òÿñ4kIë/ýô¿üMÚ/°}]w>\ÿ„3Å?ô-kø/ÿGü!ž)ÿ¡kXÿÀøšúûZOYï¥ÿâhþÖ“Ö_ûéøš?´_`úºî|¹ÿgŠèZÖ?ð_þ&øC$’7R¬Œ ô ö­ïíi=eÿ¾—ÿ‰ªw‰ÝX)©É$’}­sâ1N²I£Jt¹Cþªãþ¹ý j»&ù ä“Å!'Ñ]Xþ‚¢¼[Ù-^+¨í¥|$ù˜\ç¸s9ç¿ÆWöwˆè`ƒÿãÿ‹®SST[*ü°»bRÛýöóbp½8]±…öph’ÑåžáVâi‹I,lÇj2¢¸€Nîcp^¸¬¯ìïÿÐÁþ ÇÿGöwˆè`ƒÿãÿ‹§p5ÒÙ>Ù#ˆâXXäÚÒË…T Dk…ll±G§ ŽãÏœÄÖ견ct¬ÙR¥ùÀSŸ¿ê:VGöwˆè`ƒÿãÿ‹£û;Ä?ô0Aÿ‚ñÿÅÑp5â·òöÛ£ ´Ya‘‹“½Äk ´ õ}ÈÆãéÍ{hv}ÌWÌ”¾-fÁHñåòã?»^z~ññT?³¼CÿCø/ü]ÙÞ!ÿ¡‚üþ.‹…¨áx¾Ì’¸?f²m9áÿuœdq÷±|Oþ£Lÿ°·þ†(þÎñý à¼ñuº­w-·Ûu¨¦Š ˆçض[ (Àã;øéŠè+Æþ#ÈÝ/ýrOå^É^7ñþFéë’*#¸3Ú®Ö¯ýsOýT55ÏúÕÿ®iÿ Š†SÑ4ï‘ Èªía¹T’#°%[Cé@ÇÑEQEQEQEQEQEQYÂMgÆ1i§R¾³€iï9û,Ia"¨ÎAöô«º‡}¨Ï§YøãP¸¾ƒwm¡ÉÓµ·(LŒÏCO”W/ÑL“ÁV°¼)/Š5´yŸdJ×1í´¶÷|ªÇ°'µø*Ög™"ñF¶ï ì•Væ"Q¶†Ã~”àö ÷£”.>Šd~ µ™æH¼Q­»Âû%U¹ˆ”m¡°ß»àíe8=ˆ=êOø@£ÿ¡^ÿ¿ñÿñº9BâQKÿô1ëß÷þ?þ7Gü QÿÐǯßøÿøÝ¡q(¥ÿ„ ?úõïûÿÿ£þ(ÿèc׿ïüünŽP¸”RÿÂý z÷ýÿÿÑÿô1ëß÷þ?þ7G(\J)áþ†={þÿÇÿÆèÿ„ ?úõïûÿÿ£”.%¿ðGÿC½ÿãÿãtÂý z÷ýÿÿÑÊŠ_ø@£ÿ¡^ÿ¿ñÿñº?áþ†={þÿÇÿÆèå ‰E/ü QÿÐǯßøÿøÝðGÿC½ÿãÿãtr…Ä¢—þ(ÿèc׿ïüünø@£ÿ¡^ÿ¿ñÿñº9BâQKÿô1ëß÷þ?þ7Gü QÿÐǯßøÿøÝ¡q(¥ÿ„ ?úõïûÿÿ£þ(ÿèc׿ïüünŽP¸”RÿÂý z÷ýÿÿÑÿô1ëß÷þ?þ7G(\J)áþ†={þÿÇÿÆèÿ„ ?úõïûÿÿ£”.%¿ðGÿC½ÿãÿãu$~EYœj:…é’>>×"°L2ýЪ:羞NP¹xßÄoù¥ÿ®Iü«Ù+Æþ#ÈÝ/ýrOåDw{UÏúÕÿ®iÿ Š­41\A$Æ’Ã"”xÝC+) ƒÔVnÖ¯ýsOýUi¢Yà’.E*J9FŒpÀ‚¸9€óý2Þ×ÁóC¥é–É=åþ«nV Uß Xï„j03‘€£ã pH6¯õ[‹]JY´½j¨f¶³Ž]ViâDDßzw6~uXòPƒœ}âíì4k]:vš oŠí"âþy×îÈäÇ\gó­ .?¡_Ý\®˜/5dš[k†òጲ\*ÈŠ²‰ ®p¤r+ù›”mº ( aEPEPEPEPEP]#þJ:Ø"_ý3J𾥩ÚÌš…ü–v‘jzœÖ‰mnÐÝFÒËs“Í.A&g\"òPä€wZ°µû?‰?µÚx­›Zˆ›vN][v@?ÝñíŽzíhýbÿ¾›ÿ‰«MÑÄ¥î§s&ƒâmM'š¨*ôØ&¸‰cKK˜Ìé†b²M#mqÑ ÁÍX†Êû^ñµÇÚß\‹F>h6Osf¼Áa°¥äÜ|§ø¼Î2 uP_ÚÚÛÅoo´0D#Ž=ʨ ``8ÅIý­¬_÷Óñ4]ŽWÀ0^­åÕî·¥±¨[Û\¿˜²¤ >ËlŽJÝ,¾j8Ú@Ón+¼¬ßíhýbÿ¾›ÿ‰£ûZ?X¿ï¦ÿâhº TVoö´~±ßMÿÄÑý­¬_÷Óñ4]*+7ûZ?X¿ï¦ÿâhþÖÖ/ûé¿øš.‚Æ•›ý­¬_÷Óñ4kGëýôßüMAcJŠÍþÖÖ/ûé¿øš?µ£õ‹þúoþ&‹ ±¥EfÿkGëýôßüMÚÑúÅÿ}7ÿEÐXÒ¢³µ£õ‹þúoþ&íhýbÿ¾›ÿ‰¢è,iQY¿ÚÑúÅÿ}7ÿGö´~±ßMÿÄÑt4¨¬ßíhýbÿ¾›ÿ‰£ûZ?X¿ï¦ÿâhº TVoö´~±ßMÿÄÑý­¬_÷Óñ4]*+7ûZ?X¿ï¦ÿâhþÖÖ/ûé¿øš.‚Æ•›ý­¬_÷Óñ4kGëýôßüMAcJŠÍþÖÖ/ûé¿øš?µ£õ‹þúoþ&‹ ±¥Yº·ú£ÿ\Ïþ„”kGëýôßüMV½½Žâ&ù“;v€¥ŽrÊ{¨ô¤Ú°X˯øÿ#t¿õÉ?•{%xßÄoù¥ÿ®Iü©Gq³Ú®Ö¯ýsOýT55ÏúÕÿ®iÿ ŠÏÔ¯âÒô»½Buv†ÖÕ,UT±ÆqÎ -QX­w©é°É{«Og$jGkinÂA+ºª ‘Ÿ ’ÁrU$´fªÍã+Kg1ϧßG$K,—hDdÚ$b6f|>mš6Âo88ÆAÒQ\ÜÞ2´¶sú}ôrD²Év„FM¢F#fgÃá†Ù£l&óƒŒdR]øºÒÇM{»›i¡x®E´ÖóOoÄå7€Yär¥OÊÄüÞÇÏÛx¾ÊîmÐZ^=™ _oÚ‚-Ó$mÚ[ÌçÍŒ}Î s€ SÅ3\jM…ñÓ[K¹½Œšð+BQ£PŲU΂“¼ddpÕQE (¢Š(¢Š(¢ŠÌºÔoWWM7OÒ¤¾ 7$É0S÷ˆHïÞŸ»Äßô)ÏÿÐñU6‘ÿ%?ì/þŽŽ¶mõÍRú JîÇH‚k[´Åj¦ód×ÂíB¥6¢³£ÛÏI$ IÙ»Äßô)ÏÿÐñTnñ7ý sÿàtüU?Ä:†¥aw­ZZO$³›Ý"òß|íªÍp2Bm݉çÎa´à,Ö.5¢Ûh¶-©Åçý©eÔ]!O-mÜlq gÊÝGÕ0ç‚]\¡»Äßô)ÏÿÐñTnñ7ý sÿàtüUV¼ñMÃiš•í•åô0ßdj6ò¬BY­ º‘ h’"'nËJp mKͤBdÖÚìé,÷ÛR½€Ã;¬p¬¤I Ƥ–ëbü°/º–,‚åMÞ&ÿ¡NüƒÿŠ£w‰¿èSŸÿ ÿ⪵޿⛋=UžÒ fƒUÓ"Ž#|Uâ’CdÏnÅ# ÆL²&I;ˆÚF+r?êWí£Ûé6‡Z‰åÅ%ó-ºª$JÊ",Ç0ðc^wóò‚Å\ÌÝâoúçÿÀè?øª7x›þ…9ÿð:þ*­éþ;›Rþ*5ÑMÅ¿ž÷D\n¹ŽŒùA6à”÷œlX.¹w{y ¾½%ŸC÷kHn¨dµP9 ¾h&C VòÆ\¬«E\ÌÝâoúçÿÀè?øª7x›þ…9ÿð:þ*Ÿ¤jº˜×tå¾¹»“·SÛ]yk2—¶K¥y¼¯Ý3¯”Ávq²eÉ ß]ÕtY˜k’êRjs"¤rý™læ•æŠмjeX–I£½ùö>v»‚È.3w‰¿èSŸÿ ÿâ¨ÝâoúçÿÀè?øª·«ø¯W±·Ö-æÒcŠ}?GmF{‹[àëDáU Å–raR2›ylýÐ$§®xßT¶ðö«x¶ZF´ml.b¹ódÛ$ä3ÆÑ…U?gs÷›£Adw‰¿èSŸÿ ÿâ¨ÝâoúçÿÀè?øª×ŸÄ÷öZ¶¦ßiö6³\lófšöE€—ªÇ†K6w–vF7 •ÏÒ5ýb;G³´ƒQ¾X¯!šæúùáó>Ç2[´„ˆä%¤,§#'­Ar Þ&ÿ¡NüƒÿŠ£w‰¿èSŸÿ ÿâ«NËÇêÕ`±O|öog’ÒÛÏ™æ’U*±Üü™Éò8?:çŸðw‹µ«Í?KÓ-m#ÔoÊ9d›P¿1 %¥“±av%šë?6NCØ!Ad.îñ7ý sÿàtüU¼MÿBœÿøÿZ~ñ÷ˆï5;¥Š?ìrð½£É&ÙãZÛÊ#1…Æ?xÇvòrqŒj¼:ö¥§ø‹^3ÛÇ>’ºÅµ ”Ý·› Kª*¤E6ìß bw¼çðÅ\©»Äßô)ÏÿÐñTnñ7ý sÿàtüUE©xþöY$³Ó­#YÞâݬ.A—Ⱥ„ÞAeä€.f\4^hà [Ð 35¼MqqÎP7.ªØä 3ß>‚‹ ¹Ânñ7ý sÿàtüU¼MÿBœÿøÿ]ýYÎw‰¿èSŸÿ ÿâ¨ÝâoúçÿÀè?øªïè¢È.p¼MÿBœÿøÿSZ~[¸cºðô–;…yÞî' ë…$ŸóÓ­w5 Ïú¥ÿ®‰ÿ¡ ,‚ç7hÑ<’;(Rå\ç9÷”»m¿ç¬¿÷èñT/üyËÿ]ù5CP2m¶ßóÖ_ûô?øª¡}¥öŸh‚IòG@YB„ ŒÄõ9è=ý¹³Xz¿üŒ¾ÿ®³ÿè–  Êñ¿ˆßò7Kÿ\“ùW²WüFÿ‘º_úäŸÊœw{UÏúÕÿ®iÿ Š§yŸcq‘ ÆøÙ|™Î#“#[ƒòž‡ƒÇcW.Ö¯ýsOýT4€ä­´]zy ¶§6tó‚€j"g·d`ñºæÙYÙYWýc¶yÝ»½Ù)nL"{Y÷3.íÐ,*ºgêqŽ0È|' ,z¦¢±Ge-ª+Æ¿e‰ö«`·-0X±ã¹æº (¢Š(QEQEQEWJù> ¬ÏòĺS¡s†2¡>§ò5·&… Ký ®ÍäêI ͸¾BË'ß" û˜ä–P–cœ“šI<±.Øåtp¬E;íw?óñ/ýöi© Äú¾‡¥ëZ”wWj û9Šh¡™¢iYeŽX_ÌF lŽWÓÌl“›F‡¦ÜGslWí¤‰çËtòÈÂCmîìKŸÝFbHÀªk¹ÿŸ‰ï³GÚîçâ_ûìÓæ‡Ÿ è«u¦ùSE¢[-ªÈ~*X¤·f}Ù>Q°Ö7©Î†«omª}Š7¾‰m໎æX²åå‘sWß#®Í§†5™ö»Ÿùø—þû4}®çþ~%ÿ¾ÍÁbýÆ‘¡Ý^½Ü¥|É)VéÕãttv@ÁKƒ Äg ;x¨îô-òy®š+‰¥óž{ké ±DB7Æá‚•Š<¨;IE$dfª}®çþ~%ÿ¾Ík¹ÿŸ‰ï³G0X¾š?‡â·’Þ(m¢‚Kˆ.LqɵDˆÄDp¡D1 £åéÉÍ;? xrÆÌÙÃ-ɵò–†]VâT‰T‚¦5iFRªU— ¸"™ö»Ÿùø—þû4}®çþ~%ÿ¾ÍÁbyt=-l ¶²»[y"½†óí2LÓLÌŽ»³#±rZ0bÉc„m¼¨ÛD~ðò$Êï-Á‘6y—zŒ×Ü÷o#–ŒîTl¡(‡ª©}®çþ~%ÿ¾Ík¹ÿŸ‰ï³G0X¶º€,ï-]šhïm>Åpg¾’W’Èv—g-ÿ-¤ç9çÀ§¦øWC³7/w:ß¼÷S¹¸wDòHÄ,,æ5;d(X($þñ¿k¹ÿŸ‰ï³GÚîçâ_ûìÑÌ-¦‡¢,¶²=ÍÌÿeÁ.u9æBC Èòv r# ‚6®2åðŽŸqâÔfÕåK}÷µ¥Ô–¾Y˜[îÃÅ"œÜŽŒÓy6~×sÿ?ÿßfµÜÿÏÄ¿÷Ù£˜,_ƒO°·Öb½ŽâÙ ¶²vvÑ…E·RÙ“8!‚B1—ÊãïKÐ|;¢ÏÚ|qC$Qy(~Ð̈́٠xåðÛÂ?à¤æ§Úîçâ_ûìÑö»Ÿùø—þû4s‰ãð߆ᲚÊ$T´šËìÀ·’xvþeÝ‚ûWÌ?>°*FдÖ$Õ™®%•'‘ ô†‘U\ÿË,&Ü‚ªz€j§Úîçâ_ûìÑö»Ÿùø—þû4s‡§…|0’´Xæ# h×ò²@…‘ñ Û8Êùavì]¸À­È%´¶·Š¹R‘ E2N]ˆ³Xû’IïXk¹ÿŸ‰ï³GÚîçâ_ûìÑÌ:?µÛÏÄ_÷Ø£ívßóñýö+œû]ÏüüKÿ}š>×sÿ?ÿßfŽ`±Ñý®Ûþ~"ÿ¾Åk¶ÿŸˆ¿ï±\çÚîçâ_ûìÑö»Ÿùø—þû4sŽívßóñýö*9î tUI£f2&`OÞö»Ÿùø—þû4}®çþ~%ÿ¾ÍÁb7ž{ iR52 Øœ7­`]ºË­Ú_ÛêÚ\i m,±—«2— ÂUQ‰Œ©Áø­K½:ÊÿgÛ,íîvgo¾ÜõÆGVÿ„{Dÿ >Ÿÿ€Éþ#"µB³ûÙç¶O±[[ôŒìˆìÊòyÿVœœž=ÍUÔn`¸ñ.äO»e›;6?rÞ•þíþ€úþ'øT¶ú6—i:Ïm¦ÙÃ*çl‘ÀªÃ#=(íxßÄoù¥ÿ®Iü«Ù+Æþ#ÈÝ/ýrOåN;ƒ=ªçýjÿ×4ÿÐECS\ÿ­_úæŸú¬ýJê[-.îî gºšD·Lî••I 0$Œt=i%µå­ç›ö[˜gòd0Ëå8mŽ:«c£ ò55yÄ:_‰4”Kn£²Þi“<„ÍÌbiŸt@o‘%$–Ý‘ݸ.êæ[H$²êé*j61X2Kpa6ÅàV2Ÿ-˜±˜0–9AZ,uEyÜ’ê÷vºig‚Ò5'Tž<Éö‹Es怢Xü»ŽpsO¸‡ÄÛ:Ùɨ©—íI3ËæË¶(¯"HÊÛƒ}œÈFÂO½’øj, Óh¥yR9Ú&Ù"«Q°Ðáúë\F“¦_^ßYÁ{y«Ë§ˆî«>snÊe<™±æ6~öЦªéÐjLÔn¯æÕ,µ{è-gyRÖâT(a·I?ud.²)Û¶E#E€ôJ+ŸÐŒÅtÃ=®£jæÚàùOs$ñæ& ¼Œ P\1Šè(QEQEQEŽ4‹-oÇQZjÉ$ ¦<¡gæ *AèÇó©ÓDð ø¢o}ÝN(£—ÉmN@ϼ9Ú«æî,7Ž”÷©ôù(éÿ`‰ôtus¢j×Þ-ñv¤ÛÏgk}¥4r­ûÄaýó^ñ˜ËH7LûÆîŠÓ"QkbYp[|=[{yæµÔ¡ŽâÊ]F'f¼ekT™w)*Ý­´Ãz¡˜ é?á^xgþ|gÿÀéÿøºÇÖâ½ñ“&™§N¶·ÞÔ,šâwVÚyü°#•C— +€§k9Ãc?Yð}Æ¥uk-ž‡}§Z E†ÊÎÓìÿgÎ%”¼¥˜IäîÝo·Üÿ)$nUÄuð¯<3ÿ>3ÿàtÿü]cÙhž¿ÔZÆ {ï8K$¥{Øã’HËD‘ˆG`QøRN@HÏ»ð=é¶Ô%¶Ò [é¢ÖgITÆ®×osºÊ]ÙÿX¨Ï±ó”ÜFW8­‹-3V¹´m}*{HS[“P7ÒËFñ‹æ¹@Š®\³ ƒ ª,rJ…`ûž°ÐäÖ%Ó¯¾ÉBy3sp\fFpÃjåŠãw[×½Ñ<§x†ËC¼ýÅõäM,)&§"稫ƒ.w1c´ÎÇô¨ü¤7‚ü={ªëV-äVö±F‰"ÈîÎÚ3Jn÷š2˜.U:€•—¥èš·‡üiá>ÊÞxç‹Jòïeg‰­.6 (æuçÍ"*ŽçHŽ6™ ÔG~Ño XêCíW²ØÛ:Éw"Í,d‡F;eeöÿ«vQºµ,<á ON¶¿³µžK[¨’h_í—r0N ädÖ³ô¨¯WKðU„t÷hWeÔZ7D+i-÷î¬U¼Å‘p2c!° PqÛÀ× áí Nmt·Óâx/m¬b°¶\ì…EÐYó) ÞÛeù‡ Ãþç†çÆüŸÿ‹¬vÐü ºÄšZØj²]E*C!…/äŽ7eV¤\ ù]IËp8ªö^”êQI©ép^yš„Ky=Ë¥ÃÜZ¦œ‰‰€2/ÚQN Œ²‡Ú:‹ž ð•ì½î¾Ú’jEííÕ% #%º9uI69ó@K»äb€$Òü)á ]¯¾|Ÿe•":æâ2KE£å/¸|²¨!€ ‚1ÅW}áüsëpºÎ$Ñ"Yµö›¯Ü£!½ó| Ÿ—?sv¾Ö—J²‡RӮ嶉#YZýŠfiE•”AÊÜæ,+C:gïÃnU˜Ö†«àÝ}<3®5¥¼—Z´ˆmcY.ÖF»‚[x%Ì­´dK“qUfòq…h¬ÿ…yáŸùñŸÿ§ÿâèÿ…yáŸùñŸÿ§ÿâëñG…|A©jºÅ®™?Úî⽂Yàq[ÏZÌ!~.·7%©#åT#CPð^£×ãÃöi’=ÜÐÚ\@ˆÕôöP §Ì±ý¬ïØßùñžhSQðw„ôÄ·’ãO»ò¦¸ŽÜÈ·³‘HÛP°ó3‚åW€pX€ ÓDð ø¢o}ÝN(£—ÉmN@ϼ9Ú«æî,7Ž”÷¬øôÒ¼%¯éÑYßY¶·éÖ–·_dBg‘] ‚+E+†wË9H˜•1º½Î‰«_x·ÅÚ>“o=­ö”ÑÊ·ï‡÷ÍxCÆc- Ý3ïº+L‰@Ámðõmíçš×R†;‹)ušñ•­Peܤ¨v¶ÒC è †`+¤ÿ…yáŸùñŸÿ§ÿâë[Š÷Æ>Lšf:ÚßxP²k‰Þ5[içòÀŽU\24,®¬@ç ŒýgÁ÷•Õ¬¶zöh-+;O°GýŸ8–Rò–a'“»tm¾ßsü¤‘¹TPQÿ óÃ?óã?þOÿÅÖ=ž‡àmCQk+[ VIY!2l¿‡Œ²¸óOîø*ÃïrF5Ÿwà{Óm¨Km¤@·ÓE¬Î’©]®Þçu”»³þ±QŸcç)¸Œ®qZš&™>Ÿ6« ›¡uq~ÎZú)-&ŠI¤‘U`{ ²•_õc–;ˆ\¸ðW„-'´†{YÒK¹L0¶\î¤#‡ãåF<úz⣰ðw„õ¼Ž=>í%³¸6óF÷³å[j°9C#£ ŒÁ û¯ ]É ©Õt8õ–µ½[™‘§Kƒu“4q¦r¹0´£ïí “&Gu&“þ™âÝsS‹›UŠßOWìòBÓ<…OB Î9Èxä ¼€Wÿ…yáŸùñŸÿ§ÿâèÿ…yáŸùñŸÿ§ÿâ먢€9øWžÿŸÿð:þ.Ÿ‚ô 2æË[9x¥B…î¥pà>ë1¯¥tµ Ïú¥ÿ®‰ÿ¡ 碑ⴕ£vC½Tã³TI¨É+Ê‘Þ3´M²EYrQ°ž¡´õÿ9ë¢&®#LðƧÄ­sÄR^¼+qÚ¡\m‰çô A£g= ™Fߌ/.‡„5L\ÍÌOÎy‚?*Ö¬?ÿÈ£©×/ê+rŽ€ã¿än—þ¹'ò¯d¯øÿ#t¿õÉ?•8î ö«Ÿõ«ÿ\ÓÿA Msþµëšè"¡¤7vv·ö¯kym Í»ã|S tlŒƒÁäøU[}G´ž í´›f·Rɲ+D¤’B8³tþñõ­ (QEQEQEQEQEQE–vðÛkŸÚÆW cl©å‚»K$òr£õëž6¶?ÚÿÈ?ýr—Zêêé¦éúT—Ó´à„™#† ~ñ©ûÓ÷x›þ…9ÿð:þ*š¸´:íö¿òÿgGöÇû_ùÿ³®_w‰¿èSŸÿ ÿâ¨ÝâoúçÿÀè?øªz‹C¨þØÿkÿ ÿötlµÿû:å÷x›þ…9ÿð:þ*Þ&ÿ¡NüƒÿŠ£PÐê?¶?ÚÿÈ?ýÛíäþι}Þ&ÿ¡NüƒÿŠ£w‰¿èSŸÿ ÿâ¨Ô4:íö¿òÿgGöÇû_ùÿ³®_w‰¿èSŸÿ ÿâ¨ÝâoúçÿÀè?øª5 £ûcý¯üƒÿÙÑý±þ×þAÿìë—ÝâoúçÿÀè?øª7x›þ…9ÿð:þ*CC¨þØÿkÿ ÿötlµÿû:å÷x›þ…9ÿð:þ*Þ&ÿ¡NüƒÿŠ£PÐê?¶?ÚÿÈ?ýÛíäþι}Þ&ÿ¡NüƒÿŠ£w‰¿èSŸÿ ÿâ¨Ô4:íö¿òÿgGöÇû_ùÿ³®_w‰¿èSŸÿ ÿâ¨ÝâoúçÿÀè?øª5 £ûcý¯üƒÿÙÑý±þ×þAÿìë—ÝâoúçÿÀè?øª7x›þ…9ÿð:þ*CC¨þØÿkÿ ÿötlµÿû:å÷x›þ…9ÿð:þ*Þ&ÿ¡NüƒÿŠ£PÐê?¶?ÚÿÈ?ýÛíäþι}Þ&ÿ¡NüƒÿŠ£w‰¿èSŸÿ ÿâ¨Ô4:íö¿òÿgGöÇû_ùÿ³®_w‰¿èSŸÿ ÿâ¨ÝâoúçÿÀè?øª5 £ûcý¯üƒÿÙÓ[UWÀv;C8‹‚÷½«™ÝâoúçÿÀè?øªšÔkòÝÃׇ¤´Ü+Î÷q8@O\)$ÿžhÔ4 ùu5¶i°Ú;3†v¹•”ÀTç9öÆ;çŒÝþ*ÿž7ýþ—ÿ‰®†8Ñ¢y$vP¤/ʹÎsî=)vÛÏYïÐÿâªFrZ¥—‰µ]2âÆXô„I“iešLürºz¯¬_Úé:=Õù3KäF\G°.ãØgÙ­nüÏ-~Õßµ_j »|ÇÁM§žsŠ ðÜ)ýÍõååä2+‰¦òÁ!RTT!Whó¤=3“É @îÚÍuªÇ7Ú$¹–Ý¢ oË—qœ„#a¿›÷…]³¹ûe½×“4tk'•:í‘23µ‡fÁµJÓJòµÝCS•!ß6ÈáòÇD »™¸ûì±Ä?†®ÙÛ}ŽÆÞ×Κ&5Í·HøÜÇ»dŸZšŠ( aEP]#þJ:Ø"_ýw5Ãi_'Ä™þX—Jt.xPÆT gÔàþF»?µÛÏÄ_÷Ø«[ɨ¨~×mÿ?ßbµÛÏÄ_÷ئ"j*µÛÏÄ_÷Ø£ívßóñýö(j*µÛÏÄ_÷Ø£ívßóñýö(j*µÛÏÄ_÷Ø£ívßóñýö(j*µÛÏÄ_÷Ø£ívßóñýö(j*µÛÏÄ_÷Ø£ívßóñýö(j*µÛÏÄ_÷Ø£ívßóñýö(j*µÛÏÄ_÷Ø£ívßóñýö(j*µÛÏÄ_÷Ø£ívßóñýö(j*µÛÏÄ_÷Ø£ívßóñýö(j*µÛÏÄ_÷Ø£ívßóñýö(j*µÛÏÄ_÷Ø£ívßóñýö(j†çýRÿ×DÿÐ…k¶ÿŸˆ¿ï±QÏq¢ªM1‘0~ð  ÿ9ë¢&®>ÃÆKqñUð¤öÎ$·T–Þhв²ј?÷H-ÁèrºÇž{ iR52 Øœ7­dÛÖòòò ¬Òæñ•®%®é ¨UÉÏ@§SÔœæQ_Æ?ò(ê_õËúŠÜ®sÅ·Ö“xSQŽ+¨Ì\*È <ŽÕÑÑмoâ7üÒÿ×$þUì•ã¿än—þ¹'ò§ÁžÕsþµëšè"¡©®Ö¯ýsOýT4€(¢ŠQEQEQEQEQEQEH“ËíŽWA× ÄS¾×sÿ?ÿßf¡¢€&û]ÏüüKÿ}š>×sÿ?ÿßf¡¢€&û]ÏüüKÿ}š>×sÿ?ÿßf¡¢€&û]ÏüüKÿ}š>×sÿ?ÿßf¡¢€&û]ÏüüKÿ}š>×sÿ?ÿßf¡¢€&û]ÏüüKÿ}š>×sÿ?ÿßf¡¢€&û]ÏüüKÿ}š>×sÿ?ÿßf¡¢€&û]ÏüüKÿ}š>×sÿ?ÿßf¡¢€&û]ÏüüKÿ}š>×sÿ?ÿßf¡¢€&û]ÏüüKÿ}š>×sÿ?ÿßf¡¢€&û]ÏüüKÿ}š>×sÿ?ÿßf¡¢€&û]ÏüüKÿ}š>×sÿ?ÿßf¡¢€&û]ÏüüKÿ}š>×sÿ?ÿßf¡¢€&û]ÏüüKÿ}š>×sÿ?ÿßf¡¢€+]éÖWû>Ùgos³;|è•öç®28è*·ü#Ú'ýôÿüOð­*(7þíþ€úþ'øV•P^7ñþFéë’*öJñ¿ˆßò7Kÿ\“ùSŽâgµ\ÿ­_úæŸúª—3}žÖiöîòÑŸnqœ Õ»Ÿõ«ÿ\ÓÿAŸ©ÿÈ*óþ¸?þ‚iNÒ÷ÄÖp]Ûx^w‚xÖXßí Êà à¶G´,%šëL‚öhR?æEI–PS«RT‚#ñÃ’o ø·W·±ÑψÒÓÂÚ³_Ç·6¾\)Û¦z 0 ì0ùDܶ––6ÖV*ÒØaPÅ‚¢ÆŠI$à rjšBE¶Zù>wÚaò¼Ï'~ñûömÏ÷·ü¸ëž:ÔÕÅí›ìØ¿d¼ûoö×Ú¿ãÚO+ÊûwŸ»ÍÛåÿ«ç³Ÿ—ïqY›u·Ó]RmDÅö˜þר¼W¡ç]’¶×rÉÅŸ$í;»*²,Øg£Õ[ JÃT§Óïm®áVØd·•dPØó‚?:Â:ß‚b¶‘溟ÌGuš?)çf c*ìÇæˆlÄ“ŸÞKb®§%Þ¥{«¥C} Ë]·’ 'Qs „`ÂF³vçÍ*»‹0qš% 2 ™Õc,72‚ w²çê=iõÂÀ%Ô<`º­ÄZ¸ÓÖæX­XÅqVhìö‚€Žlî^AÏQœímB}IºÓ¤Ö¥_²[O©½Ã\1wÛ¹1ùœ°1‹œˆ²0r‚‹éh–t€È‚gVuŒ°ÜÊÜËŸ¨õ§× —Pñ‚ê·jãO[™bµcÄEY£³Ú DZ9³¸yy=Ftõ»mv]m£ÓfÙöÑÈŒìâ8ÞvÚÅzy$Ž­J8!h¤DÓ¼D3"«´a†åRHŽÀ•l}¥2òî ‹Ë§òííãie|µTdœOµp–öºÍþ¯d·«¥Ô‰pê³M‰íòfR ²ƒn¬3€BFÚ«¬Ã¨O¡êÖºŒzÔ«öK˜4Ä·[†.â[„O/–1mƒ.CNN\Ñ`=.Šán­µ›É®­m&Ô`Õ¦’ò9e‘¦[d·)0·d?êƒmŽcùþöyßWl?·nu› ‰¼è­.¤mA£mêaAÆ pxVÃ۾ΛÖsžP[EP3)µ-J}VîÃMÑd¾kU¤u¸Ž0ƒ¾G÷OLô«¶k­Kq¶ÿD{v³y¯s™ IÉÇÓùøXˆ|Uâe!#xíU]¸ @“ äd~bº[é▱ʎ~s…`ª¬¬IÉjÆ™¤ùÚZŸ›Ÿ/í3¬{ñŒãqÆGçWkŸÕíu9¼S¦K¦É ,®–I§¶i£{råtäŽz)ãÓ""ÿK°Õ ¶¸ÕÞÒ{[Kx÷·‹°™£ ,TIÊò˜bs#;z+Îî¢ÕÜ]Í`u¯²[Z^ϦyÙ-ŒbEc½Ï™çíIAÈÎ\SîOÙ{=4Êëª$ÅÛߤN_Èón f4C¹As>XÉÊæ€;z+’ðå¶§.µ$×Ój+i ²›X¥fàÏr¾y.!ò²ç\ˆ5ÙµQâ›g¶ûd>]Í´H‘[ÜË𳯘ìÊÞJ`4€‡BÀ&àFT€ÒŠám-®íôMëk²Á-‘’ôÄ×qtV-ŠÂÞ*…‚1·#-— šº6¡ªÂ;cͪMu{>™<2¬sJ¦ –¾ii* •˜°b3’Hù²Kè”WŸivºÍµ¦Ÿ)m\ΖÚd®'ši?{,¥.ƒ$FTñÞI&ªÙZø†[P—Wº£Ï+Z­üqÁsÉ Ä>fÙZR0Îæ©·$àlXH3D³¤D:³¬e†æP@$à\ýG­>¸ˆôùáñl tº£iÖsˤ‚Iݳ"Z:‡`K<{ÄÙ.J `‘…¡áµÿ¦}«í“ýÏô럴Eö‡ù‹bÞoõ8ÈûŸ#gŒcj€tõÌßgµš}»¼´gÛœg5-UÔÿäyÿ\ÿA4 É·×µ[»h®`ðäï¨$FûTC*FAÁ>•³a,÷ZlWsÛý¤f/0>ÆWŽsÛ?á§éšœšM…«ÎÑZIiœ„bHÊÆ  ÏLÿãÔ¬i›ocŒÊ£= Šb+½ÌJ±Iæ;Ie—jóŒm=¹5ímå)gGsç¶\€á#‡Ëq?ÀúϽϨ°\¹Eg$&Ù,ë‘7Ü4sï˜mc…‹p nÚ>B# È¤‰ã³‰®YL„¡GùœárÌ>N™%¿,'¢«Ch^fi¡¹HÈÑÆòJ„ Â<‡êeÆãôàSfŽv´±VyTºFó‘3dÇœmB­Ë`pGåš,-ÓVXÝŠ£«ÔœrGó~«<Ʊgí¦0™¸ù66ÂÍ´(,Hlc¹m¹'µ%¼.· óÁpdu`‹™6¨YgÎ@8˜ÝëÇz,'¢Š) +Æþ#ÈÝ/ýrOå^É^7ñþFéë’*qÜLö«Ÿõ«ÿ\ÓÿA%X2’äÚ¥¹ÿZ¿õÍ?ôPÒoµÜÿÏÄ¿÷Ù¦I,’ãÌ‘ß718¦Q@Š( nìíoí^ÖòÚ›wÆø¦@èØ9ƒÈðªVžЬ.’êÏEÓ­®;%†Õ×# Ž iÑ@2b·‚8 "†5‘¢…UP0 ŸEQEQEQEQEH—¢…I¤Ub)º¸e*ÓÊAà‚çšŠŠ¥¨húf­åÿiiÖwžV|¿´À²lÎ3Àã8•Oigkaj–¶vÐÛ[¦vE EÉÉÀI?MEà M:NcC2+"ÈTnU$ì UÏÐzSè Š( Š(  ·úm†©Á¨Y[]­¼GqÈ¡°FpAçþujŠ(¢Š(¢Š(¥«RA‚;RQ@}®çþ~%ÿ¾Í2Id—d޸鹉Å2Š(¢Š(¢Š)¯RàK R€rD3ô€v÷WW w2¬ò€€ÏÔ_k¹ÿŸ‰ï³Eßü~Oÿ]ùÔ4€›íw?óñ/ýöj—ü$vŸÚÙŸÛ0ÿhϯڇ›÷w}Ìç§=:sS×1¤ßM¥hé'O¼ŸX¶¶`Ëöy+™Â–-ö¾_ï-¹Žrÿ0 ‘@oÚîçâ_ûìÑö»Ÿùø—þû5æZm¶©uªÁa%Ö¯.–nbwE{hFaºÜ Ë!“n僣mÉ^2NtôïµR$Ö?µþÏ‹í%nf\ÊcûË勚\†99s@Ö¬ÖP¬·r¢4‘Äæ?3¸Ez³øÔÿk¹ÿŸ‰ï³^]ci¯K _mžúâ>Íïak9Õau1 $Œ¤%ÿP¢<NA^—@}®çþ~%ÿ¾ÍVÔ/nÓMºtº™Yar‚ >ªêò ¼ÿ®ÿ šo„ÿä ¡ÿ×½¿þ‚µ¥ö»Ÿùø—þû5›á?ùhõïoÿ ­\  ¾×sÿ?ÿßfµÜÿÏÄ¿÷Ù¨h cÚþU‘#k·ùÚ¦C–Ç\ óOû]ÏüüKÿ}šËš;óÞ,2ÂÈ#Üî‚üîq¼0LätÇN*;ˆäK;–Œ] "û_Ÿ92l|СK|Dcåçõ§aÆúutCq6ç$( NHŸÐøS¾×sÿ?ÿßf¨›B÷§ÉŽî]̱™<ÀÜÃ8fgÍÿ<ùé“ëš}®ù-þÕ.7MŠ„ì ¹Œ“Ã1lê«ëE€·ö»Ÿùø—þû4}®çþ~%ÿ¾ÍCE!™>0¼ºÕ1s70?9äü«vЕœ²’G Žß)®sÆ?ò(ê_õËúŠè­¿Ö·ýsýÓ}®çþ~%ÿ¾Ík¹ÿŸ‰ï³PÑHdßk¹ÿŸ‰ï³L:Œ‹:@oLêα™~fP@$ òeÏÔzÓ+ŸÕôû»ßéowyf‘Ù]¸¶Ž6ä½¾—FQœÓ?/± GG£$è^Æ‘C2Ir)*ÃÔAô Ôvº³^ÂÒÛÝÊè²I;˜|ÈåsèÊGá^dl|AòóQVK“hég,,æîr]„Oc*a#ÎYÝÆúÚâ¾Ö-Sû]5Ži´Ø û@ˆL÷—…@¿»Ú؈æ_”éš`z§Úîçâ_ûìÑö»Ÿùø—þû5 †Mö»Ÿùø—þû5‡â‹«†µÓÐÜJQõ+`Ê\ᇘ?ˆð­jÃñ?ú3þÂvßú¡ܯøÿ#t¿õÉ?•{%xßÄoù¥ÿ®Iü©Çpgµ\ÿ­_úæŸú¨jkŸõ«ÿ\ÓÿA (¢…p°x²çFŽm;þn᡼¼&Xì¤(áJ§#k¯5ÝQ@Ž'þû¯úuïü—ÿˆ£þû¯úuïü—ÿˆ®ÚŠ.€âá?ºÿ¡G^ÿÀ)øŠ?á?ºÿ¡G^ÿÀ)øŠí¨¢è'þû¯úuïü—ÿˆ£þû¯úuïü—ÿˆ®ÚŠ.€âá?ºÿ¡G^ÿÀ)øŠ?á?ºÿ¡G^ÿÀ)øŠí¨¢èçÇ7W³Aÿž¼¾b2nû §þåj|<¶¸´ðE”7Vó[Ê$ŒsFQÀ39Rƺz(¸7^(¯')¦k†F*ÂÂL0Ï^FjøIâÿ N³ÿ€þ¹EaÿÂOýuŸüð£þx¿è¬ÿàÿ…nQ@ð“Åÿ@gÿü(ÿ„ž/úë?øÿá[”Pü$ñÐ'YÿÀÿ ?á'‹þ:Ïþ?øVå‡ÿ <_ô Öðÿ¡¼ñ \YO iZÀi#dØIŒ‘J訠 >o°èzS\¤‰ä[Bd_-‹.Õ@Éñ¿Mf½pF3Gü$ña@Òu€B¨{€§ ­Ê(¸ð“Åÿ@gÿü(ÿ„ž/úë?øÿá[”P#â `êz핾•«ù²ÇµwXÈ*ë^î;¥¸‘%uXØmŠ6‘‰ €€IäëÅ-\ ?øIâÿ N³ÿ€þÂOýuŸüð­Ê(þx¿è¬ÿàÿ…ð“Åÿ@gÿü+rŠÃÿ„ž/úë?øÿáL!µYÞq¢êÂgUFiϹ”@'€Y±õ>µ¿EaÿÂOýuŸüð£þx¿è¬ÿàÿ…nQ@ð“Åÿ@gÿü*†§©¶¬Ú|iº¢2_Á+4¶nª8É'WWEã¿än—þ¹'ò¯d¯øÿ#t¿õÉ?•8î îî>%xu¦ùd¸`Wp„ààŸÒ¢ÿ…‘áÿïÜÿ߯þ½Ur¡\?ádxû÷?÷ëÿ¯Gü,ÿ~çþýõ袎TøYþýÏýúÿëÑÿ #Ãÿß¹ÿ¿_ýz(£•ÃþG‡ÿ¿sÿ~¿úôÂÈðÿ÷îï×ÿ^Š(åApÿ…‘áÿïÜÿ߯þ½ð²mž>2øˆÿË–ÿ€§ÿЧŒ~"?òå¤à)ÿâ«SX±¶ºð¿†tùô´¶±ƒT»µ¾•fi¦ír†@vµ€Ý 9#®jü~ ðÜÞ3²ÒßÃZ¥¼?o¸…¥’a¶ž%ŠB ;JŘ2v†ùkKPJî=ÿoS¹ÏŒ>!?òå¤à)ÿâ©Ãâÿˆü¹i?ø øªŸBÒü7¡Øj  !~ ƒK+qw+²DbMÇ(È ÜÙÆìcV®ð÷I›P–Êæ¼¶šþöÕ. IKE‹*¾l‹"¤lH ³ŸC€5‡ïN£Ù™“üRñM§•ö+N‡ÎŒK™d˽F<ƒØŽ*1ñs_?òç¤ÿà1ÿâªŸŽ¦–Þo M ±ènŽŒC+ ÄGB+§Ôëþ*ðF•­_Ü>u¤ÛO4opBË6Ù0NOÞc…ÏÞ9À9£ÙÒI7ÿ€sNö¹Œ>-kçþ\ô¯ü?üUX‹âo‰æ¶šæ=3Ox ÛçJ¶lV=Ç ¸ç'žµjÛšD±XMu¥}—V“K½¸:?™*ù’ÆØˆlf2üÃqÀaœt9ÐþÅÓ¬|=­ZÅkqºµÒ%½²¶%å†W˜ï²Á±‚‰9oLRj‡HÿW°'>æø­®ÿϦ—ÿ€ÇÿЧŠšéÿ—M/ÿ¿úõWÇÚ%†udtè­â·¹Y#òçŽuPØbJÄãŽÝóqÀ®DV£Fk™D—9§kÐø¥®ùtÒÿðÿ¯O5³ÿ.šgþõë†ñUõj_Ê/k>çp>'kgþ]tÏüÿëÓ‡ÄÍhÿË®™ÿ€ßýzâH´}^—ò‡µŸsµµ“ÿ.ºoþõéÃâF²å×MÿÀþ½q‚ž)}^—ò‹ÚϹوÚÁÿ—m;ÿÿúôáñW?òí§à?ÿ^¸áO}^—ò‡µŸs°õsÿ.ÚwþÿõéÃâ¬åÛOÿÀþ½rž)}^—ò‡µŸs®?Õü»iÿøÿ×§ê§þ]ì?ðÿ¯\˜©W¥Ø=¬ûPñÞ¨åÞÃÿÇøÓ‡ŽuCÿ.öø?ƹaO¾¯K°{Y÷:‘ã}Lÿ˽þŠpñ®¤å…þŠæÁígÜèÇ‹õÿ,,¿ïÀ§êþXÙÿß\詟`ö³îtÅwÿóÆÏþü pñU÷üñ³ÿ¿°æðñEñÿ–6Ÿ÷àS‡‰¯Oü²´ÿ¿°…H){ }ƒÚϹ¶ÁígÜÓÅÉÿ–vÿ÷åœ5kƒüÿ÷å³V¤½>ÁígÜÐ¤çø ÿ¿+þñ©N‚ûò¿áYâ¤{}ƒÚϹ£ äóL‘*ÀØ(Ì+Ž ±¾Oùïeÿ~ÿTl?ãþÛþº¯ó®CÆ6:æ¯cÿä[ëëcS#e¼PwŽRU„™8Ú€ÍÀëˈQƒJ(è¢ÜÓ»;GTlË,¶¯æL¢¤–v :¨óô…yĉ^o»9é`0Æxºšé-`‚Ûš\Qé×–7 «Cö´¼ËK$ûÆùLb]Çã‚1Œc—ø‡ÿ#[ÿ×ÿ•c{Æö5ÚV:Ÿˆ¾Õë£þ^ôïûøÿüE{}z°{@>ëƒþ^ôïûøÿüE<|-×ü½iÿ÷ñÿøŠõÊ)}z°{J>ëcþ^´ÿûøÿüE8|1Ö‡ü½iÿ÷ñÿøŠõŠ(úõ`ö<¤|3Ö¿çêÃþþ?ÿN 5‘ÿ/6÷ñÿøšõJ(úõQ{\>kþ^lïãÿñ4áðãXòócÿ}¿ÿ^ŸE]ª?ȧí\ËÍýöÿüM8|<Õ‡ü¼YßoÿÄ×¥ÑG×j‡°æÃáö¬?åâËþûþ&ž<ªùx²ÿ¾Ûÿ‰¯F¢—×j‹Ø@ó±à-PËÅŸýößüM8xTòÞÏþûoþ&½ Š>»T>¯Ïǵ1ÿ-í?ï¶ÿâiÃÀú˜ÿ–öŸ÷Ûñ5ßQG×j‡ÕàpcÁZÿ–öŸ÷Ûñ4áàÍDËk_ûí¿øšî¨£ë•Cêð8àÝDËk_ûé¿øšpð~ ?嵯ýôßüMv´QõÊ¡õx`ðøÿ–Öß÷Óñ4áá;ñÿ-m¿ï¦ÿ ìh£ë•Cêð9á[áÿ-mÿï¦ÿ pð½èÿ–¶ÿ÷Ó…u´RúåPú¼PxfôË[ûèÿ…·T>¯Ðÿ–þgü)ÃBºòÒÌÿ…tQõºõx#D¹Çæž4küq~gü+nŠ>·P>¯iøâüÏøS†•8þ8ÿ3þ¯E[¨W”4ɇñGùŸð§ :aüIùŸð­:)}j }^p°”~gü)ÂÊAüIùš¿EZ¨WLZH;¯çNÎ;­Z¢­T«À¯äÌ£1ËåH>ì‹‚Tö# Ž=Á‘ÿåÏý ·ýþOþ"·è¨•yKr£J1Øç†I!iõ}Fáb•%Xå‘ –S‘Ÿ“Ú¼ïâ Ç‹$Çü«ÙkÆþ#ÈÝ/ýrOåK½Ê–§µ\ÿ­_úæŸú¬ÍcPþÉÑ/õ/+Íû%´“ù{¶ïØ¥±œgqZw?ëWþ¹§þ‚+3XÓÿµ´Ký7Íò¾×m$fÝÛ7©\ã#8ÏLÖe˜IãXæ—o%ªD'Y>ß#ÎØ:,¤©$aÆëy×p /=΃x¯IHÕ™ïÚAÀl'U˜ÍûHGù±‘¹àÓ5Ÿ Yë´eÞšy&¹)ËH^Ùí¸'…!Y{òôäšËO >‹%¥õ½´óCv%k}ÂUeÌ€ò œÊyÜze‰4xx‡Jk[«‘uû«[oµNLm˜ã˃‘Œ†)_¼ @4ýGQ–Úx,ìíÒâþuy#ŽI h ïf}­€ ¨À’ÃŒdŽb/ jºn¨‘JúcjK=½Ê_[$Ìcyf‘JySaHûC®I9ÚÑß§Ôténg‚òÎá-ïàWŽ9$ŒÈ…®õdܹ¢œ‚*9ÆAõèl(õm–÷EwÊ–ÂKˆáLä6)üÎ|­ÉÚMV¾ñ†›mc¨Í,¶qÜ0Y ’(æxC$eÚÍò7Ý$áXà€j;ß_ê p'Ô­ƒ_Ú +ò–ŒÄ ˜òùm‰\ÛÆpp0A.ü#ö–š|÷n!û]åò VágR£$à?^s·§<uüM¥Ä‘4²\Æw¶û9”™#| ¯î—*ØgÚRs€MV¾ñ†›mc¨Í,¶qÜ0Y ’(æxC$eÚÍò7Ý$áXà€j®£àöծ㼿“K¸ºhÞy%ÓQYÙL!ݼ¶Ãœ–Þ vðAšïÂ1_ii§ÏvâµÞ\;"Ånu*2Nõç;zsÁ )¯Ø<–ñ¨¼2ϱýŠmè EÙ˜Ôp_h8$p ]µ»‚ö–Ý÷¢É$Dà™£}Hü+oÞÞjV7·W¶k<|Ùìí¥ å„{üÓû£Àd`Àòx$ÚµŠx¡e¸¸óÜÉ#Ø \•\î© žøÏzšŠ( aEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP^7ñþFéë’*öJñ¿ˆßò7Kÿ\“ùSŽâgµ\ÿ­_úæŸúªw“5½”ó £œÓ f®\ÿ­_úæŸú¬ýOþAWŸõÁÿôH Úu¯‹µ-2ÒþtEŠæ™Ï(`¬Âuæ¬ÿdxÏþyè?ø7ÿ\æ¤5 _Fðþ—¦éwóéº:Œ ¢Á|ÊÒS¾E,Å>W~a•n×5]xø§B×–=R{y/4©•¢m„I}¶"@û ´ŽÛÞEýÛmÌXÁ!³vB¹¯ý‘ã?ùç ÿàDßüEÙ3ÿžzþMÿÄUEÖ¤´Ô®õ;-j=[M°²³¹»» 5Ź–ñ%&H#8U>IP2ìM=g_ñu…Õ¬3_Øé÷ h·qÃw:'<’Ê~Êa‘®|¥&"(í¸æEÚYÍìÿÏ=ÿ&ÿâ(þÈñŸüóÐð"oþ"—Nûü%cÏþÉþкþÍÎ6ÿhbo´ÿ··~ÝÜnó³Ç‘F§ÿßöö¥ÿ ¿öVß5?²ÿµü¿/ìþRnò·ü»¼ß7v>|lÝòùtYÄþÈñŸüóÐð"oþ"ìÿÏ=ÿ&ÿâ+#\ñf­gkªÏk¬ÄÎ/í—KÙû Å;Aq³o˜7à;œ”o;ó&$×ä¼´ñŽŸ}â;¸ìì.-ïŸWmÑí„°_DC7–"Z8ÔLæB3’¸,‚æŸöGŒÿ瞃ÿñÓüZ×n§Ã¦tEwŒ]K¹U‰ HÙ V÷Ú})‡YÕ“Lûeþ½öK+nîÎK± Q‹ x¤¹ÅÝYw3Çeœc  ä»XðeõÆ£âMRâæO9ŽŸl‘Ï´>%º¾X¥ãïEGÊ€§vT@¢È.'öGŒÿ瞃ÿñdxÏþyè?ø7ÿYŸa¶ðÌ>2¿ðö•¦ÙÞC©ÛÛ$éD-àxl̇xB3ÈIVPAb¬¼ž)Ö!Ñ­¤¸ñ¤Ð›‰•$Òî –öôjÀe!¸!ÝÃÑO ³«+Asoû#ÆóÏAÿÀ‰¿øŠ?²ë×pB𽤒ÇpÖ)©Y4LRK01Y|•B@¸‘p#Qò®CÜK ¹ÕÿdxÏþyè?ø7ÿGöGŒÿ瞃ÿñ‘¬ø‹^°¾›JÜö¶—rÂú­ýÄ6ŒäCm*FÒ$‹qóåˆԕˆü­»¤ð…öµª^jsê·±”·xa[HmŒJ®Ö¶ò¹ùÀ“¶«FæÝŸ”!d)dxÏþyè?ø7ÿGöGŒÿ瞃ÿñÜÑE\á¿²ÞØÁžî2òd(wœ2qœs×ò«•‡âõgý„í¿ô1Br¼oâ7üÒÿ×$þUì•ã¿än—þ¹'ò§ÁžÕsþµëšè"³õ?ù^×ÿÐMh\ÿ­_úæŸú¬ýOþAWŸõÁÿôK¨è^"’×FÑô»MRÔg‹G³¸•­ZTY•AóeBNb~€ö®’MwG‹™ªØ§—»~ë„vù›³Ïòeϧ–ÿÝ8áô¿ÞMý‰®A¡èz¦4K }Bs–ÒGæ9d"1Ÿ1y¯Ò¶-üåÿfù°Ø·‘â ½^ãåÏ™æ}£Êo»Ì‹æCÉ鳃òŠÐ“ }wGŽòêÎMVÅ.­"3ÜÂ×À»®r«‚OŠ/u›;;¼ßçÂ×qÙæ<Ë?Âí†î0xÈÅqúÇ‚õKI»Ñã{µYu «k–™÷É%Ôw ãÙ„U7Gæ Äùcå¾^“_Ñæ¹ðìV<‘½µÅ¤°@ìbˆ,Ç&̪¶Ñ¶< )ÇP…æ­¦é÷¶÷º…¥´÷o²Ú9¦Ti› a9c–ÔzÕ{¿h¶Oú¥ ŸO·k«¸PòèbíËcǨ®VÐ5íY5"Ðé°¾µ¦ 6ð ·ahªÓbHÏ”<âVrvŸ/1¸ç";¯ëQ6äv°Ýß^ÛjÊæq%ÊÜ<½ªa¹$0“åŽwʰþ)A¦=ÏØgŠâBÚÂâÒvPð¼ÒD£% )ù&GùIÎpH9Ƨö¶›²åÿ´-6Z£=ÃyˈUYÔ—çå£{£Ƹ;ŸêwËM+M´Ÿa³»˜-´bâ)¥’k?’ƒË 2ïœ5KÂ~ v¯c`ºTñßéK¤FòÊÖÞTH%Øû&Rß¿*Uv¯îÁ±; ]wG¾ÔgÓ¬õ[‹è7yÖÐÜ#ÉÓµ·(9$ž†´+‡Ð4bâêÙ¯-`´±Óõ½Fö2¹š}òÜ¢ƒ@H˜°`í«ÇÍ‘ÜPEPEPEPEPEPEPEPEPEPEPEPEP\æ£þ¼Àÿô6®Ž¹ÍGýxÿÿèmS!£>çR²Òì§žúæ;xŠ„ #c-¸S€OàkþÐV×ü+y#y[lhÎzáFjO²\ÿϼ¿÷Á©ÎÿÂcáïú Áúÿ…ð˜ø{þ‚°~¿á]Ù.çÞ_ûàÑöKŸù÷—þø4À[^èVïgÿ„òCfÊÐÂÐZ„P\ °£i+òpHU¨¯| ¬ö±E£Çoq·Î‰-T$›NWpÛƒƒÈÏJí~Ésÿ>òÿß²\ÿϼ¿÷Á¦/iâ_ XZ¥­å•µºgdP¦Ä\œœ09$þ57ü&>ÿ ¬¯øWEöKŸù÷—þø4}’çþ}åÿ¾ 9ßøL|=ÿAX?_ð¬ÝcÄN¦tË{+ø¦—ûFݶ)çÅvŸd¹ÿŸyïƒQÍÛÇæNn ¹ÆÑ’@'¹$îi€Úñ¿ˆßò7Kÿ\“ùW²WüFÿ‘º_úäŸÊˆî ö«Ÿõ«ÿ\ÓÿAŸ©ÿÈ*óþ¸?þ‚kBçýjÿ×4ÿÐEgêò ¼ÿ®ÿ š]@ÄÕ|b<=á_ [ìZXOŽº¤±ÊñŒ P•3`d,àqÔM%å×t¯±xŽïû.öÊká nñ8­Â…sbŒ%bNìò6‘F…s¢è~ÑõJòÒÁîtË;V¸º¸«„FdA¸ŸžCÇ'ŸN6,´½"ÊâÊÞÑ#Yô»!mbRÍ »•NH&ŸóÖ´$çßU¾½øM¦Ý½Ì‹¨j¶VVíwÈÑKuåÅç ¸åZ]øé€GQÍê~)ñTˆR Ì]yº…Ý•ï•ú5µ¬²£Ç°Œ> P®æäý« (ç Ñl<#u=…‡pÓ¶2ÁHÀ8ûÃcUðÿ…í’ãRÕ|»{pþc=Åëdz­E.)Kùˆ÷19ËØòt Ë… s>ªé«)ŽFeœÀ` (`qˆ8ÐüÔŸ¨xÊ]3Y±±¸°ŽD‘à‚îKWš_³O+[Éã/ùÝk• ^oÞàØêÇF¢Õ^1¦GòÊî¯Ë™–8Y£!¢ y8ȵl]øCÔu“4Þa¼‰áº’¯eY•³’D®Îb3)Ï–EÂ::Û½ºGv‘WRúuû9P@ò0ÿ¸Y—íNÞœP–7W"ðäs·h×d" ,e\‚Ufî¶Ó‚È V zsþÖõ“áï"Éý±«êúxÔ™¯åKhã@ïU1BŠeÚ ž e¸õšT60ivë¦Ú͓̊D“Ìù·ïÉ.X’ʼn%‰$’Nk4ß ßxL6·Q6ÕÖÊêËQxð¹XÄk4neEÛ¸îe\ä@ìüuý£:…¦ÿ†–ÒÞYeŸlë%ÊÂÑíˆ)VQöˆ·àŸànÔð\ó]xÃ×É4òé–Ï$’1fv1)$“É$óšŽ=ÃGXD`K«}§ìP\²F KÖku`…‘Z3)*<¬„ÆÅ…¾™§[XYÇåÚÚÄ›‰ÚŠQ“ÉÀ­X¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(®sQÿ^?àúWG\æ£þ¼Àÿô6©Ñ ?ê®?ë˜ÿЖ¡©¡ÿUqÿ\Çþ„µ H±dñ$0ßÞA%âÚÙH±\ß/Ɉ”WÉù÷í×-·’H‘µ\.«$ñê> Ò¦·›û?Tn`³ºšDF·Ž6U BÄ!Á߀[$¥H€èõ_XiÖš¡ŽâÚâ÷O´’êK%D›Uwr9*G8î*Kÿé–êîá–âÂÙîgµŠEi•w³9Œàr=k”ŸÁ×7ö—ËO.åo'¶šâîä÷ .¶8Hˆóˆ-óò‚ß,óø"{§¾¶‘Ñ`¯$Žé¯'«\ GÙ¡_8Ù9 xò¦€tã^ÑÙ-uk·ŒRÙ…Êbvi ÏÌr@ã½hW«xkPÖnÞêæ `×v‹iq jw J­!݈Âyà‰9FÙ¤ó;+Äÿê4Ïû Ûèb·+Äÿê4Ïû Ûèb„åxßÄoù¥ÿ®Iü«Ù+Æþ#ÈÝ/ýrOåN;ƒ=ªçýjÿ×4ÿÐEgêò ¼ÿ®ÿ šÐ¹ÿZ¿õÍ?ôYúŸü‚¯?ëƒÿè&—P¡Jt‹}V½·»žÎ] ÎÚÝ­m¤¹h$š@R5fQ 1|À`ù 1&cðÊÏáïO¡e}ÞZ@–‹ œ³G›«ÇHYãVHü¸å‰Hݵ@à•Ôš‰¦Ó4o ivðé¢yôËSjz´YÙ”(Hq™ó o®î7ƺ l2ÝOvžx’ilæHØÃ»ÍTrdeØçjpŒ@ Г‹Ñ¯.l>˦‹ï.¬tx­-â¼ÓžÕm®YãŠ_%|ÙAgb1»8 k¨·’ êÚŸÚlnþÏtñ}…ì,%¸XàŽA"F1…q# /ïr¤’àXñ?ˆ¬tÔ6²Åi<ñ¼¸¾“ɶ· ÎÑË,¥X Ý ¿`ãp5qüIg†nµÉ##´´7W6¬ O"˜Ý3òÉ´”žã·4ÍÞÛ\Zðñ³»}kP¸¹šÖímÝ¢ÜîÍÍ8P¢1óëä¿w»Rðmå×…|E*Ã8ŽãûZy,œÜÜ ®>Ìâ=¿>å“vz“±^½3VÔ¡Ñ´kíRádh,­ä¸‘c±TRÄ 3ê*åsúà{MsKÕæ‚{>Ò)ÒHà…¦xå,G(Ac…YS* 7¦Òäq÷6zÆÌBùfÿ–'-†óEw‘Á /3Åhó>ùYTí´.[ÔíU=€ªJàô="X~Üè°Ø]Ϩ&˜Ö“YßÉ0W¸hÕ‡î‹p l®Ò:Ö|vz–¢ú•¥“êRCv=¾¡¨iín_QE‰¡i”¢•}eŒDá¶¶]yé”P—ß[xÛG}b·ÖÓj‘\Þ^b)35Íš¢¼hT‰’ÍY6¡”}„±Üd³°ñ,–öéjRZ^=ňšHn-žä¹” ]åV+ ’Jr$‘Y½2Šò»øüYrãR»»³µžâc:Ú[^Ͳhã‚–ò$ËÔ4«Ï°ÜµÌR}žy4èËYK"mcq…ˆ"YV0»È 1âId,VÆ5ñÜ80-¼2—6ghÅØXˆ3Ä6™™ˆ!‚á¾\ý3ÅÚÔÚF³â9`¹¸±ŽÓNe2<2ÜÁg®dU( ÄìÂn9;×'&±à ê~»Ò`Ñt«O6)– RÂ3öy$@¦E 7 r'hç[šn“¦èÖío¥éö–03—híaX”¶É Îöͦ¿«ÂâÍQ³¯ôا̰Ǻí„H¯ä‰dUa¸aC»œÀÇ:î© ­Þ‡+ù7+åÝ4{ö£chòÁH²J7Ê 5Ì…äFcÃ)M…€="Šóø®b°ñŽ›¤ZÇ®ZȺ‚™þߨ½Ê\BÖ×» nšL)hIÁ xRF@ÁpÓÜøÖ4’öøG‰|…Ž;ÉcCöZͰª°|Ä ‚å»3dÐ(¯?ð›Oe¥ø2xoo®®5›D}B;»Énr¿f2€v&Y>f#18ØG¤é°ÙMeŸh–“&É`XT#®Áq‚6*®`A\>‹áyõ‹{Yn.îàÒn¼9§ÚK&-·` ¼Èßr—Q¶EB‡ç89IsáíûïhÉy³Lƒí>Wî³ä^]Ãó÷ Ûi$äíoµíò†4$¹-ï‚çÒ`Ó†…ΗÄ"ŽŽÂÓt³,Jñ³ ‰i³”'*XŒ×Iý…£ÿÐ*Çþ=>Ãÿéÿÿóǧú¿öz{W?­¦¥âM+û&ïÃ3Æ¿k´’vškym¥Dº‰¤ óîeØȹ \þ³à›¹/¦Š=6vÐ!»”ÚéÖÙ²¨xm¶ºÅr J¡Òç8÷HHv4Þ\¾›á? ]\Ae¾Ÿ§[Ëpmí"TT`ª02y=¹5%Ž…£é‘G†•cir™Ñ ·HÂÈT¡pኒ¹ëƒŽ•ÁßxSP:V³gs¡Éªj—:cÁcªÉ<35¿úÄb2ÈRL´«!Ê Sçn8ÜÀ÷„u›ˆ ¸²»Ôl¡y¥–[e³–KÙd)²Y#º0ñ¬n„€0{P´q€vøOÃvöw6pøJŽÖëoÚ!K(ÂK´åw(lFzT‹á­RÉDÓBX9{5©‹v,˜øù `F9¬xnm"óS¼Ô#‘ï$xcŽâk“pÍÚÛ£ÄZHÛsmRû‘€¸ë(?Lд}ÍþÉÒ¬l<ìyŸd·H·ã8ÎÐ3Œž¾¦´(¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ ç5õãþÿ¡µtuÎj?ëÇüÿCj™ è©aDa#H„]ØSŒò¡õ¥Ýmÿ<¥ÿ¿£ÿ‰©(†Š›u·üò—þþþ&ÖßóÊ_ûú?øš†Š›u·üò—þþþ&ÖßóÊ_ûú?øš†Š›u·üò—þþþ&ÖßóÊ_ûú?øš†Š›u·üò—þþþ&³uI4û{c ^{¸`ËÉ¡ÜpÉÆqÏ_Ê+Æþ#ÈÝ/ýrOå^É^7ñþFéë’*qÜíW?ëWþ¹§þ‚+?SÿUçýpýÖ…ÏúÕÿ®iÿ ŠÏÔÿäyÿ\ÿA4º‘‹ï4m;M²‚÷Jìþ²»‚Ââ2nuH 0‘ Ã)TaåÇ€zM{ưéÚ£qi¨[¥è[yP[Æï¾U ‘b2q<]7бàí6´m3TV“ϸÑì­ÝIBÆ®ÊGÎelóØtï!ðŽ槮ÜjPA$:ŒBÑR<©0ÔHXðDŽ~V*yH¡î•¡&\ž0¼±×¯ÚÿHÔ¢ÓmôË{¹Ôýœ›d¹I&Ù `V58Mç ЃrûÇV|Ww3Ù_}†´ª]ªÆRy`YXoÞeå•Tì8nW2]xjËìšjšµÜÇT²M.{›†Š6*^P›v¢¨rn Ž9ÂðNs÷l5®í§½¾û ÿid´VŒ$β,²¡Ù¼±KÃ3(Þp¼.$“ÄwV÷qC z-å¢,÷'WØë»ĸŠB¬ ×E+‚Ç€gê!ñ —‡áÕä‚ÒDbñIi1k’ í',Ñ‘·Ê\Gæañ³çÐ×ü5eyq6¯>­w¦˜Ò–hÚ/-VÜÌêXJŒ¸fl°à¢0Á\Ô—ž:…˜µ¼×uY¡’&‚ñY¡ò"NUÀŒá™wDˆ#$•R: (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ ç5õãþÿ¡µtuÎj?ëÇüÿCj™ Ãþªãþ¹ý jŽçR²Òì§žúæ;xŠ„ #c-¸S€OàkþÐV×ü*FWñr_Ëý‹vö÷2_’„HÈ’2[Í"¤›y1–EÜ;Œ÷¬[-OXOL¾kÅ>°¶Ï 7jï’•»`<­ÊCíÐ8 >rÇ$+}üWá™^'“Qµv‰·ÆÌ¤”lÈテ#èO­Au¯ø>ù%K»>áfUIVXƒ‡U%”6G HÏBM0 &Ôü‚¿e…î'óm,Ù#buï ÈB6É´Ác“´ý;Ä:½æ¼#’ÁK’îâÒ9ƧtFA¸7šYÉ1“Ê\NH\µ„ñ/…#ŽÞ4¼²T¶Ç¡0"•F>_”‘ÇbEFšÿƒâÔ%Ô#¸ÓÒöUÙ%ÊÄ޼p[#åô 5+˨ô?H—3+Ûy¾C Å‹(˜m?ÃóxîI©¬5½NKëgºk7´¼Ôn¬"Š($‹Ê3aÙËÙ`€«Ëg<`åj’ø_UÕ×S“ÄB;ˆöù$ZÛ9‡o#kI8ç-÷¸$ãgF½ðnˆ^h/íe½•¤i¯¤‰ò—rí¹•FOLcéE€ìëÄÿê4Ïû ÛèbøL|=ÿAX?_ð¬ÝcÄN¦tË{+ø¦—ûFݶ)çÅ ×WüFÿ‘º_úäŸÊ½’¼oâ7üÒÿ×$þTGpgµ\ÿ­_úæŸú¬ýOþAWŸõÁÿôZ?ëWþ¹§þ‚+?SÿUçýpýÒê9k Í¯\[Áo§é²Oÿ¾˜‘ê7.Dú{1¹X‰pF<¢üÝÇI¨ßxªIõ]M“ý>Î+›¸®6Åûä‘ZGµ¸_Þ]Äÿ˦XbQ^W£x³Ç2iVqXøžÎÙvÓì,å¶S$ÏÇ„R!*?Ö Øry=MPÑ|iñã\{K=EáºÔ®!–w’Î= È"Š9÷gj•ò†@ÁÈ<“ÏrÂM«Ý_#Uv=?VÁ³ižW‡fÓ`ÖöÁf–¿@om÷4»Á“xm¥¼ÐNï¼ ¨õŸkÖÓiC[‚ÞÖÒîX_U¿¸†Ñœˆm¥HÚC‘n>|¸Q’±Ÿ•·yÅĈúœlluI®e¬Bt䑨²»q¶"8±Á9¤¢¾[ÿ…½ã¯úä¤üEð·¼uÿAÏü”ƒÿˆ£ê;¯ëäÞ'Ô”WËð·¼uÿAÏü”ƒÿˆ£þ÷Ž¿è9ÿ’ñ}B§uý|ƒÛÄú’Šùoþ÷Ž¿è9ÿ’ñÂÞñ×ý?òRþ"¨T{xŸRQ_-ÿÂÞñ×ý?òRþ"ø[Þ:ÿ çþJAÿÄQõ ×õòoêJ+å¿ø[Þ:ÿ çþJAÿÄQÿ {Ç_ôÿÉH?øŠ>¡Sºþ¾Aíâ}IE|·ÿ {Ç_ôÿÉH?øŠ?áoxëþƒŸù)ÿGÔ*w_×È=¼O©(¯–ÿáoxëþƒŸù)ÿGü-ïÐsÿ% ÿâ(ú…Nëúù·‰õ%òßü-ïÐsÿ% ÿâ(ÿ…½ã¯úä¤üEP©Ý_ öñ>¤¢¾[ÿ…½ã¯úä¤üEð·¼uÿAÏü”ƒÿˆ£ê;¯ëäÞ'Ô”WËð·¼uÿAÏü”ƒÿˆ£þ÷Ž¿è9ÿ’ñ}B§uý|ƒÛÄú’Šùoþ÷Ž¿è9ÿ’ñÂÞñ×ý?òRþ"¨T{xŸRQ_-ÿÂÞñ×ý?òRþ"ø[Þ:ÿ çþJAÿÄQõ ×õòoêJç5õãþÿ¡µ|ýÿ {Ç_ôÿÉH?øŠöÍ*ò}CÃz5íÔžeÅÅŒrÊøs¶I8IéXWÃÊ’NEÓ¨¦ô-¤o+mÏ\(ÍIöKŸù÷—þø4Cþªãþ¹ý jÍÀ¶€Êc’NUBF¹f$€ù5Êj\û%ÏüûËÿ|>Ésÿ>òÿߨ‹ÈšæHT‚#ˆÌÒ†0¹ïgý¥?B IðÊÇ*8`J•`rÁÅZû%ÏüûËÿ|>Ésÿ>òÿߪ ˜ ‰ž2ò.äPã,=@î)vÈ‹’Ñ^GR¸Pwc‚A'å<M\û%ÏüûËÿ|>Ésÿ>òÿߪ ˜ ‰ž2ò.äPã,=@î)Dð•!H;‡!Žóíë@¾Ésÿ>òÿߣš7·Ì$Üs£$€OrHÜÔÜÁq»Èž9võØá±ùVG‰ÿÔiŸö¶ÿÐÅnWüFÿ‘º_úäŸÊ½’¼oâ7üÒÿ×$þTã¸3Ú®Ö¯ýsOýV~§ÿ «Ïúàÿú ­ Ÿõ«ÿ\ÓÿAZh’xd†MÛ$R­´ààŒRÄ-`ñU¿†í­´¿jEÍÜ÷Kt4¯7 "D¢¡do‘Žä#øHÇ[Üð7G¿ÑluK]ÅKt¤«Ë£´EXÛ]C‚·ž3œôÝÇ0I¥kW^ƒE›Ã>!‰¡Jšc¸iR[¦UÁÆ‹‘–ê Ÿ”ç5ï¿ÚÒzËÿ}/ÿGö´ž²ÿßKÿÄÓúï[ ØyŸ.ÂâŸúµü—ÿ‰£þÏÿе¬à ¿üM}Gý­'¬¿÷Òÿñ4kIë/ýô¿üM_ö‹ìOÕ×såÏøC®»Ÿ.ÂâŸúµü—ÿ‰£þÏÿе¬à ¿üM}Gý­'¬¿÷Òÿñ4kIë/ýô¿üMÚ/°}]w>\ÿ„3Å?ô-kø/ÿGü!ž)ÿ¡kXÿÀøšúûZOYï¥ÿâhþÖ“Ö_ûéøš?´_`úºî|¹ÿgŠèZÖ?ð_þ&øC®»Ÿ.ÂâŸúµü—ÿ‰£þÏÿе¬à ¿üM}Gý­'¬¿÷Òÿñ4kIë/ýô¿üMÚ/°}]w>\ÿ„3Å?ô-kø/ÿGü!ž)ÿ¡kXÿÀøšúûZOYï¥ÿâhþÖ“Ö_ûéøš?´_`úºî|¹ÿgŠèZÖ?ð_þ&øC$’7R¬Œ ô ö­ïíi=eÿ¾—ÿ‰ªw‰ÝX)©É$’}­sâ1N²I£Jt¹Cþªãþ¹ý j»&ù ä“Å!'Ñ]Xþ‚¢¼[Ù-^+¨í¥|$ù˜\ç¸s9ç¿ÆWöwˆè`ƒÿãÿ‹®SST[*ü°»bRÛýöóbp½8]±…öph’ÑåžáVâi‹I,lÇj2¢¸€Nîcp^¸¬¯ìïÿÐÁþ ÇÿGöwˆè`ƒÿãÿ‹§p5ÒÙ>Ù#ˆâXXäÚÒË…T Dk…ll±G§ ŽãÏœÄÖ견ct¬ÙR¥ùÀSŸ¿ê:VGöwˆè`ƒÿãÿ‹£û;Ä?ô0Aÿ‚ñÿÅÑp5â·òöÛ£ ´Ya‘‹“½Äk ´ õ}ÈÆãéÍ{hv}ÌWÌ”¾-fÁHñåòã?»^z~ññT?³¼CÿCø/ü]ÙÞ!ÿ¡‚üþ.‹…¨áx¾Ì’¸?f²m9áÿuœdq÷±|Oþ£Lÿ°·þ†(þÎñý à¼ñuº­w-·Ûu¨¦Š ˆçض[ (Àã;øéŠè+Æþ#ÈÝ/ýrOå^É^7ñþFéë’*#¸3Ú®Ö¯ýsOýT55ÏúÕÿ®iÿ Š†SÑ4ï‘ Èªía¹T’#°%[Cé@ÇÑEQEQEQEQEQEQYÂMgÆ1i§R¾³€iï9û,Ia"¨ÎAöô«º‡}¨Ï§YøãP¸¾ƒwm¡ÉÓµ·(LŒÏCO”W/ÑL“ÁV°¼)/Š5´yŸdJ×1í´¶÷|ªÇ°'µø*Ög™"ñF¶ï ì•Væ"Q¶†Ã~”àö ÷£”.>Šd~ µ™æH¼Q­»Âû%U¹ˆ”m¡°ß»àíe8=ˆ=êOø@£ÿ¡^ÿ¿ñÿñº9BâQKÿô1ëß÷þ?þ7Gü QÿÐǯßøÿøÝ¡q(¥ÿ„ ?úõïûÿÿ£þ(ÿèc׿ïüünŽP¸”RÿÂý z÷ýÿÿÑÿô1ëß÷þ?þ7G(\J)áþ†={þÿÇÿÆèÿ„ ?úõïûÿÿ£”.%¿ðGÿC½ÿãÿãtÂý z÷ýÿÿÑÊŠ_ø@£ÿ¡^ÿ¿ñÿñº?áþ†={þÿÇÿÆèå ‰E/ü QÿÐǯßøÿøÝðGÿC½ÿãÿãtr…Ä¢—þ(ÿèc׿ïüünø@£ÿ¡^ÿ¿ñÿñº9BâQKÿô1ëß÷þ?þ7Gü QÿÐǯßøÿøÝ¡q(¥ÿ„ ?úõïûÿÿ£þ(ÿèc׿ïüünŽP¸”RÿÂý z÷ýÿÿÑÿô1ëß÷þ?þ7G(\J)áþ†={þÿÇÿÆèÿ„ ?úõïûÿÿ£”.%¿ðGÿC½ÿãÿãu$~EYœj:…é’>>×"°L2ýЪ:羞NP¹xßÄoù¥ÿ®Iü«Ù+Æþ#ÈÝ/ýrOåDw{UÏúÕÿ®iÿ Š­41\A$Æ’Ã"”xÝC+) ƒÔVnÖ¯ýsOýUi¢Yà’.E*J9FŒpÀ‚¸9€óý2Þ×ÁóC¥é–É=åþ«nV Uß Xï„j03‘€£ã pH6¯õ[‹]JY´½j¨f¶³Ž]ViâDDßzw6~uXòPƒœ}âíì4k]:vš oŠí"âþy×îÈäÇ\gó­ .?¡_Ý\®˜/5dš[k†òጲ\*ÈŠ²‰ ®p¤r+ù›”mº ( aEPEPEPEPEP]#þJ:Ø"_ý3J𾥩ÚÌš…ü–v‘jzœÖ‰mnÐÝFÒËs“Í.A&g\"òPä€wZ°µû?‰?µÚx­›Zˆ›vN][v@?ÝñíŽzíhýbÿ¾›ÿ‰«MÑÄ¥î§s&ƒâmM'š¨*ôØ&¸‰cKK˜Ìé†b²M#mqÑ ÁÍX†Êû^ñµÇÚß\‹F>h6Osf¼Áa°¥äÜ|§ø¼Î2 uP_ÚÚÛÅoo´0D#Ž=ʨ ``8ÅIý­¬_÷Óñ4]ŽWÀ0^­åÕî·¥±¨[Û\¿˜²¤ >ËlŽJÝ,¾j8Ú@Ón+¼¬ßíhýbÿ¾›ÿ‰£ûZ?X¿ï¦ÿâhº TVoö´~±ßMÿÄÑý­¬_÷Óñ4]*+7ûZ?X¿ï¦ÿâhþÖÖ/ûé¿øš.‚Æ•›ý­¬_÷Óñ4kGëýôßüMAcJŠÍþÖÖ/ûé¿øš?µ£õ‹þúoþ&‹ ±¥EfÿkGëýôßüMÚÑúÅÿ}7ÿEÐXÒ¢³µ£õ‹þúoþ&íhýbÿ¾›ÿ‰¢è,iQY¿ÚÑúÅÿ}7ÿGö´~±ßMÿÄÑt4¨¬ßíhýbÿ¾›ÿ‰£ûZ?X¿ï¦ÿâhº TVoö´~±ßMÿÄÑý­¬_÷Óñ4]*+7ûZ?X¿ï¦ÿâhþÖÖ/ûé¿øš.‚Æ•›ý­¬_÷Óñ4kGëýôßüMAcJŠÍþÖÖ/ûé¿øš?µ£õ‹þúoþ&‹ ±¥Yº·ú£ÿ\Ïþ„”kGëýôßüMV½½Žâ&ù“;v€¥ŽrÊ{¨ô¤Ú°X˯øÿ#t¿õÉ?•{%xßÄoù¥ÿ®Iü©Gq³Ú®Ö¯ýsOýT55ÏúÕÿ®iÿ ŠÏÔ¯âÒô»½Buv†ÖÕ,UT±ÆqÎ -QX­w©é°É{«Og$jGkinÂA+ºª ‘Ÿ ’ÁrU$´fªÍã+Kg1ϧßG$K,—hDdÚ$b6f|>mš6Âo88ÆAÒQ\ÜÞ2´¶sú}ôrD²Év„FM¢F#fgÃá†Ù£l&óƒŒdR]øºÒÇM{»›i¡x®E´ÖóOoÄå7€Yär¥OÊÄüÞÇÏÛx¾ÊîmÐZ^=™ _oÚ‚-Ó$mÚ[ÌçÍŒ}Î s€ SÅ3\jM…ñÓ[K¹½Œšð+BQ£PŲU΂“¼ddpÕQE (¢Š(¢Š(¢ŠÌºÔoWWM7OÒ¤¾ 7$É0S÷ˆHïÞŸ»Äßô)ÏÿÐñU6‘ÿ%?ì/þŽŽ¶mõÍRú JîÇH‚k[´Åj¦ód×ÂíB¥6¢³£ÛÏI$ IÙ»Äßô)ÏÿÐñTnñ7ý sÿàtüU?Ä:†¥aw­ZZO$³›Ý"òß|íªÍp2Bm݉çÎa´à,Ö.5¢Ûh¶-©Åçý©eÔ]!O-mÜlq gÊÝGÕ0ç‚]\¡»Äßô)ÏÿÐñTnñ7ý sÿàtüUV¼ñMÃiš•í•åô0ßdj6ò¬BY­ º‘ h’"'nËJp mKͤBdÖÚìé,÷ÛR½€Ã;¬p¬¤I Ƥ–ëbü°/º–,‚åMÞ&ÿ¡NüƒÿŠ£w‰¿èSŸÿ ÿ⪵޿⛋=UžÒ fƒUÓ"Ž#|Uâ’CdÏnÅ# ÆL²&I;ˆÚF+r?êWí£Ûé6‡Z‰åÅ%ó-ºª$JÊ",Ç0ðc^wóò‚Å\ÌÝâoúçÿÀè?øª7x›þ…9ÿð:þ*­éþ;›Rþ*5ÑMÅ¿ž÷D\n¹ŽŒùA6à”÷œlX.¹w{y ¾½%ŸC÷kHn¨dµP9 ¾h&C VòÆ\¬«E\ÌÝâoúçÿÀè?øª7x›þ…9ÿð:þ*Ÿ¤jº˜×tå¾¹»“·SÛ]yk2—¶K¥y¼¯Ý3¯”Ávq²eÉ ß]ÕtY˜k’êRjs"¤rý™læ•æŠмjeX–I£½ùö>v»‚È.3w‰¿èSŸÿ ÿâ¨ÝâoúçÿÀè?øª·«ø¯W±·Ö-æÒcŠ}?GmF{‹[àëDáU Å–raR2›ylýÐ$§®xßT¶ðö«x¶ZF´ml.b¹ódÛ$ä3ÆÑ…U?gs÷›£Adw‰¿èSŸÿ ÿâ¨ÝâoúçÿÀè?øª×ŸÄ÷öZ¶¦ßiö6³\lófšöE€—ªÇ†K6w–vF7 •ÏÒ5ýb;G³´ƒQ¾X¯!šæúùáó>Ç2[´„ˆä%¤,§#'­Ar Þ&ÿ¡NüƒÿŠ£w‰¿èSŸÿ ÿâ«NËÇêÕ`±O|öog’ÒÛÏ™æ’U*±Üü™Éò8?:çŸðw‹µ«Í?KÓ-m#ÔoÊ9d›P¿1 %¥“±av%šë?6NCØ!Ad.îñ7ý sÿàtüU¼MÿBœÿøÿZ~ñ÷ˆï5;¥Š?ìrð½£É&ÙãZÛÊ#1…Æ?xÇvòrqŒj¼:ö¥§ø‹^3ÛÇ>’ºÅµ ”Ý·› Kª*¤E6ìß bw¼çðÅ\©»Äßô)ÏÿÐñTnñ7ý sÿàtüUE©xþöY$³Ó­#YÞâݬ.A—Ⱥ„ÞAeä€.f\4^hà [Ð 35¼MqqÎP7.ªØä 3ß>‚‹ ¹Ânñ7ý sÿàtüU¼MÿBœÿøÿ]ýYÎw‰¿èSŸÿ ÿâ¨ÝâoúçÿÀè?øªïè¢È.p¼MÿBœÿøÿSZ~[¸cºðô–;…yÞî' ë…$ŸóÓ­w5 Ïú¥ÿ®‰ÿ¡ ,‚ç7hÑ<’;(Rå\ç9÷”»m¿ç¬¿÷èñT/üyËÿ]ù5CP2m¶ßóÖ_ûô?øª¡}¥öŸh‚IòG@YB„ ŒÄõ9è=ý¹³Xz¿üŒ¾ÿ®³ÿè–  Êñ¿ˆßò7Kÿ\“ùW²WüFÿ‘º_úäŸÊœw{UÏúÕÿ®iÿ Š§yŸcq‘ ÆøÙ|™Î#“#[ƒòž‡ƒÇcW.Ö¯ýsOýT4€ä­´]zy ¶§6tó‚€j"g·d`ñºæÙYÙYWýc¶yÝ»½Ù)nL"{Y÷3.íÐ,*ºgêqŽ0È|' ,z¦¢±Ge-ª+Æ¿e‰ö«`·-0X±ã¹æº (¢Š(QEQEQEWJù> ¬ÏòĺS¡s†2¡>§ò5·&… Ký ®ÍäêI ͸¾BË'ß" û˜ä–P–cœ“šI<±.Øåtp¬E;íw?óñ/ýöi© Äú¾‡¥ëZ”wWj û9Šh¡™¢iYeŽX_ÌF lŽWÓÌl“›F‡¦ÜGslWí¤‰çËtòÈÂCmîìKŸÝFbHÀªk¹ÿŸ‰ï³GÚîçâ_ûìÓæ‡Ÿ è«u¦ùSE¢[-ªÈ~*X¤·f}Ù>Q°Ö7©Î†«omª}Š7¾‰m໎æX²åå‘sWß#®Í§†5™ö»Ÿùø—þû4}®çþ~%ÿ¾ÍÁbýÆ‘¡Ý^½Ü¥|É)VéÕãttv@ÁKƒ Äg ;x¨îô-òy®š+‰¥óž{ké ±DB7Æá‚•Š<¨;IE$dfª}®çþ~%ÿ¾Ík¹ÿŸ‰ï³G0X¾š?‡â·’Þ(m¢‚Kˆ.LqɵDˆÄDp¡D1 £åéÉÍ;? xrÆÌÙÃ-ɵò–†]VâT‰T‚¦5iFRªU— ¸"™ö»Ÿùø—þû4}®çþ~%ÿ¾ÍÁbyt=-l ¶²»[y"½†óí2LÓLÌŽ»³#±rZ0bÉc„m¼¨ÛD~ðò$Êï-Á‘6y—zŒ×Ü÷o#–ŒîTl¡(‡ª©}®çþ~%ÿ¾Ík¹ÿŸ‰ï³G0X¶º€,ï-]šhïm>Åpg¾’W’Èv—g-ÿ-¤ç9çÀ§¦øWC³7/w:ß¼÷S¹¸wDòHÄ,,æ5;d(X($þñ¿k¹ÿŸ‰ï³GÚîçâ_ûìÑÌ-¦‡¢,¶²=ÍÌÿeÁ.u9æBC Èòv r# ‚6®2åðŽŸqâÔfÕåK}÷µ¥Ô–¾Y˜[îÃÅ"œÜŽŒÓy6~×sÿ?ÿßfµÜÿÏÄ¿÷Ù£˜,_ƒO°·Öb½ŽâÙ ¶²vvÑ…E·RÙ“8!‚B1—ÊãïKÐ|;¢ÏÚ|qC$Qy(~Ð̈́٠xåðÛÂ?à¤æ§Úîçâ_ûìÑö»Ÿùø—þû4s‰ãð߆ᲚÊ$T´šËìÀ·’xvþeÝ‚ûWÌ?>°*FдÖ$Õ™®%•'‘ ô†‘U\ÿË,&Ü‚ªz€j§Úîçâ_ûìÑö»Ÿùø—þû4s‡§…|0’´Xæ# h×ò²@…‘ñ Û8Êùavì]¸À­È%´¶·Š¹R‘ E2N]ˆ³Xû’IïXk¹ÿŸ‰ï³GÚîçâ_ûìÑÌ:?µÛÏÄ_÷Ø£ívßóñýö+œû]ÏüüKÿ}š>×sÿ?ÿßfŽ`±Ñý®Ûþ~"ÿ¾Åk¶ÿŸˆ¿ï±\çÚîçâ_ûìÑö»Ÿùø—þû4sŽívßóñýö*9î tUI£f2&`OÞö»Ÿùø—þû4}®çþ~%ÿ¾ÍÁb7ž{ iR52 Øœ7­`]ºË­Ú_ÛêÚ\i m,±—«2— ÂUQ‰Œ©Áø­K½:ÊÿgÛ,íîvgo¾ÜõÆGVÿ„{Dÿ >Ÿÿ€Éþ#"µB³ûÙç¶O±[[ôŒìˆìÊòyÿVœœž=ÍUÔn`¸ñ.äO»e›;6?rÞ•þíþ€úþ'øT¶ú6—i:Ïm¦ÙÃ*çl‘ÀªÃ#=(íxßÄoù¥ÿ®Iü«Ù+Æþ#ÈÝ/ýrOåN;ƒ=ªçýjÿ×4ÿÐECS\ÿ­_úæŸú¬ýJê[-.îî gºšD·Lî••I 0$Œt=i%µå­ç›ö[˜gòd0Ëå8mŽ:«c£ ò55yÄ:_‰4”Kn£²Þi“<„ÍÌbiŸt@o‘%$–Ý‘ݸ.êæ[H$²êé*j61X2Kpa6ÅàV2Ÿ-˜±˜0–9AZ,uEyÜ’ê÷vºig‚Ò5'Tž<Éö‹Es怢Xü»ŽpsO¸‡ÄÛ:Ùɨ©—íI3ËæË¶(¯"HÊÛƒ}œÈFÂO½’øj, Óh¥yR9Ú&Ù"«Q°Ðáúë\F“¦_^ßYÁ{y«Ë§ˆî«>snÊe<™±æ6~öЦªéÐjLÔn¯æÕ,µ{è-gyRÖâT(a·I?ud.²)Û¶E#E€ôJ+ŸÐŒÅtÃ=®£jæÚàùOs$ñæ& ¼Œ P\1Šè(QEQEQEŽ4‹-oÇQZjÉ$ ¦<¡gæ *AèÇó©ÓDð ø¢o}ÝN(£—ÉmN@ϼ9Ú«æî,7Ž”÷©ôù(éÿ`‰ôtus¢j×Þ-ñv¤ÛÏgk}¥4r­ûÄaýó^ñ˜ËH7LûÆîŠÓ"QkbYp[|=[{yæµÔ¡ŽâÊ]F'f¼ekT™w)*Ý­´Ãz¡˜ é?á^xgþ|gÿÀéÿøºÇÖâ½ñ“&™§N¶·ÞÔ,šâwVÚyü°#•C— +€§k9Ãc?Yð}Æ¥uk-ž‡}§Z E†ÊÎÓìÿgÎ%”¼¥˜IäîÝo·Üÿ)$nUÄuð¯<3ÿ>3ÿàtÿü]cÙhž¿ÔZÆ {ï8K$¥{Øã’HËD‘ˆG`QøRN@HÏ»ð=é¶Ô%¶Ò [é¢ÖgITÆ®×osºÊ]ÙÿX¨Ï±ó”ÜFW8­‹-3V¹´m}*{HS[“P7ÒËFñ‹æ¹@Š®\³ ƒ ª,rJ…`ûž°ÐäÖ%Ó¯¾ÉBy3sp\fFpÃjåŠãw[×½Ñ<§x†ËC¼ýÅõäM,)&§"稫ƒ.w1c´ÎÇô¨ü¤7‚ü={ªëV-äVö±F‰"ÈîÎÚ3Jn÷š2˜.U:€•—¥èš·‡üiá>ÊÞxç‹Jòïeg‰­.6 (æuçÍ"*ŽçHŽ6™ ÔG~Ño XêCíW²ØÛ:Éw"Í,d‡F;eeöÿ«vQºµ,<á ON¶¿³µžK[¨’h_í—r0N ädÖ³ô¨¯WKðU„t÷hWeÔZ7D+i-÷î¬U¼Å‘p2c!° PqÛÀ× áí Nmt·Óâx/m¬b°¶\ì…EÐYó) ÞÛeù‡ Ãþç†çÆüŸÿ‹¬vÐü ºÄšZØj²]E*C!…/äŽ7eV¤\ ù]IËp8ªö^”êQI©ép^yš„Ky=Ë¥ÃÜZ¦œ‰‰€2/ÚQN Œ²‡Ú:‹ž ð•ì½î¾Ú’jEííÕ% #%º9uI69ó@K»äb€$Òü)á ]¯¾|Ÿe•":æâ2KE£å/¸|²¨!€ ‚1ÅW}áüsëpºÎ$Ñ"Yµö›¯Ü£!½ó| Ÿ—?sv¾Ö—J²‡RӮ嶉#YZýŠfiE•”AÊÜæ,+C:gïÃnU˜Ö†«àÝ}<3®5¥¼—Z´ˆmcY.ÖF»‚[x%Ì­´dK“qUfòq…h¬ÿ…yáŸùñŸÿ§ÿâèÿ…yáŸùñŸÿ§ÿâëñG…|A©jºÅ®™?Úî⽂Yàq[ÏZÌ!~.·7%©#åT#CPð^£×ãÃöi’=ÜÐÚ\@ˆÕôöP §Ì±ý¬ïØßùñžhSQðw„ôÄ·’ãO»ò¦¸ŽÜÈ·³‘HÛP°ó3‚åW€pX€ ÓDð ø¢o}ÝN(£—ÉmN@ϼ9Ú«æî,7Ž”÷¬øôÒ¼%¯éÑYßY¶·éÖ–·_dBg‘] ‚+E+†wË9H˜•1º½Î‰«_x·ÅÚ>“o=­ö”ÑÊ·ï‡÷ÍxCÆc- Ý3ïº+L‰@Ámðõmíçš×R†;‹)ušñ•­Peܤ¨v¶ÒC è †`+¤ÿ…yáŸùñŸÿ§ÿâë[Š÷Æ>Lšf:ÚßxP²k‰Þ5[içòÀŽU\24,®¬@ç ŒýgÁ÷•Õ¬¶zöh-+;O°GýŸ8–Rò–a'“»tm¾ßsü¤‘¹TPQÿ óÃ?óã?þOÿÅÖ=ž‡àmCQk+[ VIY!2l¿‡Œ²¸óOîø*ÃïrF5Ÿwà{Óm¨Km¤@·ÓE¬Î’©]®Þçu”»³þ±QŸcç)¸Œ®qZš&™>Ÿ6« ›¡uq~ÎZú)-&ŠI¤‘U`{ ²•_õc–;ˆ\¸ðW„-'´†{YÒK¹L0¶\î¤#‡ãåF<úz⣰ðw„õ¼Ž=>í%³¸6óF÷³å[j°9C#£ ŒÁ û¯ ]É ©Õt8õ–µ½[™‘§Kƒu“4q¦r¹0´£ïí “&Gu&“þ™âÝsS‹›UŠßOWìòBÓ<…OB Î9Èxä ¼€Wÿ…yáŸùñŸÿ§ÿâèÿ…yáŸùñŸÿ§ÿâ먢€9øWžÿŸÿð:þ.Ÿ‚ô 2æË[9x¥B…î¥pà>ë1¯¥tµ Ïú¥ÿ®‰ÿ¡ 碑ⴕ£vC½Tã³TI¨É+Ê‘Þ3´M²EYrQ°ž¡´õÿ9ë¢&®#LðƧÄ­sÄR^¼+qÚ¡\m‰çô A£g= ™Fߌ/.‡„5L\ÍÌOÎy‚?*Ö¬?ÿÈ£©×/ê+rŽ€ã¿än—þ¹'ò¯d¯øÿ#t¿õÉ?•8î ö«Ÿõ«ÿ\ÓÿA Msþµëšè"¡¤7vv·ö¯kym Í»ã|S tlŒƒÁäøU[}G´ž í´›f·Rɲ+D¤’B8³tþñõ­ (QEQEQEQEQEQE–vðÛkŸÚÆW cl©å‚»K$òr£õëž6¶?ÚÿÈ?ýr—Zêêé¦éúT—Ó´à„™#† ~ñ©ûÓ÷x›þ…9ÿð:þ*š¸´:íö¿òÿgGöÇû_ùÿ³®_w‰¿èSŸÿ ÿâ¨ÝâoúçÿÀè?øªz‹C¨þØÿkÿ ÿötlµÿû:å÷x›þ…9ÿð:þ*Þ&ÿ¡NüƒÿŠ£PÐê?¶?ÚÿÈ?ýÛíäþι}Þ&ÿ¡NüƒÿŠ£w‰¿èSŸÿ ÿâ¨Ô4:íö¿òÿgGöÇû_ùÿ³®_w‰¿èSŸÿ ÿâ¨ÝâoúçÿÀè?øª5 £ûcý¯üƒÿÙÑý±þ×þAÿìë—ÝâoúçÿÀè?øª7x›þ…9ÿð:þ*CC¨þØÿkÿ ÿötlµÿû:å÷x›þ…9ÿð:þ*Þ&ÿ¡NüƒÿŠ£PÐê?¶?ÚÿÈ?ýÛíäþι}Þ&ÿ¡NüƒÿŠ£w‰¿èSŸÿ ÿâ¨Ô4:íö¿òÿgGöÇû_ùÿ³®_w‰¿èSŸÿ ÿâ¨ÝâoúçÿÀè?øª5 £ûcý¯üƒÿÙÑý±þ×þAÿìë—ÝâoúçÿÀè?øª7x›þ…9ÿð:þ*CC¨þØÿkÿ ÿötlµÿû:å÷x›þ…9ÿð:þ*Þ&ÿ¡NüƒÿŠ£PÐê?¶?ÚÿÈ?ýÛíäþι}Þ&ÿ¡NüƒÿŠ£w‰¿èSŸÿ ÿâ¨Ô4:íö¿òÿgGöÇû_ùÿ³®_w‰¿èSŸÿ ÿâ¨ÝâoúçÿÀè?øª5 £ûcý¯üƒÿÙÓ[UWÀv;C8‹‚÷½«™ÝâoúçÿÀè?øªšÔkòÝÃׇ¤´Ü+Î÷q8@O\)$ÿžhÔ4 ùu5¶i°Ú;3†v¹•”ÀTç9öÆ;çŒÝþ*ÿž7ýþ—ÿ‰®†8Ñ¢y$vP¤/ʹÎsî=)vÛÏYïÐÿâªFrZ¥—‰µ]2âÆXô„I“iešLürºz¯¬_Úé:=Õù3KäF\G°.ãØgÙ­nüÏ-~Õßµ_j »|ÇÁM§žsŠ ðÜ)ýÍõååä2+‰¦òÁ!RTT!Whó¤=3“É @îÚÍuªÇ7Ú$¹–Ý¢ oË—qœ„#a¿›÷…]³¹ûe½×“4tk'•:í‘23µ‡fÁµJÓJòµÝCS•!ß6ÈáòÇD »™¸ûì±Ä?†®ÙÛ}ŽÆÞ×Κ&5Í·HøÜÇ»dŸZšŠ( aEP]#þJ:Ø"_ýw5Ãi_'Ä™þX—Jt.xPÆT gÔàþF»?µÛÏÄ_÷Ø«[ɨ¨~×mÿ?ßbµÛÏÄ_÷ئ"j*µÛÏÄ_÷Ø£ívßóñýö(j*µÛÏÄ_÷Ø£ívßóñýö(j*µÛÏÄ_÷Ø£ívßóñýö(j*µÛÏÄ_÷Ø£ívßóñýö(j*µÛÏÄ_÷Ø£ívßóñýö(j*µÛÏÄ_÷Ø£ívßóñýö(j*µÛÏÄ_÷Ø£ívßóñýö(j*µÛÏÄ_÷Ø£ívßóñýö(j*µÛÏÄ_÷Ø£ívßóñýö(j*µÛÏÄ_÷Ø£ívßóñýö(j*µÛÏÄ_÷Ø£ívßóñýö(j†çýRÿ×DÿÐ…k¶ÿŸˆ¿ï±QÏq¢ªM1‘0~ð  ÿ9ë¢&®>ÃÆKqñUð¤öÎ$·T–Þhв²ј?÷H-ÁèrºÇž{ iR52 Øœ7­dÛÖòòò ¬Òæñ•®%®é ¨UÉÏ@§SÔœæQ_Æ?ò(ê_õËúŠÜ®sÅ·Ö“xSQŽ+¨Ì\*È <ŽÕÑÑмoâ7üÒÿ×$þUì•ã¿än—þ¹'ò§ÁžÕsþµëšè"¡©®Ö¯ýsOýT4€(¢ŠQEQEQEQEQEQEH“ËíŽWA× ÄS¾×sÿ?ÿßf¡¢€&û]ÏüüKÿ}š>×sÿ?ÿßf¡¢€&û]ÏüüKÿ}š>×sÿ?ÿßf¡¢€&û]ÏüüKÿ}š>×sÿ?ÿßf¡¢€&û]ÏüüKÿ}š>×sÿ?ÿßf¡¢€&û]ÏüüKÿ}š>×sÿ?ÿßf¡¢€&û]ÏüüKÿ}š>×sÿ?ÿßf¡¢€&û]ÏüüKÿ}š>×sÿ?ÿßf¡¢€&û]ÏüüKÿ}š>×sÿ?ÿßf¡¢€&û]ÏüüKÿ}š>×sÿ?ÿßf¡¢€&û]ÏüüKÿ}š>×sÿ?ÿßf¡¢€&û]ÏüüKÿ}š>×sÿ?ÿßf¡¢€&û]ÏüüKÿ}š>×sÿ?ÿßf¡¢€&û]ÏüüKÿ}š>×sÿ?ÿßf¡¢€+]éÖWû>Ùgos³;|è•öç®28è*·ü#Ú'ýôÿüOð­*(7þíþ€úþ'øV•P^7ñþFéë’*öJñ¿ˆßò7Kÿ\“ùSŽâgµ\ÿ­_úæŸúª—3}žÖiöîòÑŸnqœ Õ»Ÿõ«ÿ\ÓÿAŸ©ÿÈ*óþ¸?þ‚iNÒ÷ÄÖp]Ûx^w‚xÖXßí Êà à¶G´,%šëL‚öhR?æEI–PS«RT‚#ñÃ’o ø·W·±ÑψÒÓÂÚ³_Ç·6¾\)Û¦z 0 ì0ùDܶ––6ÖV*ÒØaPÅ‚¢ÆŠI$à rjšBE¶Zù>wÚaò¼Ï'~ñûömÏ÷·ü¸ëž:ÔÕÅí›ìØ¿d¼ûoö×Ú¿ãÚO+ÊûwŸ»ÍÛåÿ«ç³Ÿ—ïqY›u·Ó]RmDÅö˜þר¼W¡ç]’¶×rÉÅŸ$í;»*²,Øg£Õ[ JÃT§Óïm®áVØd·•dPØó‚?:Â:ß‚b¶‘溟ÌGuš?)çf c*ìÇæˆlÄ“ŸÞKb®§%Þ¥{«¥C} Ë]·’ 'Qs „`ÂF³vçÍ*»‹0qš% 2 ™Õc,72‚ w²çê=iõÂÀ%Ô<`º­ÄZ¸ÓÖæX­XÅqVhìö‚€Žlî^AÏQœímB}IºÓ¤Ö¥_²[O©½Ã\1wÛ¹1ùœ°1‹œˆ²0r‚‹éh–t€È‚gVuŒ°ÜÊÜËŸ¨õ§× —Pñ‚ê·jãO[™bµcÄEY£³Ú DZ9³¸yy=Ftõ»mv]m£ÓfÙöÑÈŒìâ8ÞvÚÅzy$Ž­J8!h¤DÓ¼D3"«´a†åRHŽÀ•l}¥2òî ‹Ë§òííãie|µTdœOµp–öºÍþ¯d·«¥Ô‰pê³M‰íòfR ²ƒn¬3€BFÚ«¬Ã¨O¡êÖºŒzÔ«öK˜4Ä·[†.â[„O/–1mƒ.CNN\Ñ`=.Šán­µ›É®­m&Ô`Õ¦’ò9e‘¦[d·)0·d?êƒmŽcùþöyßWl?·nu› ‰¼è­.¤mA£mêaAÆ pxVÃ۾ΛÖsžP[EP3)µ-J}VîÃMÑd¾kU¤u¸Ž0ƒ¾G÷OLô«¶k­Kq¶ÿD{v³y¯s™ IÉÇÓùøXˆ|Uâe!#xíU]¸ @“ äd~bº[é▱ʎ~s…`ª¬¬IÉjÆ™¤ùÚZŸ›Ÿ/í3¬{ñŒãqÆGçWkŸÕíu9¼S¦K¦É ,®–I§¶i£{råtäŽz)ãÓ""ÿK°Õ ¶¸ÕÞÒ{[Kx÷·‹°™£ ,TIÊò˜bs#;z+Îî¢ÕÜ]Í`u¯²[Z^ϦyÙ-ŒbEc½Ï™çíIAÈÎ\SîOÙ{=4Êëª$ÅÛߤN_Èón f4C¹As>XÉÊæ€;z+’ðå¶§.µ$×Ój+i ²›X¥fàÏr¾y.!ò²ç\ˆ5ÙµQâ›g¶ûd>]Í´H‘[ÜË𳯘ìÊÞJ`4€‡BÀ&àFT€ÒŠám-®íôMëk²Á-‘’ôÄ×qtV-ŠÂÞ*…‚1·#-— šº6¡ªÂ;cͪMu{>™<2¬sJ¦ –¾ii* •˜°b3’Hù²Kè”WŸivºÍµ¦Ÿ)m\ΖÚd®'ši?{,¥.ƒ$FTñÞI&ªÙZø†[P—Wº£Ï+Z­üqÁsÉ Ä>fÙZR0Îæ©·$àlXH3D³¤D:³¬e†æP@$à\ýG­>¸ˆôùáñl tº£iÖsˤ‚Iݳ"Z:‡`K<{ÄÙ.J `‘…¡áµÿ¦}«í“ýÏô럴Eö‡ù‹bÞoõ8ÈûŸ#gŒcj€tõÌßgµš}»¼´gÛœg5-UÔÿäyÿ\ÿA4 É·×µ[»h®`ðäï¨$FûTC*FAÁ>•³a,÷ZlWsÛý¤f/0>ÆWŽsÛ?á§éšœšM…«ÎÑZIiœ„bHÊÆ  ÏLÿãÔ¬i›ocŒÊ£= Šb+½ÌJ±Iæ;Ie—jóŒm=¹5ímå)gGsç¶\€á#‡Ëq?ÀúϽϨ°\¹Eg$&Ù,ë‘7Ü4sï˜mc…‹p nÚ>B# È¤‰ã³‰®YL„¡GùœárÌ>N™%¿,'¢«Ch^fi¡¹HÈÑÆòJ„ Â<‡êeÆãôàSfŽv´±VyTºFó‘3dÇœmB­Ë`pGåš,-ÓVXÝŠ£«ÔœrGó~«<Ʊgí¦0™¸ù66ÂÍ´(,Hlc¹m¹'µ%¼.· óÁpdu`‹™6¨YgÎ@8˜ÝëÇz,'¢Š) +Æþ#ÈÝ/ýrOå^É^7ñþFéë’*qÜLö«Ÿõ«ÿ\ÓÿA%X2’äÚ¥¹ÿZ¿õÍ?ôPÒoµÜÿÏÄ¿÷Ù¦I,’ãÌ‘ß718¦Q@Š( nìíoí^ÖòÚ›wÆø¦@èØ9ƒÈðªVžЬ.’êÏEÓ­®;%†Õ×# Ž iÑ@2b·‚8 "†5‘¢…UP0 ŸEQEQEQEQEH—¢…I¤Ub)º¸e*ÓÊAà‚çšŠŠ¥¨húf­åÿiiÖwžV|¿´À²lÎ3Àã8•Oigkaj–¶vÐÛ[¦vE EÉÉÀI?MEà M:NcC2+"ÈTnU$ì UÏÐzSè Š( Š(  ·úm†©Á¨Y[]­¼GqÈ¡°FpAçþujŠ(¢Š(¢Š(¥«RA‚;RQ@}®çþ~%ÿ¾Í2Id—d޸鹉Å2Š(¢Š(¢Š)¯RàK R€rD3ô€v÷WW w2¬ò€€ÏÔ_k¹ÿŸ‰ï³Eßü~Oÿ]ùÔ4€›íw?óñ/ýöj—ü$vŸÚÙŸÛ0ÿhϯڇ›÷w}Ìç§=:sS×1¤ßM¥hé'O¼ŸX¶¶`Ëöy+™Â–-ö¾_ï-¹Žrÿ0 ‘@oÚîçâ_ûìÑö»Ÿùø—þû5æZm¶©uªÁa%Ö¯.–nbwE{hFaºÜ Ë!“n僣mÉ^2NtôïµR$Ö?µþÏ‹í%nf\ÊcûË勚\†99s@Ö¬ÖP¬·r¢4‘Äæ?3¸Ez³øÔÿk¹ÿŸ‰ï³^]ci¯K _mžúâ>Íïak9Õau1 $Œ¤%ÿP¢<NA^—@}®çþ~%ÿ¾ÍVÔ/nÓMºtº™Yar‚ >ªêò ¼ÿ®ÿ šo„ÿä ¡ÿ×½¿þ‚µ¥ö»Ÿùø—þû5›á?ùhõïoÿ ­\  ¾×sÿ?ÿßfµÜÿÏÄ¿÷Ù¨h cÚþU‘#k·ùÚ¦C–Ç\ óOû]ÏüüKÿ}šËš;óÞ,2ÂÈ#Üî‚üîq¼0LätÇN*;ˆäK;–Œ] "û_Ÿ92l|СK|Dcåçõ§aÆúutCq6ç$( NHŸÐøS¾×sÿ?ÿßf¨›B÷§ÉŽî]̱™<ÀÜÃ8fgÍÿ<ùé“ëš}®ù-þÕ.7MŠ„ì ¹Œ“Ã1lê«ëE€·ö»Ÿùø—þû4}®çþ~%ÿ¾ÍCE!™>0¼ºÕ1s70?9äü«vЕœ²’G Žß)®sÆ?ò(ê_õËúŠè­¿Ö·ýsýÓ}®çþ~%ÿ¾Ík¹ÿŸ‰ï³PÑHdßk¹ÿŸ‰ï³L:Œ‹:@oLêα™~fP@$ òeÏÔzÓ+ŸÕôû»ßéowyf‘Ù]¸¶Ž6ä½¾—FQœÓ?/± GG£$è^Æ‘C2Ir)*ÃÔAô Ôvº³^ÂÒÛÝÊè²I;˜|ÈåsèÊGá^dl|AòóQVK“hég,,æîr]„Oc*a#ÎYÝÆúÚâ¾Ö-Sû]5Ži´Ø û@ˆL÷—…@¿»Ú؈æ_”éš`z§Úîçâ_ûìÑö»Ÿùø—þû5 †Mö»Ÿùø—þû5‡â‹«†µÓÐÜJQõ+`Ê\ᇘ?ˆð­jÃñ?ú3þÂvßú¡ܯøÿ#t¿õÉ?•{%xßÄoù¥ÿ®Iü©Çpgµ\ÿ­_úæŸú¨jkŸõ«ÿ\ÓÿA (¢…p°x²çFŽm;þn᡼¼&Xì¤(áJ§#k¯5ÝQ@Ž'þû¯úuïü—ÿˆ£þû¯úuïü—ÿˆ®ÚŠ.€âá?ºÿ¡G^ÿÀ)øŠ?á?ºÿ¡G^ÿÀ)øŠí¨¢è'þû¯úuïü—ÿˆ£þû¯úuïü—ÿˆ®ÚŠ.€âá?ºÿ¡G^ÿÀ)øŠ?á?ºÿ¡G^ÿÀ)øŠí¨¢èçÇ7W³Aÿž¼¾b2nû §þåj|<¶¸´ðE”7Vó[Ê$ŒsFQÀ39Rƺz(¸7^(¯')¦k†F*ÂÂL0Ï^FjøIâÿ N³ÿ€þ¹EaÿÂOýuŸüð£þx¿è¬ÿàÿ…nQ@ð“Åÿ@gÿü(ÿ„ž/úë?øÿá[”Pü$ñÐ'YÿÀÿ ?á'‹þ:Ïþ?øVå‡ÿ <_ô Öðÿ¡¼ñ \YO iZÀi#dØIŒ‘J訠 >o°èzS\¤‰ä[Bd_-‹.Õ@Éñ¿Mf½pF3Gü$ña@Òu€B¨{€§ ­Ê(¸ð“Åÿ@gÿü(ÿ„ž/úë?øÿá[”P#â `êz핾•«ù²ÇµwXÈ*ë^î;¥¸‘%uXØmŠ6‘‰ €€IäëÅ-\ ?øIâÿ N³ÿ€þÂOýuŸüð­Ê(þx¿è¬ÿàÿ…ð“Åÿ@gÿü+rŠÃÿ„ž/úë?øÿáL!µYÞq¢êÂgUFiϹ”@'€Y±õ>µ¿EaÿÂOýuŸüð£þx¿è¬ÿàÿ…nQ@ð“Åÿ@gÿü*†§©¶¬Ú|iº¢2_Á+4¶nª8É'WWEã¿än—þ¹'ò¯d¯øÿ#t¿õÉ?•8î îî>%xu¦ùd¸`Wp„ààŸÒ¢ÿ…‘áÿïÜÿ߯þ½Ur¡\?ádxû÷?÷ëÿ¯Gü,ÿ~çþýõ袎TøYþýÏýúÿëÑÿ #Ãÿß¹ÿ¿_ýz(£•ÃþG‡ÿ¿sÿ~¿úôÂÈðÿ÷îï×ÿ^Š(åApÿ…‘áÿïÜÿ߯þ½ð²' where is one of" @echo " html to make standalone HTML files" @echo " dirhtml to make HTML files named index.html in directories" @echo " singlehtml to make a single large HTML file" @echo " pickle to make pickle files" @echo " json to make JSON files" @echo " htmlhelp to make HTML files and a HTML help project" @echo " qthelp to make HTML files and a qthelp project" @echo " devhelp to make HTML files and a Devhelp project" @echo " epub to make an epub" @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" @echo " latexpdf to make LaTeX files and run them through pdflatex" @echo " text to make text files" @echo " man to make manual pages" @echo " changes to make an overview of all changed/added/deprecated items" @echo " linkcheck to check all external links for integrity" @echo " doctest to run all doctests embedded in the documentation (if enabled)" clean: -rm -rf $(BUILDDIR)/* -rm -f features.rst html: features $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." dirhtml: $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." singlehtml: $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml @echo @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." pickle: $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle @echo @echo "Build finished; now you can process the pickle files." json: $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json @echo @echo "Build finished; now you can process the JSON files." htmlhelp: $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp @echo @echo "Build finished; now you can run HTML Help Workshop with the" \ ".hhp project file in $(BUILDDIR)/htmlhelp." qthelp: $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp @echo @echo "Build finished; now you can run "qcollectiongenerator" with the" \ ".qhcp project file in $(BUILDDIR)/qthelp, like this:" @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/Pylint.qhcp" @echo "To view the help file:" @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/Pylint.qhc" devhelp: $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp @echo @echo "Build finished." @echo "To view the help file:" @echo "# mkdir -p $$HOME/.local/share/devhelp/Pylint" @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/Pylint" @echo "# devhelp" epub: $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub @echo @echo "Build finished. The epub file is in $(BUILDDIR)/epub." latex: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." @echo "Run \`make' in that directory to run these through (pdf)latex" \ "(use \`make latexpdf' here to do that automatically)." latexpdf: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo "Running LaTeX files through pdflatex..." $(MAKE) -C $(BUILDDIR)/latex all-pdf @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." text: $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text @echo @echo "Build finished. The text files are in $(BUILDDIR)/text." man: $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man @echo @echo "Build finished. The manual pages are in $(BUILDDIR)/man." changes: $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes @echo @echo "The overview file is in $(BUILDDIR)/changes." linkcheck: $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck @echo @echo "Link check complete; look for any errors in the above output " \ "or in $(BUILDDIR)/linkcheck/output.txt." doctest: $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest @echo "Testing of doctests in the sources finished, look at the " \ "results in $(BUILDDIR)/doctest/output.txt." features: rm -f features.rst echo "Pylint features" > features.rst echo "===============" >> features.rst echo "" >> features.rst echo ".. generated by pylint --full-documentation" >> features.rst echo "" >> features.rst pylint --full-documentation >> features.rst gen-examples: chmod u+w ../examples/pylintrc pylint --generate-rcfile > ../examples/pylintrc gen-man: chmod u+w ../man/pylint.1 pylint --generate-man > ../man/pylint.1 all: html gen-man gen-examples pylint-1.1.0/doc/backlinks.rst0000664000175000017500000000164412133451371015757 0ustar sytsyt00000000000000 Some projects using Pylint -------------------------- The following projects are known to use Pylint to help develop better code: * OSAF Chandler (http://www.osafoundation.org/) * Xen (http://www.xensource.com/) * CPS (http://www.nuxeo.org) * ERP5 (http://www.erp5.org/) * pyxmpp (http://pyxmpp.jabberstudio.org/) * mercurial * eXe (http://exelearning.org/) * PrimaGIS (http://www.primagis.org) * python-cdd (https://projetos.ossystems.com.br/projects/python-cdd) * CDSWare (http://cdsware.cern.ch/) * ASE (http://dcwww.camp.dtu.dk/campos/ASE/intro.html) * RunJob (http://projects.fnal.gov/runjob/) * Slugathon (http://slugathon.python-hosting.com/) * Topographica (http://topographica.org/Home/index.html) (at least they intend to do so) * http://browsershots.org * many more... Also notice that the CheeseCake_ kwalitee reporting tool uses Pylint to analyze the source code. .. _CheeseCake: http://cheesecake.sourceforge.net/ pylint-1.1.0/doc/features.rst0000664000175000017500000011311712220525761015635 0ustar sytsyt00000000000000Pylint features =============== .. generated by pylint --full-documentation Options ------- General options ~~~~~~~~~~~~~~~ :rcfile: Specify a configuration file. :init-hook: Python code to execute, usually for sys.path manipulation such as pygtk.require(). :errors-only: In error mode, checkers without error messages are disabled and for others, only the ERROR messages are displayed, and no reports are done by default :profile: Profiled execution. :ignore: Add files or directories to the blacklist. They should be base names, not paths. Default: ``.hg,test`` :persistent: Pickle collected data for later comparisons. Default: ``yes`` :load-plugins: List of plugins (as comma separated values of python modules names) to load, usually to register additional checkers. :long-help: more verbose help. Commands options ~~~~~~~~~~~~~~~~ :help-msg: Display a help message for the given message id and exit. The value may be a comma separated list of message ids. :list-msgs: Generate pylint's messages. :full-documentation: Generate pylint's full documentation. :generate-rcfile: Generate a sample configuration file according to the current configuration. You can put other options before this one to get them in the generated configuration. :generate-man: Generate pylint's man page. Messages control options ~~~~~~~~~~~~~~~~~~~~~~~~ :enable: Enable the message, report, category or checker with the given id(s). You can either give multiple identifier separated by comma (,) or put this option multiple time. See also the "--disable" option for examples. :disable: Disable the message, report, category or checker with the given id(s). You can either give multiple identifiers separated by comma (,) or put this option multiple times (only on the command line, not in the configuration file where it should appear only once).You can also use "--disable=all" to disable everything first and then reenable specific checks. For example, if you want to run only the similarities checker, you can use "--disable=all --enable=similarities". If you want to run only the classes checker, but have no Warning level messages displayed, use"--disable=all --enable=classes --disable=W" Reports options ~~~~~~~~~~~~~~~ :output-format: Set the output format. Available formats are text, parseable, colorized, msvs (visual studio) and html. You can also give a reporter class, eg mypackage.mymodule.MyReporterClass. Default: ``text`` :files-output: Put messages in a separate file for each module / package specified on the command line instead of printing them on stdout. Reports (if any) will be written in a file name "pylint_global.[txt|html]". :reports: Tells whether to display a full report or only the messages Default: ``yes`` :evaluation: Python expression which should return a note less than 10 (10 is the highest note). You have access to the variables errors warning, statement which respectively contain the number of errors / warnings messages and the total number of statements analyzed. This is used by the global evaluation report (RP0004). Default: ``10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10)`` :comment: Add a comment according to your evaluation note. This is used by the global evaluation report (RP0004). :msg-template: Template used to display messages. This is a python new-style format string used to format the message information. See doc for all details logging checker --------------- Messages ~~~~~~~~ :logging-unsupported-format (E1200): *Unsupported logging format character %r (%#02x) at index %d* Used when an unsupported format character is used in a logging statement format string. :logging-format-truncated (E1201): *Logging format string ends in middle of conversion specifier* Used when a logging statement format string terminates before the end of a conversion specifier. :logging-too-many-args (E1205): *Too many arguments for logging format string* Used when a logging format string is given too few arguments. :logging-too-few-args (E1206): *Not enough arguments for logging format string* Used when a logging format string is given too many arguments :logging-not-lazy (W1201): *Specify string format arguments as logging function parameters* Used when a logging statement has a call form of "logging.(format_string % (format_args...))". Such calls should leave string interpolation to the logging method itself and be written "logging.(format_string, format_args...)" so that the program may avoid incurring the cost of the interpolation in those cases in which no message will be logged. For more, see http://www.python.org/dev/peps/pep-0282/. string checker -------------- Messages ~~~~~~~~ :bad-format-character (E1300): *Unsupported format character %r (%#02x) at index %d* Used when a unsupported format character is used in a format string. :truncated-format-string (E1301): *Format string ends in middle of conversion specifier* Used when a format string terminates before the end of a conversion specifier. :mixed-format-string (E1302): *Mixing named and unnamed conversion specifiers in format string* Used when a format string contains both named (e.g. '%(foo)d') and unnamed (e.g. '%d') conversion specifiers. This is also used when a named conversion specifier contains * for the minimum field width and/or precision. :format-needs-mapping (E1303): *Expected mapping for format string, not %s* Used when a format string that uses named conversion specifiers is used with an argument that is not a mapping. :missing-format-string-key (E1304): *Missing key %r in format string dictionary* Used when a format string that uses named conversion specifiers is used with a dictionary that doesn't contain all the keys required by the format string. :too-many-format-args (E1305): *Too many arguments for format string* Used when a format string that uses unnamed conversion specifiers is given too few arguments. :too-few-format-args (E1306): *Not enough arguments for format string* Used when a format string that uses unnamed conversion specifiers is given too many arguments :bad-str-strip-call (E1310): *Suspicious argument in %s.%s call* The argument to a str.{l,r,}strip call contains a duplicate character, :bad-format-string-key (W1300): *Format string dictionary key should be a string, not %s* Used when a format string that uses named conversion specifiers is used with a dictionary whose keys are not all strings. :unused-format-string-key (W1301): *Unused key %r in format string dictionary* Used when a format string that uses named conversion specifiers is used with a dictionary that conWtains keys not required by the format string. format checker -------------- Options ~~~~~~~ :max-line-length: Maximum number of characters on a single line. Default: ``80`` :ignore-long-lines: Regexp for a line that is allowed to be longer than the limit. Default: ``^\s*(# )??$`` :max-module-lines: Maximum number of lines in a module Default: ``1000`` :indent-string: String used as indentation unit. This is usually " " (4 spaces) or "\t" (1 tab). Default: ``' '`` Messages ~~~~~~~~ :unnecessary-semicolon (W0301): *Unnecessary semicolon* Used when a statement is ended by a semi-colon (";"), which isn't necessary (that's python, not C ;). :bad-indentation (W0311): *Bad indentation. Found %s %s, expected %s* Used when an unexpected number of indentation's tabulations or spaces has been found. :mixed-indentation (W0312): *Found indentation with %ss instead of %ss* Used when there are some mixed tabs and spaces in a module. :old-ne-operator (W0331): *Use of the <> operator* Used when the deprecated "<>" operator is used instead of "!=". :lowercase-l-suffix (W0332): *Use of "l" as long integer identifier* Used when a lower case "l" is used to mark a long integer. You should use a upper case "L" since the letter "l" looks too much like the digit "1" :backtick (W0333): *Use of the `` operator* Used when the deprecated "``" (backtick) operator is used instead of the str() function. :line-too-long (C0301): *Line too long (%s/%s)* Used when a line is longer than a given number of characters. :too-many-lines (C0302): *Too many lines in module (%s)* Used when a module has too much lines, reducing its readability. :trailing-whitespace (C0303): *Trailing whitespace* Used when there is whitespace between the end of a line and the newline. :missing-final-newline (C0304): *Final newline missing* Used when the last line in a file is missing a newline. :multiple-statements (C0321): *More than one statement on a single line* Used when more than on statement are found on the same line. :no-space-before-operator (C0322): *Operator not preceded by a space* Used when one of the following operator (!= | <= | == | >= | < | > | = | \+= | -= | \*= | /= | %) is not preceded by a space. :no-space-after-operator (C0323): *Operator not followed by a space* Used when one of the following operator (!= | <= | == | >= | < | > | = | \+= | -= | \*= | /= | %) is not followed by a space. :no-space-after-comma (C0324): *Comma not followed by a space* Used when a comma (",") is not followed by a space. imports checker --------------- Options ~~~~~~~ :deprecated-modules: Deprecated modules which should not be used, separated by a comma Default: ``regsub,string,TERMIOS,Bastion,rexec`` :import-graph: Create a graph of every (i.e. internal and external) dependencies in the given file (report RP0402 must not be disabled) :ext-import-graph: Create a graph of external dependencies in the given file (report RP0402 must not be disabled) :int-import-graph: Create a graph of internal dependencies in the given file (report RP0402 must not be disabled) Messages ~~~~~~~~ :wildcard-import (W0401): *Wildcard import %s* Used when `from module import *` is detected. :deprecated-module (W0402): *Uses of a deprecated module %r* Used a module marked as deprecated is imported. :relative-import (W0403): *Relative import %r, should be %r* Used when an import relative to the package directory is detected. :reimported (W0404): *Reimport %r (imported line %s)* Used when a module is reimported multiple times. :import-self (W0406): *Module import itself* Used when a module is importing itself. :misplaced-future (W0410): *__future__ import is not the first non docstring statement* Python 2.5 and greater require __future__ import to be the first non docstring statement in the module. :cyclic-import (R0401): *Cyclic import (%s)* Used when a cyclic import between two or more modules is detected. :import-error (F0401): *Unable to import %s* Used when pylint has been unable to import a module. Reports ~~~~~~~ :RP0401: External dependencies :RP0402: Modules dependencies graph variables checker ----------------- Options ~~~~~~~ :init-import: Tells whether we should check for unused import in __init__ files. :dummy-variables-rgx: A regular expression matching the beginning of the name of dummy variables (i.e. not used). Default: ``_|dummy`` :additional-builtins: List of additional names supposed to be defined in builtins. Remember that you should avoid to define new builtins when possible. Messages ~~~~~~~~ :used-before-assignment (E0601): *Using variable %r before assignment* Used when a local variable is accessed before it's assignment. :undefined-variable (E0602): *Undefined variable %r* Used when an undefined variable is accessed. :undefined-all-variable (E0603): *Undefined variable name %r in __all__* Used when an undefined variable name is referenced in __all__. :invalid-all-object (E0604): *Invalid object %r in __all__, must contain only strings* Used when an invalid (non-string) object occurs in __all__. :no-name-in-module (E0611): *No name %r in module %r* Used when a name cannot be found in a module. :global-variable-undefined (W0601): *Global variable %r undefined at the module level* Used when a variable is defined through the "global" statement but the variable is not defined in the module scope. :global-variable-not-assigned (W0602): *Using global for %r but no assignment is done* Used when a variable is defined through the "global" statement but no assignment to this variable is done. :global-statement (W0603): *Using the global statement* Used when you use the "global" statement to update a global variable. PyLint just try to discourage this usage. That doesn't mean you can not use it ! :global-at-module-level (W0604): *Using the global statement at the module level* Used when you use the "global" statement at the module level since it has no effect :unused-import (W0611): *Unused import %s* Used when an imported module or variable is not used. :unused-variable (W0612): *Unused variable %r* Used when a variable is defined but not used. :unused-argument (W0613): *Unused argument %r* Used when a function or method argument is not used. :unused-wildcard-import (W0614): *Unused import %s from wildcard import* Used when an imported module or variable is not used from a 'from X import *' style import. :redefined-outer-name (W0621): *Redefining name %r from outer scope (line %s)* Used when a variable's name hide a name defined in the outer scope. :redefined-builtin (W0622): *Redefining built-in %r* Used when a variable or function override a built-in. :redefine-in-handler (W0623): *Redefining name %r from %s in exception handler* Used when an exception handler assigns the exception to an existing name :undefined-loop-variable (W0631): *Using possibly undefined loop variable %r* Used when an loop variable (i.e. defined by a for loop or a list comprehension or a generator expression) is used outside the loop. :unbalanced-tuple-unpacking (W0632): *Possible unbalanced tuple unpacking: left side has %d label(s), right side has %d value(s)* Used when there is an unbalanced tuple unpacking in assignment basic checker ------------- Options ~~~~~~~ :required-attributes: Required attributes for module, separated by a comma :bad-functions: List of builtins function names that should not be used, separated by a comma Default: ``map,filter,apply,input`` :module-rgx: Regular expression which should only match correct module names Default: ``(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$`` :const-rgx: Regular expression which should only match correct module level names Default: ``(([A-Z_][A-Z0-9_]*)|(__.*__))$`` :class-rgx: Regular expression which should only match correct class names Default: ``[A-Z_][a-zA-Z0-9]+$`` :function-rgx: Regular expression which should only match correct function names Default: ``[a-z_][a-z0-9_]{2,30}$`` :method-rgx: Regular expression which should only match correct method names Default: ``[a-z_][a-z0-9_]{2,30}$`` :attr-rgx: Regular expression which should only match correct instance attribute names Default: ``[a-z_][a-z0-9_]{2,30}$`` :argument-rgx: Regular expression which should only match correct argument names Default: ``[a-z_][a-z0-9_]{2,30}$`` :variable-rgx: Regular expression which should only match correct variable names Default: ``[a-z_][a-z0-9_]{2,30}$`` :class-attribute-rgx: Regular expression which should only match correct attribute names in class bodies Default: ``([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__))$`` :inlinevar-rgx: Regular expression which should only match correct list comprehension / generator expression variable names Default: ``[A-Za-z_][A-Za-z0-9_]*$`` :good-names: Good variable names which should always be accepted, separated by a comma Default: ``i,j,k,ex,Run,_`` :bad-names: Bad variable names which should always be refused, separated by a comma Default: ``foo,bar,baz,toto,tutu,tata`` :no-docstring-rgx: Regular expression which should only match function or class names that do not require a docstring. Default: ``__.*__`` :docstring-min-length: Minimum line length for functions/classes that require docstrings, shorter ones are exempt. Default: ``-1`` Messages ~~~~~~~~ :init-is-generator (E0100): *__init__ method is a generator* Used when the special class method __init__ is turned into a generator by a yield in its body. :return-in-init (E0101): *Explicit return in __init__* Used when the special class method __init__ has an explicit return value. :function-redefined (E0102): *%s already defined line %s* Used when a function / class / method is redefined. :not-in-loop (E0103): *%r not properly in loop* Used when break or continue keywords are used outside a loop. :return-outside-function (E0104): *Return outside function* Used when a "return" statement is found outside a function or method. :yield-outside-function (E0105): *Yield outside function* Used when a "yield" statement is found outside a function or method. :return-arg-in-generator (E0106): *Return with argument inside generator* Used when a "return" statement with an argument is found outside in a generator function or method (e.g. with some "yield" statements). :nonexistent-operator (E0107): *Use of the non-existent %s operator* Used when you attempt to use the C-style pre-increment orpre-decrement operator -- and ++, which doesn't exist in Python. :duplicate-argument-name (E0108): *Duplicate argument name %s in function definition* Duplicate argument names in function definitions are syntax errors. :unreachable (W0101): *Unreachable code* Used when there is some code behind a "return" or "raise" statement, which will never be accessed. :dangerous-default-value (W0102): *Dangerous default value %s as argument* Used when a mutable value as list or dictionary is detected in a default value for an argument. :pointless-statement (W0104): *Statement seems to have no effect* Used when a statement doesn't have (or at least seems to) any effect. :pointless-string-statement (W0105): *String statement has no effect* Used when a string is used as a statement (which of course has no effect). This is a particular case of W0104 with its own message so you can easily disable it if you're using those strings as documentation, instead of comments. :expression-not-assigned (W0106): *Expression "%s" is assigned to nothing* Used when an expression that is not a function call is assigned to nothing. Probably something else was intended. :unnecessary-pass (W0107): *Unnecessary pass statement* Used when a "pass" statement that can be avoided is encountered. :unnecessary-lambda (W0108): *Lambda may not be necessary* Used when the body of a lambda expression is a function call on the same argument list as the lambda itself; such lambda expressions are in all but a few cases replaceable with the function being called in the body of the lambda. :duplicate-key (W0109): *Duplicate key %r in dictionary* Used when a dictionary expression binds the same key multiple times. :deprecated-lambda (W0110): *map/filter on lambda could be replaced by comprehension* Used when a lambda is the first argument to "map" or "filter". It could be clearer as a list comprehension or generator expression. This message can't be emitted when using Python >= 3.0. :useless-else-on-loop (W0120): *Else clause on loop without a break statement* Loops should only have an else clause if they can exit early with a break statement, otherwise the statements under else should be on the same scope as the loop itself. :old-raise-syntax (W0121): *Use raise ErrorClass(args) instead of raise ErrorClass, args.* Used when the alternate raise syntax 'raise foo, bar' is used instead of 'raise foo(bar)'. This message can't be emitted when using Python >= 3.0. :exec-used (W0122): *Use of exec* Used when you use the "exec" statement (function for Python 3), to discourage its usage. That doesn't mean you can not use it ! :bad-builtin (W0141): *Used builtin function %r* Used when a black listed builtin function is used (see the bad-function option). Usual black listed functions are the ones like map, or filter , where Python offers now some cleaner alternative like list comprehension. :star-args (W0142): *Used * or ** magic* Used when a function or method is called using `*args` or `**kwargs` to dispatch arguments. This doesn't improve readability and should be used with care. :lost-exception (W0150): *%s statement in finally block may swallow exception* Used when a break or a return statement is found inside the finally clause of a try...finally block: the exceptions raised in the try clause will be silently swallowed instead of being re-raised. :assert-on-tuple (W0199): *Assert called on a 2-uple. Did you mean 'assert x,y'?* A call of assert on a tuple will always evaluate to true if the tuple is not empty, and will always evaluate to false if it is. :blacklisted-name (C0102): *Black listed name "%s"* Used when the name is listed in the black list (unauthorized names). :invalid-name (C0103): *Invalid %s name "%s"* Used when the name doesn't match the regular expression associated to its type (constant, variable, class...). :missing-docstring (C0111): *Missing %s docstring* Used when a module, function, class or method has no docstring. Some special methods like __init__ doesn't necessary require a docstring. :empty-docstring (C0112): *Empty %s docstring* Used when a module, function, class or method has an empty docstring (it would be too easy ;). :missing-module-attribute (C0121): *Missing required attribute "%s"* Used when an attribute required for modules is missing. Reports ~~~~~~~ :RP0101: Statistics by type miscellaneous checker --------------------- Options ~~~~~~~ :notes: List of note tags to take in consideration, separated by a comma. Default: ``FIXME,XXX,TODO`` Messages ~~~~~~~~ :fixme (W0511): Used when a warning note as FIXME or XXX is detected. :invalid-encoded-data (W0512): *Cannot decode using encoding "%s", unexpected byte at position %d* Used when a source line cannot be decoded using the specified source file encoding. This message can't be emitted when using Python >= 3.0. open_mode checker ----------------- Messages ~~~~~~~~ :bad-open-mode (W1501): *"%s" is not a valid mode for open.* Python supports: r, w, a modes with b, +, and U options. See http://docs.python.org/2/library/functions.html#open metrics checker --------------- Reports ~~~~~~~ :RP0701: Raw metrics classes checker --------------- Options ~~~~~~~ :ignore-iface-methods: List of interface methods to ignore, separated by a comma. This is used for instance to not check methods defines in Zope's Interface base class. Default: ``isImplementedBy,deferred,extends,names,namesAndDescriptions,queryDescriptionFor,getBases,getDescriptionFor,getDoc,getName,getTaggedValue,getTaggedValueTags,isEqualOrExtendedBy,setTaggedValue,isImplementedByInstancesOf,adaptWith,is_implemented_by`` :defining-attr-methods: List of method names used to declare (i.e. assign) instance attributes. Default: ``__init__,__new__,setUp`` :valid-classmethod-first-arg: List of valid names for the first argument in a class method. Default: ``cls`` :valid-metaclass-classmethod-first-arg: List of valid names for the first argument in a metaclass class method. Default: ``mcs`` Messages ~~~~~~~~ :method-hidden (E0202): *An attribute affected in %s line %s hide this method* Used when a class defines a method which is hidden by an instance attribute from an ancestor class or set by some client code. :access-member-before-definition (E0203): *Access to member %r before its definition line %s* Used when an instance member is accessed before it's actually assigned. :no-method-argument (E0211): *Method has no argument* Used when a method which should have the bound instance as first argument has no argument defined. :no-self-argument (E0213): *Method should have "self" as first argument* Used when a method has an attribute different the "self" as first argument. This is considered as an error since this is a so common convention that you shouldn't break it! :interface-is-not-class (E0221): *Interface resolved to %s is not a class* Used when a class claims to implement an interface which is not a class. :missing-interface-method (E0222): *Missing method %r from %s interface* Used when a method declared in an interface is missing from a class implementing this interface :attribute-defined-outside-init (W0201): *Attribute %r defined outside __init__* Used when an instance attribute is defined outside the __init__ method. :bad-staticmethod-argument (W0211): *Static method with %r as first argument* Used when a static method has "self" or a value specified in valid-classmethod-first-arg option or valid-metaclass-classmethod-first-arg option as first argument. :protected-access (W0212): *Access to a protected member %s of a client class* Used when a protected member (i.e. class member with a name beginning with an underscore) is access outside the class or a descendant of the class where it's defined. :arguments-differ (W0221): *Arguments number differs from %s method* Used when a method has a different number of arguments than in the implemented interface or in an overridden method. :signature-differs (W0222): *Signature differs from %s method* Used when a method signature is different than in the implemented interface or in an overridden method. :abstract-method (W0223): *Method %r is abstract in class %r but is not overridden* Used when an abstract method (i.e. raise NotImplementedError) is not overridden in concrete class. :super-init-not-called (W0231): *__init__ method from base class %r is not called* Used when an ancestor class method has an __init__ method which is not called by a derived class. :no-init (W0232): *Class has no __init__ method* Used when a class has no __init__ method, neither its parent classes. :non-parent-init-called (W0233): *__init__ method from a non direct base class %r is called* Used when an __init__ method is called on a class which is not in the direct ancestors for the analysed class. :non-iterator-returned (W0234): *__iter__ returns non-iterator* Used when an __iter__ method returns something which is not an iterable (i.e. has no `next` method) :no-self-use (R0201): *Method could be a function* Used when a method doesn't use its bound instance, and so could be written as a function. :bad-classmethod-argument (C0202): *Class method %s should have %s as first argument* Used when a class method has a first argument named differently than the value specified in valid-classmethod-first-arg option (default to "cls"), recommended to easily differentiate them from regular instance methods. :bad-mcs-method-argument (C0203): *Metaclass method %s should have %s as first argument* Used when a metaclass method has a first agument named differently than the value specified in valid-classmethod-first-arg option (default to "cls"), recommended to easily differentiate them from regular instance methods. :bad-mcs-classmethod-argument (C0204): *Metaclass class method %s should have %s as first argument* Used when a metaclass class method has a first argument named differently than the value specified in valid-metaclass-classmethod-first-arg option (default to "mcs"), recommended to easily differentiate them from regular instance methods. :method-check-failed (F0202): *Unable to check methods signature (%s / %s)* Used when PyLint has been unable to check methods signature compatibility for an unexpected reason. Please report this kind if you don't make sense of it. :unresolved-interface (F0220): *failed to resolve interfaces implemented by %s (%s)* Used when a PyLint as failed to find interfaces implemented by a class design checker -------------- Options ~~~~~~~ :max-args: Maximum number of arguments for function / method Default: ``5`` :ignored-argument-names: Argument names that match this expression will be ignored. Default to name with leading underscore Default: ``_.*`` :max-locals: Maximum number of locals for function / method body Default: ``15`` :max-returns: Maximum number of return / yield for function / method body Default: ``6`` :max-branches: Maximum number of branch for function / method body Default: ``12`` :max-statements: Maximum number of statements in function / method body Default: ``50`` :max-parents: Maximum number of parents for a class (see R0901). Default: ``7`` :max-attributes: Maximum number of attributes for a class (see R0902). Default: ``7`` :min-public-methods: Minimum number of public methods for a class (see R0903). Default: ``2`` :max-public-methods: Maximum number of public methods for a class (see R0904). Default: ``20`` Messages ~~~~~~~~ :too-many-ancestors (R0901): *Too many ancestors (%s/%s)* Used when class has too many parent classes, try to reduce this to get a simpler (and so easier to use) class. :too-many-instance-attributes (R0902): *Too many instance attributes (%s/%s)* Used when class has too many instance attributes, try to reduce this to get a simpler (and so easier to use) class. :too-few-public-methods (R0903): *Too few public methods (%s/%s)* Used when class has too few public methods, so be sure it's really worth it. :too-many-public-methods (R0904): *Too many public methods (%s/%s)* Used when class has too many public methods, try to reduce this to get a simpler (and so easier to use) class. :too-many-return-statements (R0911): *Too many return statements (%s/%s)* Used when a function or method has too many return statement, making it hard to follow. :too-many-branches (R0912): *Too many branches (%s/%s)* Used when a function or method has too many branches, making it hard to follow. :too-many-arguments (R0913): *Too many arguments (%s/%s)* Used when a function or method takes too many arguments. :too-many-locals (R0914): *Too many local variables (%s/%s)* Used when a function or method has too many local variables. :too-many-statements (R0915): *Too many statements (%s/%s)* Used when a function or method has too many statements. You should then split it in smaller functions / methods. :abstract-class-not-used (R0921): *Abstract class not referenced* Used when an abstract class is not used as ancestor anywhere. :abstract-class-little-used (R0922): *Abstract class is only referenced %s times* Used when an abstract class is used less than X times as ancestor. :interface-not-implemented (R0923): *Interface not implemented* Used when an interface class is not implemented anywhere. :incomplete-protocol (R0924): *Badly implemented %s, implements %s but not %s* A class implements some of the special methods for a particular protocol, but not all of them string_constant checker ----------------------- Messages ~~~~~~~~ :anomalous-backslash-in-string (W1401): *Anomalous backslash in string: '%s'. String constant might be missing an r prefix.* Used when a backslash is in a literal string but not as an escape. :anomalous-unicode-escape-in-string (W1402): *Anomalous Unicode escape in byte string: '%s'. String constant might be missing an r or u prefix.* Used when an escape like \u is encountered in a byte string where it has no effect. similarities checker -------------------- Options ~~~~~~~ :min-similarity-lines: Minimum lines number of a similarity. Default: ``4`` :ignore-comments: Ignore comments when computing similarities. Default: ``yes`` :ignore-docstrings: Ignore docstrings when computing similarities. Default: ``yes`` :ignore-imports: Ignore imports when computing similarities. Messages ~~~~~~~~ :duplicate-code (R0801): *Similar lines in %s files* Indicates that a set of similar lines has been detected among multiple file. This usually means that the code should be refactored to avoid this duplication. Reports ~~~~~~~ :RP0801: Duplication exceptions checker ------------------ Options ~~~~~~~ :overgeneral-exceptions: Exceptions that will emit a warning when being caught. Defaults to "Exception" Default: ``Exception`` Messages ~~~~~~~~ :bad-except-order (E0701): *Bad except clauses order (%s)* Used when except clauses are not in the correct order (from the more specific to the more generic). If you don't fix the order, some exceptions may not be catched by the most specific handler. :raising-bad-type (E0702): *Raising %s while only classes, instances or string are allowed* Used when something which is neither a class, an instance or a string is raised (i.e. a `TypeError` will be raised). :raising-non-exception (E0710): *Raising a new style class which doesn't inherit from BaseException* Used when a new style class which doesn't inherit from BaseException is raised. :notimplemented-raised (E0711): *NotImplemented raised - should raise NotImplementedError* Used when NotImplemented is raised instead of NotImplementedError :catching-non-exception (E0712): *Catching an exception which doesn't inherit from BaseException: %s* Used when a class which doesn't inherit from BaseException is used as an exception in an except clause. :raising-string (W0701): *Raising a string exception* Used when a string exception is raised. :bare-except (W0702): *No exception type(s) specified* Used when an except clause doesn't specify exceptions type to catch. :broad-except (W0703): *Catching too general exception %s* Used when an except catches a too general exception, possibly burying unrelated errors. :pointless-except (W0704): *Except doesn't do anything* Used when an except clause does nothing but "pass" and there is no "else" clause. :nonstandard-exception (W0710): *Exception doesn't inherit from standard "Exception" class* Used when a custom exception class is raised but doesn't inherit from the builtin "Exception" class. :binary-op-exception (W0711): *Exception to catch is the result of a binary "%s" operation* Used when the exception to catch is of the form "except A or B:". If intending to catch multiple, rewrite as "except (A, B):" :unpacking-in-except (W0712): *Implicit unpacking of exceptions is not supported in Python 3* Python3 will not allow implicit unpacking of exceptions in except clauses. See http://www.python.org/dev/peps/pep-3110/ This message can't be emitted when using Python >= 3.0. newstyle checker ---------------- Messages ~~~~~~~~ :slots-on-old-class (E1001): *Use of __slots__ on an old style class* Used when an old style class uses the __slots__ attribute. :super-on-old-class (E1002): *Use of super on an old style class* Used when an old style class uses the super builtin. :bad-super-call (E1003): *Bad first argument %r given to super()* Used when another argument than the current class is given as first argument of the super builtin. :missing-super-argument (E1004): *Missing argument to super()* Used when the super builtin didn't receive an argument on Python 2 :property-on-old-class (W1001): *Use of "property" on an old style class* Used when PyLint detect the use of the builtin "property" on an old style class while this is relying on new style classes features :old-style-class (C1001): *Old-style class defined.* Used when a class is defined that does not inherit from anotherclass and does not inherit explicitly from "object". typecheck checker ----------------- Options ~~~~~~~ :ignore-mixin-members: Tells whether missing members accessed in mixin class should be ignored. A mixin class is detected if its name ends with "mixin" (case insensitive). Default: ``yes`` :ignored-classes: List of classes names for which member attributes should not be checked (useful for classes with attributes dynamically set). Default: ``SQLObject`` :zope: When zope mode is activated, add a predefined set of Zope acquired attributes to generated-members. :generated-members: List of members which are set dynamically and missed by pylint inference system, and so shouldn't trigger E0201 when accessed. Python regular expressions are accepted. Default: ``REQUEST,acl_users,aq_parent`` Messages ~~~~~~~~ :no-member (E1101): *%s %r has no %r member* Used when a variable is accessed for an unexistent member. :not-callable (E1102): *%s is not callable* Used when an object being called has been inferred to a non callable object :maybe-no-member (E1103): *%s %r has no %r member (but some types could not be inferred)* Used when a variable is accessed for an unexistent member, but astroid was not able to interpret all possible types of this variable. :assignment-from-no-return (E1111): *Assigning to function call which doesn't return* Used when an assignment is done on a function call but the inferred function doesn't return anything. :no-value-for-parameter (E1120): *No value passed for parameter %s in function call* Used when a function call passes too few arguments. :too-many-function-args (E1121): *Too many positional arguments for function call* Used when a function call passes too many positional arguments. :duplicate-keyword-arg (E1122): *Duplicate keyword argument %r in function call* Used when a function call passes the same keyword argument multiple times. This message can't be emitted when using Python >= 2.6. :unexpected-keyword-arg (E1123): *Passing unexpected keyword argument %r in function call* Used when a function call passes a keyword argument that doesn't correspond to one of the function's parameter names. :redundant-keyword-arg (E1124): *Parameter %r passed as both positional and keyword argument* Used when a function call would result in assigning multiple values to a function parameter, one value from a positional argument and one from a keyword argument. :missing-kwoa (E1125): *Missing mandatory keyword argument %r* Used when a function call doesn't pass a mandatory keyword-only argument. This message can't be emitted when using Python < 3.0. :assignment-from-none (W1111): *Assigning to function call which only returns None* Used when an assignment is done on a function call but the inferred function returns nothing but None. pylint-1.1.0/doc/output.rst0000664000175000017500000000714712254613024015361 0ustar sytsyt00000000000000 Pylint output ------------- The default format for the output is raw text. You can change this by passing pylint the ``--output-format=`` option. Possible values are: parseable, colorized, msvs (visual studio) and html. Moreover you can customize the exact way information are displayed using the `--msg-template=` option. The `format string` uses the `Python new format syntax`_ and the following fields are available : path relative path to the file abspath absolute path to the file line line number column column number module module name obj object within the module (if any) msg text of the message msg_id the message code (eg. I0011) symbol symbolic name of the message (eg. locally-disabled) C one letter indication of the message category category fullname of the message category For exemple the former (pre 1.0) default format can be obtained with:: pylint --msg-template='{msg_id}:{line:3d},{column}: {obj}: {msg}' A few other examples: * the new default format:: {C}:{line:3d},{column:2d}: {msg} ({symbol}) * Visual Studio compatible format (former 'msvs' output format):: {path}({line}): [{msg_id}{obj}] {msg} * Parseable (Emacs and all, former 'parseable' output format) format:: {path}:{line}: [{msg_id}({symbol}), {obj}] {msg} .. _Python new format syntax: http://docs.python.org/2/library/string.html#formatstrings Source code analysis section '''''''''''''''''''''''''''' For each python module, Pylint will first display a few '*' characters followed by the name of the module. Then, a number of messages with the following format: :: MESSAGE_TYPE: LINE_NUM:[OBJECT:] MESSAGE You can get another output format, useful since it's recognized by most editors or other development tools using the ``--output-format=parseable`` option. The message type can be: * [R]efactor for a "good practice" metric violation * [C]onvention for coding standard violation * [W]arning for stylistic problems, or minor programming issues * [E]rror for important programming issues (i.e. most probably bug) * [F]atal for errors which prevented further processing Sometimes the line of code which caused the error is displayed with a caret pointing to the error. This may be generalized in future versions of Pylint. Example (extracted from a run of Pylint on itself...): :: ************* Module pylint.checkers.format W: 50: Too long line (86/80) W:108: Operator not followed by a space print >>sys.stderr, 'Unable to match %r', line ^ W:141: Too long line (81/80) W: 74:searchall: Unreachable code W:171:FormatChecker.process_tokens: Redefining built-in (type) W:150:FormatChecker.process_tokens: Too many local variables (20/15) W:150:FormatChecker.process_tokens: Too many branches (13/12) Reports section ''''''''''''''' Following the analysis message, Pylint will display a set of reports, each one focusing on a particular aspect of the project, such as number of messages by categories, modules dependencies... For instance, the metrics report displays summaries gathered from the current run. * the number of processed modules * for each module, the percentage of errors and warnings * the total number of errors and warnings * percentage of classes, functions and modules with docstrings, and a comparison from the previous run * percentage of classes, functions and modules with correct name (according to the coding standard), and a comparison from the previous run * a list of external dependencies found in the code, and where they appear Also, a global evaluation for the code is computed. pylint-1.1.0/doc/conf.py0000664000175000017500000001553612254613024014567 0ustar sytsyt00000000000000# -*- coding: utf-8 -*- # # Pylint documentation build configuration file, created by # sphinx-quickstart on Thu Apr 4 20:31:25 2013. # # This file is execfile()d with the current directory set to its containing dir. # # Note that not all possible configuration values are present in this # autogenerated file. # # All configuration values have a default; values that are commented out # serve to show the default. import sys, os # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. #sys.path.insert(0, os.path.abspath('.')) # -- General configuration ----------------------------------------------------- # If your documentation needs a minimal Sphinx version, state it here. #needs_sphinx = '1.0' # Add any Sphinx extension module names here, as strings. They can be extensions # coming with Sphinx (named 'sphinx.ext.*') or your custom ones. extensions = [] # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] # The suffix of source filenames. source_suffix = '.rst' # The encoding of source files. #source_encoding = 'utf-8-sig' # The master toctree document. master_doc = 'index' # General information about the project. project = u'Pylint' copyright = u'2013, Logilab and contributors' # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. # # The short X.Y version. version = '1.0.0' # The full version, including alpha/beta/rc tags. release = '1.0.0' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. #language = None # There are two options for replacing |today|: either, you set today to some # non-false value, then it is used: #today = '' # Else, today_fmt is used as the format for a strftime call. #today_fmt = '%B %d, %Y' # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. exclude_patterns = ['_build'] # The reST default role (used for this markup: `text`) to use for all documents. #default_role = None # If true, '()' will be appended to :func: etc. cross-reference text. #add_function_parentheses = True # If true, the current module name will be prepended to all description # unit titles (such as .. function::). #add_module_names = True # If true, sectionauthor and moduleauthor directives will be shown in the # output. They are ignored by default. #show_authors = False # The name of the Pygments (syntax highlighting) style to use. pygments_style = 'sphinx' # A list of ignored prefixes for module index sorting. #modindex_common_prefix = [] # -- Options for HTML output --------------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. html_theme = 'default' # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. #html_theme_options = {} # Add any paths that contain custom themes here, relative to this directory. #html_theme_path = [] # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". #html_title = None # A shorter title for the navigation bar. Default is the same as html_title. #html_short_title = None # The name of an image file (relative to this directory) to place at the top # of the sidebar. #html_logo = None # The name of an image file (within the static path) to use as favicon of the # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. #html_favicon = None # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ['_static'] # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, # using the given strftime format. #html_last_updated_fmt = '%b %d, %Y' # If true, SmartyPants will be used to convert quotes and dashes to # typographically correct entities. #html_use_smartypants = True # Custom sidebar templates, maps document names to template names. #html_sidebars = {} # Additional templates that should be rendered to pages, maps page names to # template names. #html_additional_pages = {} # If false, no module index is generated. #html_domain_indices = True # If false, no index is generated. #html_use_index = True # If true, the index is split into individual pages for each letter. #html_split_index = False # If true, links to the reST sources are added to the pages. #html_show_sourcelink = True # If true, "Created using Sphinx" is shown in the HTML footer. Default is True. #html_show_sphinx = True # If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. #html_show_copyright = True # If true, an OpenSearch description file will be output, and all pages will # contain a tag referring to it. The value of this option must be the # base URL from which the finished HTML is served. #html_use_opensearch = '' # This is the file name suffix for HTML files (e.g. ".xhtml"). #html_file_suffix = None # Output file base name for HTML help builder. htmlhelp_basename = 'Pylintdoc' # -- Options for LaTeX output -------------------------------------------------- # The paper size ('letter' or 'a4'). #latex_paper_size = 'letter' # The font size ('10pt', '11pt' or '12pt'). #latex_font_size = '10pt' # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, author, documentclass [howto/manual]). latex_documents = [ ('index', 'Pylint.tex', u'Pylint Documentation', u'Logilab and contributors', 'manual'), ] # The name of an image file (relative to this directory) to place at the top of # the title page. #latex_logo = None # For "manual" documents, if this is true, then toplevel headings are parts, # not chapters. #latex_use_parts = False # If true, show page references after internal links. #latex_show_pagerefs = False # If true, show URL addresses after external links. #latex_show_urls = False # Additional stuff for the LaTeX preamble. #latex_preamble = '' # Documents to append as an appendix to all manuals. #latex_appendices = [] # If false, no module index is generated. #latex_domain_indices = True # -- Options for manual page output -------------------------------------------- # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ ('index', 'pylint', u'Pylint Documentation', [u'Logilab and contributors'], 1) ] pylint-1.1.0/doc/_static/0000775000175000017500000000000012255772544014722 5ustar sytsyt00000000000000pylint-1.1.0/doc/_static/vs2003_config.jpeg0000664000175000017500000007614612136155450020056 0ustar sytsyt00000000000000ÿØÿàJFIF``ÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀ‡Œ"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?×øƒñVðž¿m§éöº{ÂöqÌLðnmÇ òô®T|gñÿ—ÿOÿ]ýñ•~$j¦¹y‡ƒÜ¢Z¹Y™·Œ 6zqÁ®KGðÖ›¯3]xžßRÓ®[¶¶Iµ9¤¸¸ºÝ&Õð¦FÖ jô)F—"æ‰Ï7>mž>2øˆÿË–ÿ€§ÿЧŒ~"?òå¤à)ÿâ«SX±¶ºð¿†tùô´¶±ƒT»µ¾•fi¦ír†@vµ€Ý 9#®jü~ ðÜÞ3²ÒßÃZ¥¼?o¸…¥’a¶ž%ŠB ;JŘ2v†ùkKPJî=ÿoS¹ÏŒ>!?òå¤à)ÿâ©Ãâÿˆü¹i?ø øªŸBÒü7¡Øj  !~ ƒK+qw+²DbMÇ(È ÜÙÆìcV®ð÷I›P–Êæ¼¶šþöÕ. IKE‹*¾l‹"¤lH ³ŸC€5‡ïN£Ù™“üRñM§•ö+N‡ÎŒK™d˽F<ƒØŽ*1ñs_?òç¤ÿà1ÿâªŸŽ¦–Þo M ±ènŽŒC+ ÄGB+§Ôëþ*ðF•­_Ü>u¤ÛO4opBË6Ù0NOÞc…ÏÞ9À9£ÙÒI7ÿ€sNö¹Œ>-kçþ\ô¯ü?üUX‹âo‰æ¶šæ=3Ox ÛçJ¶lV=Ç ¸ç'žµjÛšD±XMu¥}—V“K½¸:?™*ù’ÆØˆlf2üÃqÀaœt9ÐþÅÓ¬|=­ZÅkqºµÒ%½²¶%å†W˜ï²Á±‚‰9oLRj‡HÿW°'>æø­®ÿϦ—ÿ€ÇÿЧŠšéÿ—M/ÿ¿úõWÇÚ%†udtè­â·¹Y#òçŽuPØbJÄãŽÝóqÀ®DV£Fk™D—9§kÐø¥®ùtÒÿðÿ¯O5³ÿ.šgþõë†ñUõj_Ê/k>çp>'kgþ]tÏüÿëÓ‡ÄÍhÿË®™ÿ€ßýzâH´}^—ò‡µŸsµµ“ÿ.ºoþõéÃâF²å×MÿÀþ½q‚ž)}^—ò‹ÚϹوÚÁÿ—m;ÿÿúôáñW?òí§à?ÿ^¸áO}^—ò‡µŸs°õsÿ.ÚwþÿõéÃâ¬åÛOÿÀþ½rž)}^—ò‡µŸs®?Õü»iÿøÿ×§ê§þ]ì?ðÿ¯\˜©W¥Ø=¬ûPñÞ¨åÞÃÿÇøÓ‡ŽuCÿ.öø?ƹaO¾¯K°{Y÷:‘ã}Lÿ˽þŠpñ®¤å…þŠæÁígÜèÇ‹õÿ,,¿ïÀ§êþXÙÿß\詟`ö³îtÅwÿóÆÏþü pñU÷üñ³ÿ¿°æðñEñÿ–6Ÿ÷àS‡‰¯Oü²´ÿ¿°…H){ }ƒÚϹ¶ÁígÜÓÅÉÿ–vÿ÷åœ5kƒüÿ÷å³V¤½>ÁígÜÐ¤çø ÿ¿+þñ©N‚ûò¿áYâ¤{}ƒÚϹ£ äóL‘*ÀØ(Ì+Ž ±¾Oùïeÿ~ÿTl?ãþÛþº¯ó®CÆ6:æ¯cÿä[ëëcS#e¼PwŽRU„™8Ú€ÍÀëˈQƒJ(è¢ÜÓ»;GTlË,¶¯æL¢¤–v :¨óô…yĉ^o»9é`0Æxºšé-`‚Ûš\Qé×–7 «Cö´¼ËK$ûÆùLb]Çã‚1Œc—ø‡ÿ#[ÿ×ÿ•c{Æö5ÚV:Ÿˆ¾Õë£þ^ôïûøÿüE{}z°{@>ëƒþ^ôïûøÿüE<|-×ü½iÿ÷ñÿøŠõÊ)}z°{J>ëcþ^´ÿûøÿüE8|1Ö‡ü½iÿ÷ñÿøŠõŠ(úõ`ö<¤|3Ö¿çêÃþþ?ÿN 5‘ÿ/6÷ñÿøšõJ(úõQ{\>kþ^lïãÿñ4áðãXòócÿ}¿ÿ^ŸE]ª?ȧí\ËÍýöÿüM8|<Õ‡ü¼YßoÿÄ×¥ÑG×j‡°æÃáö¬?åâËþûþ&ž<ªùx²ÿ¾Ûÿ‰¯F¢—×j‹Ø@ó±à-PËÅŸýößüM8xTòÞÏþûoþ&½ Š>»T>¯Ïǵ1ÿ-í?ï¶ÿâiÃÀú˜ÿ–öŸ÷Ûñ5ßQG×j‡ÕàpcÁZÿ–öŸ÷Ûñ4áàÍDËk_ûí¿øšî¨£ë•Cêð8àÝDËk_ûé¿øšpð~ ?嵯ýôßüMv´QõÊ¡õx`ðøÿ–Öß÷Óñ4áá;ñÿ-m¿ï¦ÿ ìh£ë•Cêð9á[áÿ-mÿï¦ÿ pð½èÿ–¶ÿ÷Ó…u´RúåPú¼PxfôË[ûèÿ…·T>¯Ðÿ–þgü)ÃBºòÒÌÿ…tQõºõx#D¹Çæž4küq~gü+nŠ>·P>¯iøâüÏøS†•8þ8ÿ3þ¯E[¨W”4ɇñGùŸð§ :aüIùŸð­:)}j }^p°”~gü)ÂÊAüIùš¿EZ¨WLZH;¯çNÎ;­Z¢­T«À¯äÌ£1ËåH>ì‹‚Tö# Ž=Á‘ÿåÏý ·ýþOþ"·è¨•yKr£J1Øç†I!iõ}Fáb•%Xå‘ –S‘Ÿ“Ú¼ïâ Ç‹$Çü«ÙkÆþ#ÈÝ/ýrOåK½Ê–§µ\ÿ­_úæŸú¬ÍcPþÉÑ/õ/+Íû%´“ù{¶ïØ¥±œgqZw?ëWþ¹§þ‚+3XÓÿµ´Ký7Íò¾×m$fÝÛ7©\ã#8ÏLÖe˜IãXæ—o%ªD'Y>ß#ÎØ:,¤©$aÆëy×p /=΃x¯IHÕ™ïÚAÀl'U˜ÍûHGù±‘¹àÓ5Ÿ Yë´eÞšy&¹)ËH^Ùí¸'…!Y{òôäšËO >‹%¥õ½´óCv%k}ÂUeÌ€ò œÊyÜze‰4xx‡Jk[«‘uû«[oµNLm˜ã˃‘Œ†)_¼ @4ýGQ–Úx,ìíÒâþuy#ŽI h ïf}­€ ¨À’ÃŒdŽb/ jºn¨‘JúcjK=½Ê_[$Ìcyf‘JySaHûC®I9ÚÑß§Ôténg‚òÎá-ïàWŽ9$ŒÈ…®õdܹ¢œ‚*9ÆAõèl(õm–÷EwÊ–ÂKˆáLä6)üÎ|­ÉÚMV¾ñ†›mc¨Í,¶qÜ0Y ’(æxC$eÚÍò7Ý$áXà€j;ß_ê p'Ô­ƒ_Ú +ò–ŒÄ ˜òùm‰\ÛÆpp0A.ü#ö–š|÷n!û]åò VágR£$à?^s·§<uüM¥Ä‘4²\Æw¶û9”™#| ¯î—*ØgÚRs€MV¾ñ†›mc¨Í,¶qÜ0Y ’(æxC$eÚÍò7Ý$áXà€j®£àöծ㼿“K¸ºhÞy%ÓQYÙL!ݼ¶Ãœ–Þ vðAšïÂ1_ii§ÏvâµÞ\;"Ånu*2Nõç;zsÁ )¯Ø<–ñ¨¼2ϱýŠmè EÙ˜Ôp_h8$p ]µ»‚ö–Ý÷¢É$Dà™£}Hü+oÞÞjV7·W¶k<|Ùìí¥ å„{üÓû£Àd`Àòx$ÚµŠx¡e¸¸óÜÉ#Ø \•\î© žøÏzšŠ( aEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP^7ñþFéë’*öJñ¿ˆßò7Kÿ\“ùSŽâgµ\ÿ­_úæŸúªw“5½”ó £œÓ f®\ÿ­_úæŸú¬ýOþAWŸõÁÿôH Úu¯‹µ-2ÒþtEŠæ™Ï(`¬Âuæ¬ÿdxÏþyè?ø7ÿ\æ¤5 _Fðþ—¦éwóéº:Œ ¢Á|ÊÒS¾E,Å>W~a•n×5]xø§B×–=R{y/4©•¢m„I}¶"@û ´ŽÛÞEýÛmÌXÁ!³vB¹¯ý‘ã?ùç ÿàDßüEÙ3ÿžzþMÿÄUEÖ¤´Ô®õ;-j=[M°²³¹»» 5Ź–ñ%&H#8U>IP2ìM=g_ñu…Õ¬3_Øé÷ h·qÃw:'<’Ê~Êa‘®|¥&"(í¸æEÚYÍìÿÏ=ÿ&ÿâ(þÈñŸüóÐð"oþ"—Nûü%cÏþÉþкþÍÎ6ÿhbo´ÿ··~ÝÜnó³Ç‘F§ÿßöö¥ÿ ¿öVß5?²ÿµü¿/ìþRnò·ü»¼ß7v>|lÝòùtYÄþÈñŸüóÐð"oþ"ìÿÏ=ÿ&ÿâ+#\ñf­gkªÏk¬ÄÎ/í—KÙû Å;Aq³o˜7à;œ”o;ó&$×ä¼´ñŽŸ}â;¸ìì.-ïŸWmÑí„°_DC7–"Z8ÔLæB3’¸,‚æŸöGŒÿ瞃ÿñÓüZ×n§Ã¦tEwŒ]K¹U‰ HÙ V÷Ú})‡YÕ“Lûeþ½öK+nîÎK± Q‹ x¤¹ÅÝYw3Çeœc  ä»XðeõÆ£âMRâæO9ŽŸl‘Ï´>%º¾X¥ãïEGÊ€§vT@¢È.'öGŒÿ瞃ÿñdxÏþyè?ø7ÿYŸa¶ðÌ>2¿ðö•¦ÙÞC©ÛÛ$éD-àxl̇xB3ÈIVPAb¬¼ž)Ö!Ñ­¤¸ñ¤Ð›‰•$Òî –öôjÀe!¸!ÝÃÑO ³«+Asoû#ÆóÏAÿÀ‰¿øŠ?²ë×pB𽤒ÇpÖ)©Y4LRK01Y|•B@¸‘p#Qò®CÜK ¹ÕÿdxÏþyè?ø7ÿGöGŒÿ瞃ÿñ‘¬ø‹^°¾›JÜö¶—rÂú­ýÄ6ŒäCm*FÒ$‹qóåˆԕˆü­»¤ð…öµª^jsê·±”·xa[HmŒJ®Ö¶ò¹ùÀ“¶«FæÝŸ”!d)dxÏþyè?ø7ÿGöGŒÿ瞃ÿñÜÑE\á¿²ÞØÁžî2òd(wœ2qœs×ò«•‡âõgý„í¿ô1Br¼oâ7üÒÿ×$þUì•ã¿än—þ¹'ò§ÁžÕsþµëšè"³õ?ù^×ÿÐMh\ÿ­_úæŸú¬ýOþAWŸõÁÿôK¨è^"’×FÑô»MRÔg‹G³¸•­ZTY•AóeBNb~€ö®’MwG‹™ªØ§—»~ë„vù›³Ïòeϧ–ÿÝ8áô¿ÞMý‰®A¡èz¦4K }Bs–ÒGæ9d"1Ÿ1y¯Ò¶-üåÿfù°Ø·‘â ½^ãåÏ™æ}£Êo»Ì‹æCÉ鳃òŠÐ“ }wGŽòêÎMVÅ.­"3ÜÂ×À»®r«‚OŠ/u›;;¼ßçÂ×qÙæ<Ë?Âí†î0xÈÅqúÇ‚õKI»Ñã{µYu «k–™÷É%Ôw ãÙ„U7Gæ Äùcå¾^“_Ñæ¹ðìV<‘½µÅ¤°@ìbˆ,Ç&̪¶Ñ¶< )ÇP…æ­¦é÷¶÷º…¥´÷o²Ú9¦Ti› a9c–ÔzÕ{¿h¶Oú¥ ŸO·k«¸PòèbíËcǨ®VÐ5íY5"Ðé°¾µ¦ 6ð ·ahªÓbHÏ”<âVrvŸ/1¸ç";¯ëQ6äv°Ýß^ÛjÊæq%ÊÜ<½ªa¹$0“åŽwʰþ)A¦=ÏØgŠâBÚÂâÒvPð¼ÒD£% )ù&GùIÎpH9Ƨö¶›²åÿ´-6Z£=ÃyˈUYÔ—çå£{£Ƹ;ŸêwËM+M´Ÿa³»˜-´bâ)¥’k?’ƒË 2ïœ5KÂ~ v¯c`ºTñßéK¤FòÊÖÞTH%Øû&Rß¿*Uv¯îÁ±; ]wG¾ÔgÓ¬õ[‹è7yÖÐÜ#ÉÓµ·(9$ž†´+‡Ð4bâêÙ¯-`´±Óõ½Fö2¹š}òÜ¢ƒ@H˜°`í«ÇÍ‘ÜPEPEPEPEPEPEPEPEPEPEPEPEP\æ£þ¼Àÿô6®Ž¹ÍGýxÿÿèmS!£>çR²Òì§žúæ;xŠ„ #c-¸S€OàkþÐV×ü+y#y[lhÎzáFjO²\ÿϼ¿÷Á©ÎÿÂcáïú Áúÿ…ð˜ø{þ‚°~¿á]Ù.çÞ_ûàÑöKŸù÷—þø4À[^èVïgÿ„òCfÊÐÂÐZ„P\ °£i+òpHU¨¯| ¬ö±E£Çoq·Î‰-T$›NWpÛƒƒÈÏJí~Ésÿ>òÿß²\ÿϼ¿÷Á¦/iâ_ XZ¥­å•µºgdP¦Ä\œœ09$þ57ü&>ÿ ¬¯øWEöKŸù÷—þø4}’çþ}åÿ¾ 9ßøL|=ÿAX?_ð¬ÝcÄN¦tË{+ø¦—ûFݶ)çÅvŸd¹ÿŸyïƒQÍÛÇæNn ¹ÆÑ’@'¹$îi€Úñ¿ˆßò7Kÿ\“ùW²WüFÿ‘º_úäŸÊˆî ö«Ÿõ«ÿ\ÓÿAŸ©ÿÈ*óþ¸?þ‚kBçýjÿ×4ÿÐEgêò ¼ÿ®ÿ š]@ÄÕ|b<=á_ [ìZXOŽº¤±ÊñŒ P•3`d,àqÔM%å×t¯±xŽïû.öÊká nñ8­Â…sbŒ%bNìò6‘F…s¢è~ÑõJòÒÁîtË;V¸º¸«„FdA¸ŸžCÇ'ŸN6,´½"ÊâÊÞÑ#Yô»!mbRÍ »•NH&ŸóÖ´$çßU¾½øM¦Ý½Ì‹¨j¶VVíwÈÑKuåÅç ¸åZ]øé€GQÍê~)ñTˆR Ì]yº…Ý•ï•ú5µ¬²£Ç°Œ> P®æäý« (ç Ñl<#u=…‡pÓ¶2ÁHÀ8ûÃcUðÿ…í’ãRÕ|»{pþc=Åëdz­E.)Kùˆ÷19ËØòt Ë… s>ªé«)ŽFeœÀ` (`qˆ8ÐüÔŸ¨xÊ]3Y±±¸°ŽD‘à‚îKWš_³O+[Éã/ùÝk• ^oÞàØêÇF¢Õ^1¦GòÊî¯Ë™–8Y£!¢ y8ȵl]øCÔu“4Þa¼‰áº’¯eY•³’D®Îb3)Ï–EÂ::Û½ºGv‘WRúuû9P@ò0ÿ¸Y—íNÞœP–7W"ðäs·h×d" ,e\‚Ufî¶Ó‚È V zsþÖõ“áï"Éý±«êúxÔ™¯åKhã@ïU1BŠeÚ ž e¸õšT60ivë¦Ú͓̊D“Ìù·ïÉ.X’ʼn%‰$’Nk4ß ßxL6·Q6ÕÖÊêËQxð¹XÄk4neEÛ¸îe\ä@ìüuý£:…¦ÿ†–ÒÞYeŸlë%ÊÂÑíˆ)VQöˆ·àŸànÔð\ó]xÃ×É4òé–Ï$’1fv1)$“É$óšŽ=ÃGXD`K«}§ìP\²F KÖku`…‘Z3)*<¬„ÆÅ…¾™§[XYÇåÚÚÄ›‰ÚŠQ“ÉÀ­X¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(®sQÿ^?àúWG\æ£þ¼Àÿô6©Ñ ?ê®?ë˜ÿЖ¡©¡ÿUqÿ\Çþ„µ H±dñ$0ßÞA%âÚÙH±\ß/Ɉ”WÉù÷í×-·’H‘µ\.«$ñê> Ò¦·›û?Tn`³ºšDF·Ž6U BÄ!Á߀[$¥H€èõ_XiÖš¡ŽâÚâ÷O´’êK%D›Uwr9*G8î*Kÿé–êîá–âÂÙîgµŠEi•w³9Œàr=k”ŸÁ×7ö—ËO.åo'¶šâîä÷ .¶8Hˆóˆ-óò‚ß,óø"{§¾¶‘Ñ`¯$Žé¯'«\ GÙ¡_8Ù9 xò¦€tã^ÑÙ-uk·ŒRÙ…Êbvi ÏÌr@ã½hW«xkPÖnÞêæ `×v‹iq jw J­!݈Âyà‰9FÙ¤ó;+Äÿê4Ïû Ûèb·+Äÿê4Ïû Ûèb„åxßÄoù¥ÿ®Iü«Ù+Æþ#ÈÝ/ýrOåN;ƒ=ªçýjÿ×4ÿÐEgêò ¼ÿ®ÿ šÐ¹ÿZ¿õÍ?ôYúŸü‚¯?ëƒÿè&—P¡Jt‹}V½·»žÎ] ÎÚÝ­m¤¹h$š@R5fQ 1|À`ù 1&cðÊÏáïO¡e}ÞZ@–‹ œ³G›«ÇHYãVHü¸å‰Hݵ@à•Ôš‰¦Ó4o ivðé¢yôËSjz´YÙ”(Hq™ó o®î7ƺ l2ÝOvžx’ilæHØÃ»ÍTrdeØçjpŒ@ Г‹Ñ¯.l>˦‹ï.¬tx­-â¼ÓžÕm®YãŠ_%|ÙAgb1»8 k¨·’ êÚŸÚlnþÏtñ}…ì,%¸XàŽA"F1…q# /ïr¤’àXñ?ˆ¬tÔ6²Åi<ñ¼¸¾“ɶ· ÎÑË,¥X Ý ¿`ãp5qüIg†nµÉ##´´7W6¬ O"˜Ý3òÉ´”žã·4ÍÞÛ\Zðñ³»}kP¸¹šÖímÝ¢ÜîÍÍ8P¢1óëä¿w»Rðmå×…|E*Ã8ŽãûZy,œÜÜ ®>Ìâ=¿>å“vz“±^½3VÔ¡Ñ´kíRádh,­ä¸‘c±TRÄ 3ê*åsúà{MsKÕæ‚{>Ò)ÒHà…¦xå,G(Ac…YS* 7¦Òäq÷6zÆÌBùfÿ–'-†óEw‘Á /3Åhó>ùYTí´.[ÔíU=€ªJàô="X~Üè°Ø]Ϩ&˜Ö“YßÉ0W¸hÕ‡î‹p l®Ò:Ö|vz–¢ú•¥“êRCv=¾¡¨iín_QE‰¡i”¢•}eŒDá¶¶]yé”P—ß[xÛG}b·ÖÓj‘\Þ^b)35Íš¢¼hT‰’ÍY6¡”}„±Üd³°ñ,–öéjRZ^=ňšHn-žä¹” ]åV+ ’Jr$‘Y½2Šò»øüYrãR»»³µžâc:Ú[^Ͳhã‚–ò$ËÔ4«Ï°ÜµÌR}žy4èËYK"mcq…ˆ"YV0»È 1âId,VÆ5ñÜ80-¼2—6ghÅØXˆ3Ä6™™ˆ!‚á¾\ý3ÅÚÔÚF³â9`¹¸±ŽÓNe2<2ÜÁg®dU( ÄìÂn9;×'&±à ê~»Ò`Ñt«O6)– RÂ3öy$@¦E 7 r'hç[šn“¦èÖío¥éö–03—híaX”¶É Îöͦ¿«ÂâÍQ³¯ôا̰Ǻí„H¯ä‰dUa¸aC»œÀÇ:î© ­Þ‡+ù7+åÝ4{ö£chòÁH²J7Ê 5Ì…äFcÃ)M…€="Šóø®b°ñŽ›¤ZÇ®ZȺ‚™þߨ½Ê\BÖ×» nšL)hIÁ xRF@ÁpÓÜøÖ4’öøG‰|…Ž;ÉcCöZͰª°|Ä ‚å»3dÐ(¯?ð›Oe¥ø2xoo®®5›D}B;»Énr¿f2€v&Y>f#18ØG¤é°ÙMeŸh–“&É`XT#®Áq‚6*®`A\>‹áyõ‹{Yn.îàÒn¼9§ÚK&-·` ¼Èßr—Q¶EB‡ç89IsáíûïhÉy³Lƒí>Wî³ä^]Ãó÷ Ûi$äíoµíò†4$¹-ï‚çÒ`Ó†…ΗÄ"ŽŽÂÓt³,Jñ³ ‰i³”'*XŒ×Iý…£ÿÐ*Çþ=>Ãÿéÿÿóǧú¿öz{W?­¦¥âM+û&ïÃ3Æ¿k´’vškym¥Dº‰¤ óîeØȹ \þ³à›¹/¦Š=6vÐ!»”ÚéÖÙ²¨xm¶ºÅr J¡Òç8÷HHv4Þ\¾›á? ]\Ae¾Ÿ§[Ëpmí"TT`ª02y=¹5%Ž…£é‘G†•cir™Ñ ·HÂÈT¡pኒ¹ëƒŽ•ÁßxSP:V³gs¡Éªj—:cÁcªÉ<35¿úÄb2ÈRL´«!Ê Sçn8ÜÀ÷„u›ˆ ¸²»Ôl¡y¥–[e³–KÙd)²Y#º0ñ¬n„€0{P´q€vøOÃvöw6pøJŽÖëoÚ!K(ÂK´åw(lFzT‹á­RÉDÓBX9{5©‹v,˜øù `F9¬xnm"óS¼Ô#‘ï$xcŽâk“pÍÚÛ£ÄZHÛsmRû‘€¸ë(?Lд}ÍþÉÒ¬l<ìyŸd·H·ã8ÎÐ3Œž¾¦´(¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ ç5õãþÿ¡µtuÎj?ëÇüÿCj™ è©aDa#H„]ØSŒò¡õ¥Ýmÿ<¥ÿ¿£ÿ‰©(†Š›u·üò—þþþ&ÖßóÊ_ûú?øš†Š›u·üò—þþþ&ÖßóÊ_ûú?øš†Š›u·üò—þþþ&ÖßóÊ_ûú?øš†Š›u·üò—þþþ&³uI4û{c ^{¸`ËÉ¡ÜpÉÆqÏ_Ê+Æþ#ÈÝ/ýrOå^É^7ñþFéë’*qÜíW?ëWþ¹§þ‚+?SÿUçýpýÖ…ÏúÕÿ®iÿ ŠÏÔÿäyÿ\ÿA4º‘‹ï4m;M²‚÷Jìþ²»‚Ââ2nuH 0‘ Ã)TaåÇ€zM{ưéÚ£qi¨[¥è[yP[Æï¾U ‘b2q<]7бàí6´m3TV“ϸÑì­ÝIBÆ®ÊGÎelóØtï!ðŽ槮ÜjPA$:ŒBÑR<©0ÔHXðDŽ~V*yH¡î•¡&\ž0¼±×¯ÚÿHÔ¢ÓmôË{¹Ôýœ›d¹I&Ù `V58Mç ЃrûÇV|Ww3Ù_}†´ª]ªÆRy`YXoÞeå•Tì8nW2]xjËìšjšµÜÇT²M.{›†Š6*^P›v¢¨rn Ž9ÂðNs÷l5®í§½¾û ÿid´VŒ$β,²¡Ù¼±KÃ3(Þp¼.$“ÄwV÷qC z-å¢,÷'WØë»ĸŠB¬ ×E+‚Ç€gê!ñ —‡áÕä‚ÒDbñIi1k’ í',Ñ‘·Ê\Gæañ³çÐ×ü5eyq6¯>­w¦˜Ò–hÚ/-VÜÌêXJŒ¸fl°à¢0Á\Ô—ž:…˜µ¼×uY¡’&‚ñY¡ò"NUÀŒá™wDˆ#$•R: (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ ç5õãþÿ¡µtuÎj?ëÇüÿCj™ Ãþªãþ¹ý jŽçR²Òì§žúæ;xŠ„ #c-¸S€OàkþÐV×ü*FWñr_Ëý‹vö÷2_’„HÈ’2[Í"¤›y1–EÜ;Œ÷¬[-OXOL¾kÅ>°¶Ï 7jï’•»`<­ÊCíÐ8 >rÇ$+}üWá™^'“Qµv‰·ÆÌ¤”lÈテ#èO­Au¯ø>ù%K»>áfUIVXƒ‡U%”6G HÏBM0 &Ôü‚¿e…î'óm,Ù#buï ÈB6É´Ác“´ý;Ä:½æ¼#’ÁK’îâÒ9ƧtFA¸7šYÉ1“Ê\NH\µ„ñ/…#ŽÞ4¼²T¶Ç¡0"•F>_”‘ÇbEFšÿƒâÔ%Ô#¸ÓÒöUÙ%ÊÄ޼p[#åô 5+˨ô?H—3+Ûy¾C Å‹(˜m?ÃóxîI©¬5½NKëgºk7´¼Ôn¬"Š($‹Ê3aÙËÙ`€«Ëg<`åj’ø_UÕ×S“ÄB;ˆöù$ZÛ9‡o#kI8ç-÷¸$ãgF½ðnˆ^h/íe½•¤i¯¤‰ò—rí¹•FOLcéE€ìëÄÿê4Ïû ÛèbøL|=ÿAX?_ð¬ÝcÄN¦tË{+ø¦—ûFݶ)çÅ ×WüFÿ‘º_úäŸÊ½’¼oâ7üÒÿ×$þTGpgµ\ÿ­_úæŸú¬ýOþAWŸõÁÿôZ?ëWþ¹§þ‚+?SÿUçýpýÒê9k Í¯\[Áo§é²Oÿ¾˜‘ê7.Dú{1¹X‰pF<¢üÝÇI¨ßxªIõ]M“ý>Î+›¸®6Åûä‘ZGµ¸_Þ]Äÿ˦XbQ^W£x³Ç2iVqXøžÎÙvÓì,å¶S$ÏÇ„R!*?Ö Øry=MPÑ|iñã\{K=EáºÔ®!–w’Î= È"Š9÷gj•ò†@ÁÈ<“ÏrÂM«Ý_#Uv=?VÁ³ižW‡fÓ`ÖöÁf–¿@om÷4»Á“xm¥¼ÐNï¼ ¨õŸkÖÓiC[‚ÞÖÒîX_U¿¸†Ñœˆm¥HÚC‘n>|¸Q’±Ÿ•·yÅĈúœlluI®e¬Bt䑨²»q¶"8±Á9¤¢¾[ÿ…½ã¯úä¤üEð·¼uÿAÏü”ƒÿˆ£ê;¯ëäÞ'Ô”WËð·¼uÿAÏü”ƒÿˆ£þ÷Ž¿è9ÿ’ñ}B§uý|ƒÛÄú’Šùoþ÷Ž¿è9ÿ’ñÂÞñ×ý?òRþ"¨T{xŸRQ_-ÿÂÞñ×ý?òRþ"ø[Þ:ÿ çþJAÿÄQõ ×õòoêJ+å¿ø[Þ:ÿ çþJAÿÄQÿ {Ç_ôÿÉH?øŠ>¡Sºþ¾Aíâ}IE|·ÿ {Ç_ôÿÉH?øŠ?áoxëþƒŸù)ÿGÔ*w_×È=¼O©(¯–ÿáoxëþƒŸù)ÿGü-ïÐsÿ% ÿâ(ú…Nëúù·‰õ%òßü-ïÐsÿ% ÿâ(ÿ…½ã¯úä¤üEP©Ý_ öñ>¤¢¾[ÿ…½ã¯úä¤üEð·¼uÿAÏü”ƒÿˆ£ê;¯ëäÞ'Ô”WËð·¼uÿAÏü”ƒÿˆ£þ÷Ž¿è9ÿ’ñ}B§uý|ƒÛÄú’Šùoþ÷Ž¿è9ÿ’ñÂÞñ×ý?òRþ"¨T{xŸRQ_-ÿÂÞñ×ý?òRþ"ø[Þ:ÿ çþJAÿÄQõ ×õòoêJç5õãþÿ¡µ|ýÿ {Ç_ôÿÉH?øŠöÍ*ò}CÃz5íÔžeÅÅŒrÊøs¶I8IéXWÃÊ’NEÓ¨¦ô-¤o+mÏ\(ÍIöKŸù÷—þø4Cþªãþ¹ý jÍÀ¶€Êc’NUBF¹f$€ù5Êj\û%ÏüûËÿ|>Ésÿ>òÿߨ‹ÈšæHT‚#ˆÌÒ†0¹ïgý¥?B IðÊÇ*8`J•`rÁÅZû%ÏüûËÿ|>Ésÿ>òÿߪ ˜ ‰ž2ò.äPã,=@î)vÈ‹’Ñ^GR¸Pwc‚A'å<M\û%ÏüûËÿ|>Ésÿ>òÿߪ ˜ ‰ž2ò.äPã,=@î)Dð•!H;‡!Žóíë@¾Ésÿ>òÿߣš7·Ì$Üs£$€OrHÜÔÜÁq»Èž9võØá±ùVG‰ÿÔiŸö¶ÿÐÅnWüFÿ‘º_úäŸÊ½’¼oâ7üÒÿ×$þTã¸3Ú®Ö¯ýsOýV~§ÿ «Ïúàÿú ­ Ÿõ«ÿ\ÓÿAZh’xd†MÛ$R­´ààŒRÄ-`ñU¿†í­´¿jEÍÜ÷Kt4¯7 "D¢¡do‘Žä#øHÇ[Üð7G¿ÑluK]ÅKt¤«Ë£´EXÛ]C‚·ž3œôÝÇ0I¥kW^ƒE›Ã>!‰¡Jšc¸iR[¦UÁÆ‹‘–ê Ÿ”ç5ï¿ÚÒzËÿ}/ÿGö´ž²ÿßKÿÄÓúï[ ØyŸ.ÂâŸúµü—ÿ‰£þÏÿе¬à ¿üM}Gý­'¬¿÷Òÿñ4kIë/ýô¿üM_ö‹ìOÕ×såÏøC®»Ÿ.ÂâŸúµü—ÿ‰£þÏÿе¬à ¿üM}Gý­'¬¿÷Òÿñ4kIë/ýô¿üMÚ/°}]w>\ÿ„3Å?ô-kø/ÿGü!ž)ÿ¡kXÿÀøšúûZOYï¥ÿâhþÖ“Ö_ûéøš?´_`úºî|¹ÿgŠèZÖ?ð_þ&øC®»Ÿ.ÂâŸúµü—ÿ‰£þÏÿе¬à ¿üM}Gý­'¬¿÷Òÿñ4kIë/ýô¿üMÚ/°}]w>\ÿ„3Å?ô-kø/ÿGü!ž)ÿ¡kXÿÀøšúûZOYï¥ÿâhþÖ“Ö_ûéøš?´_`úºî|¹ÿgŠèZÖ?ð_þ&øC$’7R¬Œ ô ö­ïíi=eÿ¾—ÿ‰ªw‰ÝX)©É$’}­sâ1N²I£Jt¹Cþªãþ¹ý j»&ù ä“Å!'Ñ]Xþ‚¢¼[Ù-^+¨í¥|$ù˜\ç¸s9ç¿ÆWöwˆè`ƒÿãÿ‹®SST[*ü°»bRÛýöóbp½8]±…öph’ÑåžáVâi‹I,lÇj2¢¸€Nîcp^¸¬¯ìïÿÐÁþ ÇÿGöwˆè`ƒÿãÿ‹§p5ÒÙ>Ù#ˆâXXäÚÒË…T Dk…ll±G§ ŽãÏœÄÖ견ct¬ÙR¥ùÀSŸ¿ê:VGöwˆè`ƒÿãÿ‹£û;Ä?ô0Aÿ‚ñÿÅÑp5â·òöÛ£ ´Ya‘‹“½Äk ´ õ}ÈÆãéÍ{hv}ÌWÌ”¾-fÁHñåòã?»^z~ññT?³¼CÿCø/ü]ÙÞ!ÿ¡‚üþ.‹…¨áx¾Ì’¸?f²m9áÿuœdq÷±|Oþ£Lÿ°·þ†(þÎñý à¼ñuº­w-·Ûu¨¦Š ˆçض[ (Àã;øéŠè+Æþ#ÈÝ/ýrOå^É^7ñþFéë’*#¸3Ú®Ö¯ýsOýT55ÏúÕÿ®iÿ Š†SÑ4ï‘ Èªía¹T’#°%[Cé@ÇÑEQEQEQEQEQEQYÂMgÆ1i§R¾³€iï9û,Ia"¨ÎAöô«º‡}¨Ï§YøãP¸¾ƒwm¡ÉÓµ·(LŒÏCO”W/ÑL“ÁV°¼)/Š5´yŸdJ×1í´¶÷|ªÇ°'µø*Ög™"ñF¶ï ì•Væ"Q¶†Ã~”àö ÷£”.>Šd~ µ™æH¼Q­»Âû%U¹ˆ”m¡°ß»àíe8=ˆ=êOø@£ÿ¡^ÿ¿ñÿñº9BâQKÿô1ëß÷þ?þ7Gü QÿÐǯßøÿøÝ¡q(¥ÿ„ ?úõïûÿÿ£þ(ÿèc׿ïüünŽP¸”RÿÂý z÷ýÿÿÑÿô1ëß÷þ?þ7G(\J)áþ†={þÿÇÿÆèÿ„ ?úõïûÿÿ£”.%¿ðGÿC½ÿãÿãtÂý z÷ýÿÿÑÊŠ_ø@£ÿ¡^ÿ¿ñÿñº?áþ†={þÿÇÿÆèå ‰E/ü QÿÐǯßøÿøÝðGÿC½ÿãÿãtr…Ä¢—þ(ÿèc׿ïüünø@£ÿ¡^ÿ¿ñÿñº9BâQKÿô1ëß÷þ?þ7Gü QÿÐǯßøÿøÝ¡q(¥ÿ„ ?úõïûÿÿ£þ(ÿèc׿ïüünŽP¸”RÿÂý z÷ýÿÿÑÿô1ëß÷þ?þ7G(\J)áþ†={þÿÇÿÆèÿ„ ?úõïûÿÿ£”.%¿ðGÿC½ÿãÿãu$~EYœj:…é’>>×"°L2ýЪ:羞NP¹xßÄoù¥ÿ®Iü«Ù+Æþ#ÈÝ/ýrOåDw{UÏúÕÿ®iÿ Š­41\A$Æ’Ã"”xÝC+) ƒÔVnÖ¯ýsOýUi¢Yà’.E*J9FŒpÀ‚¸9€óý2Þ×ÁóC¥é–É=åþ«nV Uß Xï„j03‘€£ã pH6¯õ[‹]JY´½j¨f¶³Ž]ViâDDßzw6~uXòPƒœ}âíì4k]:vš oŠí"âþy×îÈäÇ\gó­ .?¡_Ý\®˜/5dš[k†òጲ\*ÈŠ²‰ ®p¤r+ù›”mº ( aEPEPEPEPEP]#þJ:Ø"_ý3J𾥩ÚÌš…ü–v‘jzœÖ‰mnÐÝFÒËs“Í.A&g\"òPä€wZ°µû?‰?µÚx­›Zˆ›vN][v@?ÝñíŽzíhýbÿ¾›ÿ‰«MÑÄ¥î§s&ƒâmM'š¨*ôØ&¸‰cKK˜Ìé†b²M#mqÑ ÁÍX†Êû^ñµÇÚß\‹F>h6Osf¼Áa°¥äÜ|§ø¼Î2 uP_ÚÚÛÅoo´0D#Ž=ʨ ``8ÅIý­¬_÷Óñ4]ŽWÀ0^­åÕî·¥±¨[Û\¿˜²¤ >ËlŽJÝ,¾j8Ú@Ón+¼¬ßíhýbÿ¾›ÿ‰£ûZ?X¿ï¦ÿâhº TVoö´~±ßMÿÄÑý­¬_÷Óñ4]*+7ûZ?X¿ï¦ÿâhþÖÖ/ûé¿øš.‚Æ•›ý­¬_÷Óñ4kGëýôßüMAcJŠÍþÖÖ/ûé¿øš?µ£õ‹þúoþ&‹ ±¥EfÿkGëýôßüMÚÑúÅÿ}7ÿEÐXÒ¢³µ£õ‹þúoþ&íhýbÿ¾›ÿ‰¢è,iQY¿ÚÑúÅÿ}7ÿGö´~±ßMÿÄÑt4¨¬ßíhýbÿ¾›ÿ‰£ûZ?X¿ï¦ÿâhº TVoö´~±ßMÿÄÑý­¬_÷Óñ4]*+7ûZ?X¿ï¦ÿâhþÖÖ/ûé¿øš.‚Æ•›ý­¬_÷Óñ4kGëýôßüMAcJŠÍþÖÖ/ûé¿øš?µ£õ‹þúoþ&‹ ±¥Yº·ú£ÿ\Ïþ„”kGëýôßüMV½½Žâ&ù“;v€¥ŽrÊ{¨ô¤Ú°X˯øÿ#t¿õÉ?•{%xßÄoù¥ÿ®Iü©Gq³Ú®Ö¯ýsOýT55ÏúÕÿ®iÿ ŠÏÔ¯âÒô»½Buv†ÖÕ,UT±ÆqÎ -QX­w©é°É{«Og$jGkinÂA+ºª ‘Ÿ ’ÁrU$´fªÍã+Kg1ϧßG$K,—hDdÚ$b6f|>mš6Âo88ÆAÒQ\ÜÞ2´¶sú}ôrD²Év„FM¢F#fgÃá†Ù£l&óƒŒdR]øºÒÇM{»›i¡x®E´ÖóOoÄå7€Yär¥OÊÄüÞÇÏÛx¾ÊîmÐZ^=™ _oÚ‚-Ó$mÚ[ÌçÍŒ}Î s€ SÅ3\jM…ñÓ[K¹½Œšð+BQ£PŲU΂“¼ddpÕQE (¢Š(¢Š(¢ŠÌºÔoWWM7OÒ¤¾ 7$É0S÷ˆHïÞŸ»Äßô)ÏÿÐñU6‘ÿ%?ì/þŽŽ¶mõÍRú JîÇH‚k[´Åj¦ód×ÂíB¥6¢³£ÛÏI$ IÙ»Äßô)ÏÿÐñTnñ7ý sÿàtüU?Ä:†¥aw­ZZO$³›Ý"òß|íªÍp2Bm݉çÎa´à,Ö.5¢Ûh¶-©Åçý©eÔ]!O-mÜlq gÊÝGÕ0ç‚]\¡»Äßô)ÏÿÐñTnñ7ý sÿàtüUV¼ñMÃiš•í•åô0ßdj6ò¬BY­ º‘ h’"'nËJp mKͤBdÖÚìé,÷ÛR½€Ã;¬p¬¤I Ƥ–ëbü°/º–,‚åMÞ&ÿ¡NüƒÿŠ£w‰¿èSŸÿ ÿ⪵޿⛋=UžÒ fƒUÓ"Ž#|Uâ’CdÏnÅ# ÆL²&I;ˆÚF+r?êWí£Ûé6‡Z‰åÅ%ó-ºª$JÊ",Ç0ðc^wóò‚Å\ÌÝâoúçÿÀè?øª7x›þ…9ÿð:þ*­éþ;›Rþ*5ÑMÅ¿ž÷D\n¹ŽŒùA6à”÷œlX.¹w{y ¾½%ŸC÷kHn¨dµP9 ¾h&C VòÆ\¬«E\ÌÝâoúçÿÀè?øª7x›þ…9ÿð:þ*Ÿ¤jº˜×tå¾¹»“·SÛ]yk2—¶K¥y¼¯Ý3¯”Ávq²eÉ ß]ÕtY˜k’êRjs"¤rý™læ•æŠмjeX–I£½ùö>v»‚È.3w‰¿èSŸÿ ÿâ¨ÝâoúçÿÀè?øª·«ø¯W±·Ö-æÒcŠ}?GmF{‹[àëDáU Å–raR2›ylýÐ$§®xßT¶ðö«x¶ZF´ml.b¹ódÛ$ä3ÆÑ…U?gs÷›£Adw‰¿èSŸÿ ÿâ¨ÝâoúçÿÀè?øª×ŸÄ÷öZ¶¦ßiö6³\lófšöE€—ªÇ†K6w–vF7 •ÏÒ5ýb;G³´ƒQ¾X¯!šæúùáó>Ç2[´„ˆä%¤,§#'­Ar Þ&ÿ¡NüƒÿŠ£w‰¿èSŸÿ ÿâ«NËÇêÕ`±O|öog’ÒÛÏ™æ’U*±Üü™Éò8?:çŸðw‹µ«Í?KÓ-m#ÔoÊ9d›P¿1 %¥“±av%šë?6NCØ!Ad.îñ7ý sÿàtüU¼MÿBœÿøÿZ~ñ÷ˆï5;¥Š?ìrð½£É&ÙãZÛÊ#1…Æ?xÇvòrqŒj¼:ö¥§ø‹^3ÛÇ>’ºÅµ ”Ý·› Kª*¤E6ìß bw¼çðÅ\©»Äßô)ÏÿÐñTnñ7ý sÿàtüUE©xþöY$³Ó­#YÞâݬ.A—Ⱥ„ÞAeä€.f\4^hà [Ð 35¼MqqÎP7.ªØä 3ß>‚‹ ¹Ânñ7ý sÿàtüU¼MÿBœÿøÿ]ýYÎw‰¿èSŸÿ ÿâ¨ÝâoúçÿÀè?øªïè¢È.p¼MÿBœÿøÿSZ~[¸cºðô–;…yÞî' ë…$ŸóÓ­w5 Ïú¥ÿ®‰ÿ¡ ,‚ç7hÑ<’;(Rå\ç9÷”»m¿ç¬¿÷èñT/üyËÿ]ù5CP2m¶ßóÖ_ûô?øª¡}¥öŸh‚IòG@YB„ ŒÄõ9è=ý¹³Xz¿üŒ¾ÿ®³ÿè–  Êñ¿ˆßò7Kÿ\“ùW²WüFÿ‘º_úäŸÊœw{UÏúÕÿ®iÿ Š§yŸcq‘ ÆøÙ|™Î#“#[ƒòž‡ƒÇcW.Ö¯ýsOýT4€ä­´]zy ¶§6tó‚€j"g·d`ñºæÙYÙYWýc¶yÝ»½Ù)nL"{Y÷3.íÐ,*ºgêqŽ0È|' ,z¦¢±Ge-ª+Æ¿e‰ö«`·-0X±ã¹æº (¢Š(QEQEQEWJù> ¬ÏòĺS¡s†2¡>§ò5·&… Ký ®ÍäêI ͸¾BË'ß" û˜ä–P–cœ“šI<±.Øåtp¬E;íw?óñ/ýöi© Äú¾‡¥ëZ”wWj û9Šh¡™¢iYeŽX_ÌF lŽWÓÌl“›F‡¦ÜGslWí¤‰çËtòÈÂCmîìKŸÝFbHÀªk¹ÿŸ‰ï³GÚîçâ_ûìÓæ‡Ÿ è«u¦ùSE¢[-ªÈ~*X¤·f}Ù>Q°Ö7©Î†«omª}Š7¾‰m໎æX²åå‘sWß#®Í§†5™ö»Ÿùø—þû4}®çþ~%ÿ¾ÍÁbýÆ‘¡Ý^½Ü¥|É)VéÕãttv@ÁKƒ Äg ;x¨îô-òy®š+‰¥óž{ké ±DB7Æá‚•Š<¨;IE$dfª}®çþ~%ÿ¾Ík¹ÿŸ‰ï³G0X¾š?‡â·’Þ(m¢‚Kˆ.LqɵDˆÄDp¡D1 £åéÉÍ;? xrÆÌÙÃ-ɵò–†]VâT‰T‚¦5iFRªU— ¸"™ö»Ÿùø—þû4}®çþ~%ÿ¾ÍÁbyt=-l ¶²»[y"½†óí2LÓLÌŽ»³#±rZ0bÉc„m¼¨ÛD~ðò$Êï-Á‘6y—zŒ×Ü÷o#–ŒîTl¡(‡ª©}®çþ~%ÿ¾Ík¹ÿŸ‰ï³G0X¶º€,ï-]šhïm>Åpg¾’W’Èv—g-ÿ-¤ç9çÀ§¦øWC³7/w:ß¼÷S¹¸wDòHÄ,,æ5;d(X($þñ¿k¹ÿŸ‰ï³GÚîçâ_ûìÑÌ-¦‡¢,¶²=ÍÌÿeÁ.u9æBC Èòv r# ‚6®2åðŽŸqâÔfÕåK}÷µ¥Ô–¾Y˜[îÃÅ"œÜŽŒÓy6~×sÿ?ÿßfµÜÿÏÄ¿÷Ù£˜,_ƒO°·Öb½ŽâÙ ¶²vvÑ…E·RÙ“8!‚B1—ÊãïKÐ|;¢ÏÚ|qC$Qy(~Ð̈́٠xåðÛÂ?à¤æ§Úîçâ_ûìÑö»Ÿùø—þû4s‰ãð߆ᲚÊ$T´šËìÀ·’xvþeÝ‚ûWÌ?>°*FдÖ$Õ™®%•'‘ ô†‘U\ÿË,&Ü‚ªz€j§Úîçâ_ûìÑö»Ÿùø—þû4s‡§…|0’´Xæ# h×ò²@…‘ñ Û8Êùavì]¸À­È%´¶·Š¹R‘ E2N]ˆ³Xû’IïXk¹ÿŸ‰ï³GÚîçâ_ûìÑÌ:?µÛÏÄ_÷Ø£ívßóñýö+œû]ÏüüKÿ}š>×sÿ?ÿßfŽ`±Ñý®Ûþ~"ÿ¾Åk¶ÿŸˆ¿ï±\çÚîçâ_ûìÑö»Ÿùø—þû4sŽívßóñýö*9î tUI£f2&`OÞö»Ÿùø—þû4}®çþ~%ÿ¾ÍÁb7ž{ iR52 Øœ7­`]ºË­Ú_ÛêÚ\i m,±—«2— ÂUQ‰Œ©Áø­K½:ÊÿgÛ,íîvgo¾ÜõÆGVÿ„{Dÿ >Ÿÿ€Éþ#"µB³ûÙç¶O±[[ôŒìˆìÊòyÿVœœž=ÍUÔn`¸ñ.äO»e›;6?rÞ•þíþ€úþ'øT¶ú6—i:Ïm¦ÙÃ*çl‘ÀªÃ#=(íxßÄoù¥ÿ®Iü«Ù+Æþ#ÈÝ/ýrOåN;ƒ=ªçýjÿ×4ÿÐECS\ÿ­_úæŸú¬ýJê[-.îî gºšD·Lî••I 0$Œt=i%µå­ç›ö[˜gòd0Ëå8mŽ:«c£ ò55yÄ:_‰4”Kn£²Þi“<„ÍÌbiŸt@o‘%$–Ý‘ݸ.êæ[H$²êé*j61X2Kpa6ÅàV2Ÿ-˜±˜0–9AZ,uEyÜ’ê÷vºig‚Ò5'Tž<Éö‹Es怢Xü»ŽpsO¸‡ÄÛ:Ùɨ©—íI3ËæË¶(¯"HÊÛƒ}œÈFÂO½’øj, Óh¥yR9Ú&Ù"«Q°Ðáúë\F“¦_^ßYÁ{y«Ë§ˆî«>snÊe<™±æ6~öЦªéÐjLÔn¯æÕ,µ{è-gyRÖâT(a·I?ud.²)Û¶E#E€ôJ+ŸÐŒÅtÃ=®£jæÚàùOs$ñæ& ¼Œ P\1Šè(QEQEQEŽ4‹-oÇQZjÉ$ ¦<¡gæ *AèÇó©ÓDð ø¢o}ÝN(£—ÉmN@ϼ9Ú«æî,7Ž”÷©ôù(éÿ`‰ôtus¢j×Þ-ñv¤ÛÏgk}¥4r­ûÄaýó^ñ˜ËH7LûÆîŠÓ"QkbYp[|=[{yæµÔ¡ŽâÊ]F'f¼ekT™w)*Ý­´Ãz¡˜ é?á^xgþ|gÿÀéÿøºÇÖâ½ñ“&™§N¶·ÞÔ,šâwVÚyü°#•C— +€§k9Ãc?Yð}Æ¥uk-ž‡}§Z E†ÊÎÓìÿgÎ%”¼¥˜IäîÝo·Üÿ)$nUÄuð¯<3ÿ>3ÿàtÿü]cÙhž¿ÔZÆ {ï8K$¥{Øã’HËD‘ˆG`QøRN@HÏ»ð=é¶Ô%¶Ò [é¢ÖgITÆ®×osºÊ]ÙÿX¨Ï±ó”ÜFW8­‹-3V¹´m}*{HS[“P7ÒËFñ‹æ¹@Š®\³ ƒ ª,rJ…`ûž°ÐäÖ%Ó¯¾ÉBy3sp\fFpÃjåŠãw[×½Ñ<§x†ËC¼ýÅõäM,)&§"稫ƒ.w1c´ÎÇô¨ü¤7‚ü={ªëV-äVö±F‰"ÈîÎÚ3Jn÷š2˜.U:€•—¥èš·‡üiá>ÊÞxç‹Jòïeg‰­.6 (æuçÍ"*ŽçHŽ6™ ÔG~Ño XêCíW²ØÛ:Éw"Í,d‡F;eeöÿ«vQºµ,<á ON¶¿³µžK[¨’h_í—r0N ädÖ³ô¨¯WKðU„t÷hWeÔZ7D+i-÷î¬U¼Å‘p2c!° PqÛÀ× áí Nmt·Óâx/m¬b°¶\ì…EÐYó) ÞÛeù‡ Ãþç†çÆüŸÿ‹¬vÐü ºÄšZØj²]E*C!…/äŽ7eV¤\ ù]IËp8ªö^”êQI©ép^yš„Ky=Ë¥ÃÜZ¦œ‰‰€2/ÚQN Œ²‡Ú:‹ž ð•ì½î¾Ú’jEííÕ% #%º9uI69ó@K»äb€$Òü)á ]¯¾|Ÿe•":æâ2KE£å/¸|²¨!€ ‚1ÅW}áüsëpºÎ$Ñ"Yµö›¯Ü£!½ó| Ÿ—?sv¾Ö—J²‡RӮ嶉#YZýŠfiE•”AÊÜæ,+C:gïÃnU˜Ö†«àÝ}<3®5¥¼—Z´ˆmcY.ÖF»‚[x%Ì­´dK“qUfòq…h¬ÿ…yáŸùñŸÿ§ÿâèÿ…yáŸùñŸÿ§ÿâëñG…|A©jºÅ®™?Úî⽂Yàq[ÏZÌ!~.·7%©#åT#CPð^£×ãÃöi’=ÜÐÚ\@ˆÕôöP §Ì±ý¬ïØßùñžhSQðw„ôÄ·’ãO»ò¦¸ŽÜÈ·³‘HÛP°ó3‚åW€pX€ ÓDð ø¢o}ÝN(£—ÉmN@ϼ9Ú«æî,7Ž”÷¬øôÒ¼%¯éÑYßY¶·éÖ–·_dBg‘] ‚+E+†wË9H˜•1º½Î‰«_x·ÅÚ>“o=­ö”ÑÊ·ï‡÷ÍxCÆc- Ý3ïº+L‰@Ámðõmíçš×R†;‹)ušñ•­Peܤ¨v¶ÒC è †`+¤ÿ…yáŸùñŸÿ§ÿâë[Š÷Æ>Lšf:ÚßxP²k‰Þ5[içòÀŽU\24,®¬@ç ŒýgÁ÷•Õ¬¶zöh-+;O°GýŸ8–Rò–a'“»tm¾ßsü¤‘¹TPQÿ óÃ?óã?þOÿÅÖ=ž‡àmCQk+[ VIY!2l¿‡Œ²¸óOîø*ÃïrF5Ÿwà{Óm¨Km¤@·ÓE¬Î’©]®Þçu”»³þ±QŸcç)¸Œ®qZš&™>Ÿ6« ›¡uq~ÎZú)-&ŠI¤‘U`{ ²•_õc–;ˆ\¸ðW„-'´†{YÒK¹L0¶\î¤#‡ãåF<úz⣰ðw„õ¼Ž=>í%³¸6óF÷³å[j°9C#£ ŒÁ û¯ ]É ©Õt8õ–µ½[™‘§Kƒu“4q¦r¹0´£ïí “&Gu&“þ™âÝsS‹›UŠßOWìòBÓ<…OB Î9Èxä ¼€Wÿ…yáŸùñŸÿ§ÿâèÿ…yáŸùñŸÿ§ÿâ먢€9øWžÿŸÿð:þ.Ÿ‚ô 2æË[9x¥B…î¥pà>ë1¯¥tµ Ïú¥ÿ®‰ÿ¡ 碑ⴕ£vC½Tã³TI¨É+Ê‘Þ3´M²EYrQ°ž¡´õÿ9ë¢&®#LðƧÄ­sÄR^¼+qÚ¡\m‰çô A£g= ™Fߌ/.‡„5L\ÍÌOÎy‚?*Ö¬?ÿÈ£©×/ê+rŽ€ã¿än—þ¹'ò¯d¯øÿ#t¿õÉ?•8î ö«Ÿõ«ÿ\ÓÿA Msþµëšè"¡¤7vv·ö¯kym Í»ã|S tlŒƒÁäøU[}G´ž í´›f·Rɲ+D¤’B8³tþñõ­ (QEQEQEQEQEQE–vðÛkŸÚÆW cl©å‚»K$òr£õëž6¶?ÚÿÈ?ýr—Zêêé¦éúT—Ó´à„™#† ~ñ©ûÓ÷x›þ…9ÿð:þ*š¸´:íö¿òÿgGöÇû_ùÿ³®_w‰¿èSŸÿ ÿâ¨ÝâoúçÿÀè?øªz‹C¨þØÿkÿ ÿötlµÿû:å÷x›þ…9ÿð:þ*Þ&ÿ¡NüƒÿŠ£PÐê?¶?ÚÿÈ?ýÛíäþι}Þ&ÿ¡NüƒÿŠ£w‰¿èSŸÿ ÿâ¨Ô4:íö¿òÿgGöÇû_ùÿ³®_w‰¿èSŸÿ ÿâ¨ÝâoúçÿÀè?øª5 £ûcý¯üƒÿÙÑý±þ×þAÿìë—ÝâoúçÿÀè?øª7x›þ…9ÿð:þ*CC¨þØÿkÿ ÿötlµÿû:å÷x›þ…9ÿð:þ*Þ&ÿ¡NüƒÿŠ£PÐê?¶?ÚÿÈ?ýÛíäþι}Þ&ÿ¡NüƒÿŠ£w‰¿èSŸÿ ÿâ¨Ô4:íö¿òÿgGöÇû_ùÿ³®_w‰¿èSŸÿ ÿâ¨ÝâoúçÿÀè?øª5 £ûcý¯üƒÿÙÑý±þ×þAÿìë—ÝâoúçÿÀè?øª7x›þ…9ÿð:þ*CC¨þØÿkÿ ÿötlµÿû:å÷x›þ…9ÿð:þ*Þ&ÿ¡NüƒÿŠ£PÐê?¶?ÚÿÈ?ýÛíäþι}Þ&ÿ¡NüƒÿŠ£w‰¿èSŸÿ ÿâ¨Ô4:íö¿òÿgGöÇû_ùÿ³®_w‰¿èSŸÿ ÿâ¨ÝâoúçÿÀè?øª5 £ûcý¯üƒÿÙÓ[UWÀv;C8‹‚÷½«™ÝâoúçÿÀè?øªšÔkòÝÃׇ¤´Ü+Î÷q8@O\)$ÿžhÔ4 ùu5¶i°Ú;3†v¹•”ÀTç9öÆ;çŒÝþ*ÿž7ýþ—ÿ‰®†8Ñ¢y$vP¤/ʹÎsî=)vÛÏYïÐÿâªFrZ¥—‰µ]2âÆXô„I“iešLürºz¯¬_Úé:=Õù3KäF\G°.ãØgÙ­nüÏ-~Õßµ_j »|ÇÁM§žsŠ ðÜ)ýÍõååä2+‰¦òÁ!RTT!Whó¤=3“É @îÚÍuªÇ7Ú$¹–Ý¢ oË—qœ„#a¿›÷…]³¹ûe½×“4tk'•:í‘23µ‡fÁµJÓJòµÝCS•!ß6ÈáòÇD »™¸ûì±Ä?†®ÙÛ}ŽÆÞ×Κ&5Í·HøÜÇ»dŸZšŠ( aEP]#þJ:Ø"_ýw5Ãi_'Ä™þX—Jt.xPÆT gÔàþF»?µÛÏÄ_÷Ø«[ɨ¨~×mÿ?ßbµÛÏÄ_÷ئ"j*µÛÏÄ_÷Ø£ívßóñýö(j*µÛÏÄ_÷Ø£ívßóñýö(j*µÛÏÄ_÷Ø£ívßóñýö(j*µÛÏÄ_÷Ø£ívßóñýö(j*µÛÏÄ_÷Ø£ívßóñýö(j*µÛÏÄ_÷Ø£ívßóñýö(j*µÛÏÄ_÷Ø£ívßóñýö(j*µÛÏÄ_÷Ø£ívßóñýö(j*µÛÏÄ_÷Ø£ívßóñýö(j*µÛÏÄ_÷Ø£ívßóñýö(j*µÛÏÄ_÷Ø£ívßóñýö(j†çýRÿ×DÿÐ…k¶ÿŸˆ¿ï±QÏq¢ªM1‘0~ð  ÿ9ë¢&®>ÃÆKqñUð¤öÎ$·T–Þhв²ј?÷H-ÁèrºÇž{ iR52 Øœ7­dÛÖòòò ¬Òæñ•®%®é ¨UÉÏ@§SÔœæQ_Æ?ò(ê_õËúŠÜ®sÅ·Ö“xSQŽ+¨Ì\*È <ŽÕÑÑмoâ7üÒÿ×$þUì•ã¿än—þ¹'ò§ÁžÕsþµëšè"¡©®Ö¯ýsOýT4€(¢ŠQEQEQEQEQEQEH“ËíŽWA× ÄS¾×sÿ?ÿßf¡¢€&û]ÏüüKÿ}š>×sÿ?ÿßf¡¢€&û]ÏüüKÿ}š>×sÿ?ÿßf¡¢€&û]ÏüüKÿ}š>×sÿ?ÿßf¡¢€&û]ÏüüKÿ}š>×sÿ?ÿßf¡¢€&û]ÏüüKÿ}š>×sÿ?ÿßf¡¢€&û]ÏüüKÿ}š>×sÿ?ÿßf¡¢€&û]ÏüüKÿ}š>×sÿ?ÿßf¡¢€&û]ÏüüKÿ}š>×sÿ?ÿßf¡¢€&û]ÏüüKÿ}š>×sÿ?ÿßf¡¢€&û]ÏüüKÿ}š>×sÿ?ÿßf¡¢€&û]ÏüüKÿ}š>×sÿ?ÿßf¡¢€&û]ÏüüKÿ}š>×sÿ?ÿßf¡¢€&û]ÏüüKÿ}š>×sÿ?ÿßf¡¢€+]éÖWû>Ùgos³;|è•öç®28è*·ü#Ú'ýôÿüOð­*(7þíþ€úþ'øV•P^7ñþFéë’*öJñ¿ˆßò7Kÿ\“ùSŽâgµ\ÿ­_úæŸúª—3}žÖiöîòÑŸnqœ Õ»Ÿõ«ÿ\ÓÿAŸ©ÿÈ*óþ¸?þ‚iNÒ÷ÄÖp]Ûx^w‚xÖXßí Êà à¶G´,%šëL‚öhR?æEI–PS«RT‚#ñÃ’o ø·W·±ÑψÒÓÂÚ³_Ç·6¾\)Û¦z 0 ì0ùDܶ––6ÖV*ÒØaPÅ‚¢ÆŠI$à rjšBE¶Zù>wÚaò¼Ï'~ñûömÏ÷·ü¸ëž:ÔÕÅí›ìØ¿d¼ûoö×Ú¿ãÚO+ÊûwŸ»ÍÛåÿ«ç³Ÿ—ïqY›u·Ó]RmDÅö˜þר¼W¡ç]’¶×rÉÅŸ$í;»*²,Øg£Õ[ JÃT§Óïm®áVØd·•dPØó‚?:Â:ß‚b¶‘溟ÌGuš?)çf c*ìÇæˆlÄ“ŸÞKb®§%Þ¥{«¥C} Ë]·’ 'Qs „`ÂF³vçÍ*»‹0qš% 2 ™Õc,72‚ w²çê=iõÂÀ%Ô<`º­ÄZ¸ÓÖæX­XÅqVhìö‚€Žlî^AÏQœímB}IºÓ¤Ö¥_²[O©½Ã\1wÛ¹1ùœ°1‹œˆ²0r‚‹éh–t€È‚gVuŒ°ÜÊÜËŸ¨õ§× —Pñ‚ê·jãO[™bµcÄEY£³Ú DZ9³¸yy=Ftõ»mv]m£ÓfÙöÑÈŒìâ8ÞvÚÅzy$Ž­J8!h¤DÓ¼D3"«´a†åRHŽÀ•l}¥2òî ‹Ë§òííãie|µTdœOµp–öºÍþ¯d·«¥Ô‰pê³M‰íòfR ²ƒn¬3€BFÚ«¬Ã¨O¡êÖºŒzÔ«öK˜4Ä·[†.â[„O/–1mƒ.CNN\Ñ`=.Šán­µ›É®­m&Ô`Õ¦’ò9e‘¦[d·)0·d?êƒmŽcùþöyßWl?·nu› ‰¼è­.¤mA£mêaAÆ pxVÃ۾ΛÖsžP[EP3)µ-J}VîÃMÑd¾kU¤u¸Ž0ƒ¾G÷OLô«¶k­Kq¶ÿD{v³y¯s™ IÉÇÓùøXˆ|Uâe!#xíU]¸ @“ äd~bº[é▱ʎ~s…`ª¬¬IÉjÆ™¤ùÚZŸ›Ÿ/í3¬{ñŒãqÆGçWkŸÕíu9¼S¦K¦É ,®–I§¶i£{råtäŽz)ãÓ""ÿK°Õ ¶¸ÕÞÒ{[Kx÷·‹°™£ ,TIÊò˜bs#;z+Îî¢ÕÜ]Í`u¯²[Z^ϦyÙ-ŒbEc½Ï™çíIAÈÎ\SîOÙ{=4Êëª$ÅÛߤN_Èón f4C¹As>XÉÊæ€;z+’ðå¶§.µ$×Ój+i ²›X¥fàÏr¾y.!ò²ç\ˆ5ÙµQâ›g¶ûd>]Í´H‘[ÜË𳯘ìÊÞJ`4€‡BÀ&àFT€ÒŠám-®íôMëk²Á-‘’ôÄ×qtV-ŠÂÞ*…‚1·#-— šº6¡ªÂ;cͪMu{>™<2¬sJ¦ –¾ii* •˜°b3’Hù²Kè”WŸivºÍµ¦Ÿ)m\ΖÚd®'ši?{,¥.ƒ$FTñÞI&ªÙZø†[P—Wº£Ï+Z­üqÁsÉ Ä>fÙZR0Îæ©·$àlXH3D³¤D:³¬e†æP@$à\ýG­>¸ˆôùáñl tº£iÖsˤ‚Iݳ"Z:‡`K<{ÄÙ.J `‘…¡áµÿ¦}«í“ýÏô럴Eö‡ù‹bÞoõ8ÈûŸ#gŒcj€tõÌßgµš}»¼´gÛœg5-UÔÿäyÿ\ÿA4 É·×µ[»h®`ðäï¨$FûTC*FAÁ>•³a,÷ZlWsÛý¤f/0>ÆWŽsÛ?á§éšœšM…«ÎÑZIiœ„bHÊÆ  ÏLÿãÔ¬i›ocŒÊ£= Šb+½ÌJ±Iæ;Ie—jóŒm=¹5ímå)gGsç¶\€á#‡Ëq?ÀúϽϨ°\¹Eg$&Ù,ë‘7Ü4sï˜mc…‹p nÚ>B# È¤‰ã³‰®YL„¡GùœárÌ>N™%¿,'¢«Ch^fi¡¹HÈÑÆòJ„ Â<‡êeÆãôàSfŽv´±VyTºFó‘3dÇœmB­Ë`pGåš,-ÓVXÝŠ£«ÔœrGó~«<Ʊgí¦0™¸ù66ÂÍ´(,Hlc¹m¹'µ%¼.· óÁpdu`‹™6¨YgÎ@8˜ÝëÇz,'¢Š) +Æþ#ÈÝ/ýrOå^É^7ñþFéë’*qÜLö«Ÿõ«ÿ\ÓÿA%X2’äÚ¥¹ÿZ¿õÍ?ôPÒoµÜÿÏÄ¿÷Ù¦I,’ãÌ‘ß718¦Q@Š( nìíoí^ÖòÚ›wÆø¦@èØ9ƒÈðªVžЬ.’êÏEÓ­®;%†Õ×# Ž iÑ@2b·‚8 "†5‘¢…UP0 ŸEQEQEQEQEH—¢…I¤Ub)º¸e*ÓÊAà‚çšŠŠ¥¨húf­åÿiiÖwžV|¿´À²lÎ3Àã8•Oigkaj–¶vÐÛ[¦vE EÉÉÀI?MEà M:NcC2+"ÈTnU$ì UÏÐzSè Š( Š(  ·úm†©Á¨Y[]­¼GqÈ¡°FpAçþujŠ(¢Š(¢Š(¥«RA‚;RQ@}®çþ~%ÿ¾Í2Id—d޸鹉Å2Š(¢Š(¢Š)¯RàK R€rD3ô€v÷WW w2¬ò€€ÏÔ_k¹ÿŸ‰ï³Eßü~Oÿ]ùÔ4€›íw?óñ/ýöj—ü$vŸÚÙŸÛ0ÿhϯڇ›÷w}Ìç§=:sS×1¤ßM¥hé'O¼ŸX¶¶`Ëöy+™Â–-ö¾_ï-¹Žrÿ0 ‘@oÚîçâ_ûìÑö»Ÿùø—þû5æZm¶©uªÁa%Ö¯.–nbwE{hFaºÜ Ë!“n僣mÉ^2NtôïµR$Ö?µþÏ‹í%nf\ÊcûË勚\†99s@Ö¬ÖP¬·r¢4‘Äæ?3¸Ez³øÔÿk¹ÿŸ‰ï³^]ci¯K _mžúâ>Íïak9Õau1 $Œ¤%ÿP¢<NA^—@}®çþ~%ÿ¾ÍVÔ/nÓMºtº™Yar‚ >ªêò ¼ÿ®ÿ šo„ÿä ¡ÿ×½¿þ‚µ¥ö»Ÿùø—þû5›á?ùhõïoÿ ­\  ¾×sÿ?ÿßfµÜÿÏÄ¿÷Ù¨h cÚþU‘#k·ùÚ¦C–Ç\ óOû]ÏüüKÿ}šËš;óÞ,2ÂÈ#Üî‚üîq¼0LätÇN*;ˆäK;–Œ] "û_Ÿ92l|СK|Dcåçõ§aÆúutCq6ç$( NHŸÐøS¾×sÿ?ÿßf¨›B÷§ÉŽî]̱™<ÀÜÃ8fgÍÿ<ùé“ëš}®ù-þÕ.7MŠ„ì ¹Œ“Ã1lê«ëE€·ö»Ÿùø—þû4}®çþ~%ÿ¾ÍCE!™>0¼ºÕ1s70?9äü«vЕœ²’G Žß)®sÆ?ò(ê_õËúŠè­¿Ö·ýsýÓ}®çþ~%ÿ¾Ík¹ÿŸ‰ï³PÑHdßk¹ÿŸ‰ï³L:Œ‹:@oLêα™~fP@$ òeÏÔzÓ+ŸÕôû»ßéowyf‘Ù]¸¶Ž6ä½¾—FQœÓ?/± GG£$è^Æ‘C2Ir)*ÃÔAô Ôvº³^ÂÒÛÝÊè²I;˜|ÈåsèÊGá^dl|AòóQVK“hég,,æîr]„Oc*a#ÎYÝÆúÚâ¾Ö-Sû]5Ži´Ø û@ˆL÷—…@¿»Ú؈æ_”éš`z§Úîçâ_ûìÑö»Ÿùø—þû5 †Mö»Ÿùø—þû5‡â‹«†µÓÐÜJQõ+`Ê\ᇘ?ˆð­jÃñ?ú3þÂvßú¡ܯøÿ#t¿õÉ?•{%xßÄoù¥ÿ®Iü©Çpgµ\ÿ­_úæŸú¨jkŸõ«ÿ\ÓÿA (¢…p°x²çFŽm;þn᡼¼&Xì¤(áJ§#k¯5ÝQ@Ž'þû¯úuïü—ÿˆ£þû¯úuïü—ÿˆ®ÚŠ.€âá?ºÿ¡G^ÿÀ)øŠ?á?ºÿ¡G^ÿÀ)øŠí¨¢è'þû¯úuïü—ÿˆ£þû¯úuïü—ÿˆ®ÚŠ.€âá?ºÿ¡G^ÿÀ)øŠ?á?ºÿ¡G^ÿÀ)øŠí¨¢èçÇ7W³Aÿž¼¾b2nû §þåj|<¶¸´ðE”7Vó[Ê$ŒsFQÀ39Rƺz(¸7^(¯')¦k†F*ÂÂL0Ï^FjøIâÿ N³ÿ€þ¹EaÿÂOýuŸüð£þx¿è¬ÿàÿ…nQ@ð“Åÿ@gÿü(ÿ„ž/úë?øÿá[”Pü$ñÐ'YÿÀÿ ?á'‹þ:Ïþ?øVå‡ÿ <_ô Öðÿ¡¼ñ \YO iZÀi#dØIŒ‘J訠 >o°èzS\¤‰ä[Bd_-‹.Õ@Éñ¿Mf½pF3Gü$ña@Òu€B¨{€§ ­Ê(¸ð“Åÿ@gÿü(ÿ„ž/úë?øÿá[”P#â `êz핾•«ù²ÇµwXÈ*ë^î;¥¸‘%uXØmŠ6‘‰ €€IäëÅ-\ ?øIâÿ N³ÿ€þÂOýuŸüð­Ê(þx¿è¬ÿàÿ…ð“Åÿ@gÿü+rŠÃÿ„ž/úë?øÿáL!µYÞq¢êÂgUFiϹ”@'€Y±õ>µ¿EaÿÂOýuŸüð£þx¿è¬ÿàÿ…nQ@ð“Åÿ@gÿü*†§©¶¬Ú|iº¢2_Á+4¶nª8É'WWEã¿än—þ¹'ò¯d¯øÿ#t¿õÉ?•8î îî>%xu¦ùd¸`Wp„ààŸÒ¢ÿ…‘áÿïÜÿ߯þ½Ur¡\?ádxû÷?÷ëÿ¯Gü,ÿ~çþýõ袎TøYþýÏýúÿëÑÿ #Ãÿß¹ÿ¿_ýz(£•ÃþG‡ÿ¿sÿ~¿úôÂÈðÿ÷îï×ÿ^Š(åApÿ…‘áÿïÜÿ߯þ½ð²= 2.5. .. _`astroid`: https://bitbucket.org/logilab/astroid .. _`logilab-common`: http://www.logilab.org/project/logilab-common Distributions ''''''''''''' The source tarball is available at http://download.logilab.org/pub/pylint. You may apt-get a well-tested Debian or Ubuntu package by adding one of these lines:: deb http://download.logilab.org/production unstable/ deb http://download.logilab.org/production sid/ deb http://download.logilab.org/production squeeze/ deb http://download.logilab.org/production lenny/ to your */etc/apt/sources.list* file. Pylint is also available in the standard Debian distribution (but add our public debian repository anyway if you want to get the latest releases and upgrades earlier) Pylint is also available in Gentoo, Fedora 4, Ubuntu, FreeBSD, Darwin (and maybe others, if you know about more OSes, please drop us a note!). Python packages ''''''''''''''' Pylint should be easily installable using setuptools and the Python Package Index. Try easy_install or pip, depending on your preference. Source distribution installation '''''''''''''''''''''''''''''''' From the source distribution, extract the tarball, go to the extracted directory and simply run :: python setup.py install You'll have to install dependencies in a similar way. Windows users may get valuable information about Pylint installation on `this page`_. .. _`this page`: http://thinkhole.org/wp/2006/01/16/installing-pylint-on-windows/ Note for Windows users '''''''''''''''''''''' On Windows, once you have installed Pylint, the command line usage is :: pylint.bat [options] module_or_package But this will only work if *pylint.bat* is either in the current directory, or on your system path. (*setup.py* install install *python.bat* to the *Scripts* subdirectory of your Python installation -- e.g. C:\Python24\Scripts.) You can do any of the following to solve this: 1. change to the appropriate directory before running pylint.bat 2. add the Scripts directory to your path statement in your autoexec.bat file (this file is found in the root directory of your boot-drive) 3. create a 'redirect' batch file in a directory actually on your systems path To effect (2), simply append the appropriate directory name to the PATH= statement in autoexec.bat. Be sure to use the Windows directory separator of ';' between entries. Then, once you have rebooted (this is necessary so that the new path statement will take effect when autoexec.bat is run), you will be able to invoke Pylint with pylint.bat on the command line. (3) is the best solution. Once done, you can call Pylint at the command line without the .bat, just as do non-Windows users by typing: :: pylint [options] module_or_package To effect option (3), simply create a plain text file pylint.bat with the single line: :: C:\PythonDirectory\Scripts\pylint.bat (where PythonDirectory is replaced by the actual Python installation directory on your system -- e.g. C:\Python24\Scripts\pylint.bat). pylint-1.1.0/doc/contribute.rst0000664000175000017500000001202512254613024016166 0ustar sytsyt00000000000000.. -*- coding: utf-8 -*- ============ Contribute ============ Bug reports, feedback --------------------- You think you have found a bug in Pylint? Well, this may be the case since Pylint is under development. Please take the time to check if it is already in the issue tracker at https://bitbucket.org/logilab/pylint If you can not find it in the tracker, create a new issue there or discuss your problem on the code-quality@python.org mailing list. The code-quality mailing list is also a nice place to provide feedback about Pylint, since it is shared with other tools that aim at improving the quality of python code. Note that if you don't find something you have expected in Pylint's issue tracker, it may be because it is an issue with one of its dependencies, namely astroid and logilab-common: * https://bitbucket.org/logilab/astroid * http://www.logilab.org/project/logilab-common Mailing lists ------------- Use the code-quality@python.org mailing list for anything related to Pylint. This is in most cases better than sending an email directly to the author, since others will benefit from the exchange, and you'll be more likely answered by someone subscribed to the list. You can subscribe to this mailing list at http://mail.python.org/mailman/listinfo/code-quality Archives are available at http://mail.python.org/pipermail/code-quality/ Archives before April 2013 are available at http://lists.logilab.org/pipermail/python-projects/ Forge ----- Pylint is developped using the mercurial_ distributed version control system. You can clone Pylint and its dependencies from :: hg clone https://bitbucket.org/logilab/pylint hg clone https://bitbucket.org/logilab/astroid hg clone http://hg.logilab.org/logilab/common .. _mercurial: http://www.selenic.com/mercurial/ Got a change for Pylint? Below are a few steps you should take to make sure your patch gets accepted. - Test your code - Pylint keeps a set of unit tests in the /test directory. The `test_func.py` module uses external files to have some kind of easy functionnal testing. To get your patch accepted you must write (or change) a test input file in the `test/input` directory and message file in the `test/messages` directory. Then run `python test_func.py` to ensure that your test is green. - You should also run all the tests to ensure that your change isn't breaking one. - Add a short entry to the ChangeLog describing the change, except for internal implementation only changes - Write a comprehensive commit message - Relate your change to an issue in the tracker if such an issue exists (see `this page`_ of Bitbucket documentation for more information on this) - Send a pull request from Bitbucket (more on this here_) .. _`this page`: https://confluence.atlassian.com/display/BITBUCKET/Resolve+issues+automatically+when+users+push+code .. _here: https://confluence.atlassian.com/display/BITBUCKET/Work+with+pull+requests Unit test setup --------------- To run the pylint unit tests within your checkout (without having to install anything), you need to set PYTHONPATH so that pylint, astroid and the logilab-common are available. Assume you have those packages in ~/src. If you have a normal clone of logilab-common, it will not be properly structured to allow import of logilab.common. To remedy this, create the necessary structure:: cd ~/src mkdir logilab mv logilab-common logilab/common touch logilab/__init__.py Now, set PYTHONPATH to your src directory:: export PYTHONPATH=~/src You now have access to the astroid, logilab.common and pylint packages without installing them. You can run all the unit tests like so:: cd ~/src/pylint/test for f in *.py ; do echo $f python -S $f done The -S flag keeps distutils from interfering with sys.path. YMMV. Adding new functionnal tests ---------------------------- Pylint comes with an easy way to write functional tests for new checks: * put a Python file in the `test/input` directory, whose name starts with `func_` and should also contains the symbolic name of the tested check * add the expected message file in the `test/messages` directory, using the same name but a `.txt` extension instead of `.py` The message file should use the default text output format (without reports) and lines should be sorted. E.g on Unix system, you may generate it using:: pylint -rn input/func_mycheck.py | sort > pylint messages/func_mycheck.txt Also, here are a few naming convention which are used: * Python files starting with 'func_noerror' don't have any message file associated as they are expected to provide no output at all * You may provide different input files (and associated output) depending on the Python interpreter version: * tests whose name ends with `_py.py` are used for Python >= x.y * tests whose name ends with `_py<_xy>.py` are used for Python < x.y * Similarly you may provide different message files for a single input, message file whose name ends with '_py.txt' will be used for Python >= x.y, using the nearest version possible pylint-1.1.0/doc/tutorial.rst0000664000175000017500000003433312254613024015661 0ustar sytsyt00000000000000.. class:: article ================================================================ A Beginner's Guide to Code Standards in Python - Pylint Tutorial ================================================================ :Author: Robert Kirkpatrick For a detailed description of Pylint, see http://www.pylint.org Intro ----- Beginner to coding standards? Pylint can be your guide to reveal what's really going on behind the scenes and help you to become a more aware programmer. Sharing code is a rewarding endeavor. Putting your code 'out there' can be either an act of philanthropy, 'coming of age', or a basic extension of belief in open source. Whatever the motivation, your good intentions may not have the desired outcome if people find your code hard to use or understand. The Python community has formalized some recommended programming styles to help everyone write code in a common, agreed-upon style that makes the most sense for shared code. This style is captured in PEP-8_. Pylint can be a quick and easy way of seeing if your code has captured the essence of PEP-8 and is therefore 'friendly' to other potential users. Perhaps you're not ready to share your code but you'd like to learn a bit more about writing better code and don't know where to start. Pylint can tell you where you may have run astray and point you in the direction to figure out what you have done and how to do better. This tutorial is all about approaching coding standards with little or no knowledge of in-depth programming or the code standards themselves. It's the equivalent of skipping the manual and jumping right in. My command line prompt for these examples is: .. sourcecode:: bash robertk01 Desktop$ .. _PEP-8: http://www.python.org/dev/peps/pep-0008/ Getting Started --------------- Running Pylint with no arguments will invoke the help dialogue and give you a idea of the arguments available to you. Do that now, i.e.: .. sourcecode:: bash robertk01 Desktop$ pylint ... a bunch of stuff ... A couple of the options that we'll focus on here are: :: Master: --generate-rcfile= Commands: --help-msg= Commands: --help-msg= Message control: --disable= Reports: --files-output= --reports= --output-format= Also pay attention to the last bit of help output. This gives you a hint of what Pylint is going to 'pick on': :: Output: Using the default text output, the message format is : MESSAGE_TYPE: LINE_NUM:[OBJECT:] MESSAGE There are 5 kind of message types : * (C) convention, for programming standard violation * (R) refactor, for bad code smell * (W) warning, for python specific problems * (E) error, for much probably bugs in the code * (F) fatal, if an error occurred which prevented pylint from doing further processing. When Pylint is first run on a fresh piece of code, a common complaint is that it is too 'noisy'. The current default configuration is set to enforce all possible warnings. We'll use some of the options I noted above to make it suit your preferences a bit better (and thus make it 'scream only when needed'). Your First Pylint'ing --------------------- We'll use a basic python script as fodder for our tutorial. I borrowed extensively from the code here: http://www.daniweb.com/code/snippet748.html The starting code we will use is called simplecaeser.py and is here in its entirety: .. sourcecode:: python 1 #!/usr/bin/env python 2 3 import string 4 5 shift = 3 6 choice = raw_input("would you like to encode or decode?") 7 word = (raw_input("Please enter text")) 8 letters = string.ascii_letters + string.punctuation + string.digits 9 encoded = '' 10 if choice == "encode": 11 for letter in word: 12 if letter == ' ': 13 encoded = encoded + ' ' 14 else: 15 x = letters.index(letter) + shift 16 encoded=encoded + letters[x] 17 if choice == "decode": 18 for letter in word: 19 if letter == ' ': 20 encoded = encoded + ' ' 21 else: 22 x = letters.index(letter) - shift 23 encoded = encoded + letters[x] 24 25 print encoded Let's get started. If we run this: .. sourcecode:: bash robertk01 Desktop$ pylint simplecaeser.py No config file found, using default configuration ************* Module simplecaeser C: 1, 0: Missing module docstring (missing-docstring) W: 3, 0: Uses of a deprecated module 'string' (deprecated-module) C: 5, 0: Invalid constant name "shift" (invalid-name) C: 6, 0: Invalid constant name "choice" (invalid-name) C: 7, 0: Invalid constant name "word" (invalid-name) C: 8, 0: Invalid constant name "letters" (invalid-name) C: 9, 0: Invalid constant name "encoded" (invalid-name) C: 16,12: Operator not preceded by a space encoded=encoded + letters[x] ^ (no-space-before-operator) Report ====== 19 statements analysed. Duplication ----------- +-------------------------+------+---------+-----------+ | |now |previous |difference | +=========================+======+=========+===========+ |nb duplicated lines |0 |0 |= | +-------------------------+------+---------+-----------+ |percent duplicated lines |0.000 |0.000 |= | +-------------------------+------+---------+-----------+ Raw metrics ----------- +----------+-------+------+---------+-----------+ |type |number |% |previous |difference | +==========+=======+======+=========+===========+ |code |21 |87.50 |21 |= | +----------+-------+------+---------+-----------+ |docstring |0 |0.00 |0 |= | +----------+-------+------+---------+-----------+ |comment |1 |4.17 |1 |= | +----------+-------+------+---------+-----------+ |empty |2 |8.33 |2 |= | +----------+-------+------+---------+-----------+ Statistics by type ------------------ +---------+-------+-----------+-----------+------------+---------+ |type |number |old number |difference |%documented |%badname | +=========+=======+===========+===========+============+=========+ |module |1 |1 |= |0.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |class |0 |0 |= |0.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |method |0 |0 |= |0.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |function |0 |0 |= |0.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ Messages by category -------------------- +-----------+-------+---------+-----------+ |type |number |previous |difference | +===========+=======+=========+===========+ |convention |7 |7 |= | +-----------+-------+---------+-----------+ |refactor |0 |0 |= | +-----------+-------+---------+-----------+ |warning |1 |1 |= | +-----------+-------+---------+-----------+ |error |0 |0 |= | +-----------+-------+---------+-----------+ Messages -------- +-------------------------+------------+ |message id |occurrences | +=========================+============+ |invalid-name |5 | +-------------------------+------------+ |no-space-before-operator |1 | +-------------------------+------------+ |missing-docstring |1 | +-------------------------+------------+ |deprecated-module |1 | +-------------------------+------------+ Global evaluation ----------------- Your code has been rated at 5.79/10 Wow. That's a lot of stuff. The first part is the 'messages' section while the second part is the 'report' section. There are two points I want to tackle here. First point is that all the tables of statistics (i.e. the report) are a bit overwhelming so I want to silence them. To do that, I will use the "--reports=n" option. .. tip:: Many of Pylint's commonly used command line options have shortcuts. for example, "--reports=n" can be abbreviated to "-rn". Pylint's man page lists all these shortcuts. Second, previous experience taught me that the default output for the messages needed a bit more info. We can see the first line is: :: "C: 1: Missing docstring (missing-docstring)" This basically means that line 1 violates a convention 'C'. It's telling me I really should have a docstring. I agree, but what if I didn't fully understand what rule I violated. Knowing only that I violated a convention isn't much help if I'm a newbie. Another information there is the message symbol between parens, `missing-docstring` here. If I want to read up a bit more about that, I can go back to the command line and try this: .. sourcecode:: bash robertk01 Desktop$ pylint --help-msg=missing-docstring No config file found, using default configuration :missing-docstring (C0111): *Missing docstring* Used when a module, function, class or method has no docstring. Some special methods like __init__ doesn't necessary require a docstring. This message belongs to the basic checker. Yeah, ok. That one was a bit of a no-brainer but I have run into error messages that left me with no clue about what went wrong, simply because I was unfamiliar with the underlying mechanism of code theory. One error that puzzled my newbie mind was: :: :too-many-instance-attributes (R0902): *Too many instance attributes (%s/%s)* I get it now thanks to Pylint pointing it out to me. If you don't get that one, pour a fresh cup of coffee and look into it - let your programmer mind grow! The Next Step ------------- Now that we got some configuration stuff out of the way, let's see what we can do with the remaining warnings. If we add a docstring to describe what the code is meant to do that will help. I'm also going to be a bit cowboy and ignore the `deprecated-module` message because I like to take risks in life. A deprecation warning means that future versions of Python may not support that code so my code may break in the future. There are 5 `invalid-name` messages that we will get to later. Lastly, I violated the convention of using spaces around an operator such as "=" so I'll fix that too. To sum up, I'll add a docstring to line 2, put spaces around the = sign on line 16 and use the `--disable=deprecated-module` to ignore the deprecation warning. Here is the updated code: .. sourcecode:: python 1 #!/usr/bin/env python 2 """This script prompts a user to enter a message to encode or decode 3 using a classic Caeser shift substitution (3 letter shift)""" 4 5 import string 6 7 shift = 3 8 choice = raw_input("would you like to encode or decode?") 9 word = (raw_input("Please enter text")) 10 letters = string.ascii_letters + string.punctuation + string.digits 11 encoded = '' 12 if choice == "encode": 13 for letter in word: 14 if letter == ' ': 15 encoded = encoded + ' ' 16 else: 17 x = letters.index(letter) + shift 18 encoded = encoded + letters[x] 19 if choice == "decode": 20 for letter in word: 21 if letter == ' ': 22 encoded = encoded + ' ' 23 else: 24 x = letters.index(letter) - shift 25 encoded = encoded + letters[x] 26 27 print encoded And here is what happens when we run it with our `--disable=deprecated-module` option: .. sourcecode:: bash robertk01 Desktop$ pylint --reports=n --disable=deprecated-module simplecaeser.py No config file found, using default configuration ************* Module simplecaeser C: 7, 0: Invalid constant name "shift" (invalid-name) C: 8, 0: Invalid constant name "choice" (invalid-name) C: 9, 0: Invalid constant name "word" (invalid-name) C: 10, 0: Invalid constant name "letters" (invalid-name) C: 11, 0: Invalid constant name "encoded" (invalid-name) Nice! We're down to just the `invalid-name` messages. There are fairly well defined conventions around naming things like instance variables, functions, classes, etc. The conventions focus on the use of UPPERCASE and lowercase as well as the characters that separate multiple words in the name. This lends itself well to checking via a regular expression, thus the "should match (([A-Z\_][A-Z1-9\_]*)|(__.*__))$". In this case Pylint is telling me that those variables appear to be constants and should be all UPPERCASE. This rule is in fact a naming convention that is specific to the folks at Logilab who created Pylint. That is the way they have chosen to name those variables. You too can create your own in-house naming conventions but for the purpose of this tutorial, we want to stick to the PEP-8 standard. In this case, the variables I declared should follow the convention of all lowercase. The appropriate rule would be something like: "should match [a-z\_][a-z0-9\_]{2,30}$". Notice the lowercase letters in the regular expression (a-z versus A-Z). If we run that rule using a `--const-rgx='[a-z\_][a-z0-9\_]{2,30}$'` option, it will now be quite quiet: .. sourcecode:: bash robertk01 Desktop$ pylint --reports=n --disable=deprecated-module --const-rgx='[a-z_][a-z0-9_]{2,30}$' simplecaeser.py No config file found, using default configuration Regular expressions can be quite a beast so take my word on this particular example but go ahead and `read up`_ on them if you want. .. tip:: It would really be a pain in the butt to have to use all these options on the command line all the time. That's what the rc file is for. We can configure our Pylint to store our options for us so we don't have to declare them on the command line. Using the rc file is a nice way of formalizing your rules and quickly sharing them with others. Invoking ``pylint --generate-rcfile`` will create a sample rcfile with all the options set and explained in comments. That's it for the basic intro. More tutorials will follow. .. _`read up`: http://docs.python.org/library/re.html pylint-1.1.0/doc/run.rst0000664000175000017500000001200112255070544014613 0ustar sytsyt00000000000000================ Running Pylint ================ Invoking Pylint --------------- Pylint is meant to be called from the command line. The usage is :: pylint [options] module_or_package You should give Pylint the name of a python package or module. Pylint will ``import`` this package or module, so you should pay attention to your ``PYTHONPATH``, since it is a common error to analyze an installed version of a module instead of the development version. It is also possible to analyze python files, with a few restrictions. The thing to keep in mind is that Pylint will try to convert the file name to a module name, and only be able to process the file if it succeeds. :: pylint mymodule.py should always work since the current working directory is automatically added on top of the python path :: pylint directory/mymodule.py will work if "directory" is a python package (i.e. has an __init__.py file) or if "directory" is in the python path. For more details on this see the Frequently Asked Questions. You can also start a thin gui around Pylint (require TkInter) by typing :: pylint-gui This should open a window where you can enter the name of the package or module to check, at Pylint messages will be displayed in the user interface. It is also possible to call Pylint from an other python program, thanks to ``py_run()`` function in ``lint`` module, assuming Pylint options are stored in ``pylint_options`` string, as: .. sourcecode:: python from pylint import epylint as lint lint.py_run(pylint_options) To silently run Pylint on a ``module_name.py`` module, and get its standart output and error: .. sourcecode:: python from pylint import epylint as lint (pylint_stdout, pylint_stderr) = lint.py_run('module_name.py', True) Command line options -------------------- First of all, we have two basic (but useful) options. --version show program's version number and exit -h, --help show help about the command line options Pylint is architectured around several checkers. By default all checkers are enabled. You can disable a specific checker or some of its messages or messages categories by specifying ``--disable=``. If you want to enable only some checkers or some message ids, first use ``--disable=all`` then ``--enable=`` with being a comma separated list of checker names and message identifiers. See the list of available features for a description of provided checkers with their functionalities. The ``--disable`` and ``--enable`` options can be used with comma separated lists mixing checkers, message ids and categories like ``-d C,W,E0611,design`` It is possible to disable all messages with ``--disable=all``. This is useful to enable only a few checkers or a few messages by first disabling everything, and then re-enabling only what you need. Each checker has some specific options, which can take either a yes/no value, an integer, a python regular expression, or a comma separated list of values (which are generally used to override a regular expression in special cases). For a full list of options, use ``--help`` Specifying all the options suitable for your setup and coding standards can be tedious, so it is possible to use a configuration file to specify the default values. You can specify a configuration file on the command line using the ``--rcfile`` option. Otherwise, Pylint searches for a configuration file in the following order and uses the first one it finds: #. ``pylintrc`` in the current working directory #. If the current working directory is in a Python module, Pylint searches \ up the hierarchy of Python modules until it finds a ``pylintrc`` file. \ This allows you to specify coding standards on a module-by-module \ basis. Of course, a directory is judged to be a Python module if it \ contains an ``__init__.py`` file. #. The file named by environment variable ``PYLINTRC`` #. ``.pylintrc`` in your home directory, unless you have no home directory or \ your home directory is ``/root`` #. ``.pylintrc`` in the current working directory #. ``/etc/pylintrc`` The ``--generate-rcfile`` option will generate a commented configuration file on standard output according to the current configuration and exit. This includes: * Any configuration file found as explained above * Options appearing before ``--generate-rcfile`` on the Pylint command line Of course you can also start with the default values and hand tune the configuration. Other useful global options include: --ignore=file Add (may be a directory) to the black list. It should be a base name, not a path. You may set this option multiple times. --persistent=y_or_n Pickle collected data for later comparisons. --output-format= Select output format (text, html, custom). --msg-template=