webpage:
@(cd ../www; ./generate.py)
+pylint:
+ @pylint --rcfile scripts/pylintrc jinja
+
release: documentation
@(python2.3 setup.py release bdist_egg upload; python2.4 setup.py release bdist_egg upload; python2.5 setup.py release bdist_egg sdist upload)
:copyright: 2007 by Armin Ronacher.
:license: BSD, see LICENSE for more details.
"""
-from jinja.datastructure import Deferred, Undefined
-try:
- from collections import deque
-except ImportError:
- class deque(list):
- """
- Minimal subclass of list that provides the deque
- interface used by the native `BaseContext`.
- """
-
- def appendleft(self, item):
- list.insert(self, 0, item)
-
- def popleft(self):
- return list.pop(self, 0)
+from jinja.datastructure import Deferred
+from jinja.utils import deque
class BaseContext(object):
:license: BSD, see LICENSE for more details.
"""
-# sets
-try:
- set
-except NameError:
- from sets import Set as set
-
from jinja.exceptions import TemplateSyntaxError, TemplateRuntimeError
import re
from random import choice
from urllib import urlencode, quote
-from jinja.utils import urlize, escape
-from jinja.datastructure import Markup, TemplateData
+from jinja.utils import urlize, escape, reversed
+from jinja.datastructure import TemplateData
from jinja.exceptions import FilterArgumentError
-try:
- _reversed = reversed
-except NameError:
- # python2.3 compatibility hack for the do_reverse function
- def _reversed(seq):
- try:
- return seq[::-1]
- except:
- try:
- return list(seq)[::-1]
- except:
- raise TypeError('argument to _reversed must '
- 'be a sequence')
-
-
def stringfilter(f):
"""
Decorator for filters that just work on unicode objects.
"""
def wrapped(env, context, seq):
try:
- return iter(_reversed(seq)).next()
+ return iter(reversed(seq)).next()
except StopIteration:
return env.undefined_singleton
return wrapped
import re
from jinja.datastructure import TokenStream
from jinja.exceptions import TemplateSyntaxError
+from jinja.utils import set
from weakref import WeakValueDictionary
-try:
- set
-except NameError:
- from sets import Set as set
-
__all__ = ['Lexer', 'Failure', 'keywords']
from jinja.translators.python import PythonTranslator, Template
from jinja.exceptions import TemplateNotFound, TemplateSyntaxError
from jinja.utils import CacheDict, raise_syntax_error
-try:
- from pkg_resources import resource_exists, resource_string, \
- resource_filename
-except ImportError:
- resource_exists = resource_string = resource_filename = None
#: when updating this, update the listing in the jinja package too
ast = self.parse(environment, name, None)
return translator.process(environment, ast)
+ def get_source(self, environment, name, parent):
+ """
+ Override this method to get the source for a template.
+ """
+ raise TemplateNotFound(name)
+
class CachedLoaderMixin(object):
"""
def __init__(self, package_name, package_path, use_memcache=False,
memcache_size=40, cache_folder=None, auto_reload=True,
cache_salt=None):
- if resource_filename is None:
- raise ImportError('setuptools not found')
+ try:
+ import pkg_resources
+ except ImportError:
+ raise RuntimeError('setuptools not installed')
self.package_name = package_name
self.package_path = package_path
if cache_salt is None:
cache_folder, auto_reload, cache_salt)
def get_source(self, environment, name, parent):
+ from pkg_resources import resource_exists, resource_string
name = '/'.join([self.package_path] + [p for p in name.split('/')
if p != '..'])
if not resource_exists(self.package_name, name):
return contents.decode(environment.template_charset)
def check_source_changed(self, environment, name):
+ from pkg_resources import resource_exists, resource_filename
fn = resource_filename(self.package_name, '/'.join([self.package_path] +
[p for p in name.split('/') if p and p[0] != '.']))
if resource_exists(self.package_name, fn):
:copyright: 2007 by Armin Ronacher.
:license: BSD, see LICENSE for more details.
"""
-import re
from compiler import ast, parse
-from compiler.misc import set_filename
from jinja import nodes
-from jinja.datastructure import TokenStream, StateTest
+from jinja.datastructure import StateTest
from jinja.exceptions import TemplateSyntaxError
-try:
- set
-except NameError:
- from sets import Set as set
+from jinja.utils import set
__all__ = ['Parser']
number_re = re.compile(r'^-?\d+(\.\d+)?$')
-
regex_type = type(number_re)
from jinja.exceptions import TemplateSyntaxError
from jinja.translators import Translator
from jinja.datastructure import TemplateStream
-from jinja.utils import translate_exception, capture_generator, \
+from jinja.utils import set, translate_exception, capture_generator, \
RUNTIME_EXCEPTION_OFFSET
_debug_re = re.compile(r'^\s*\# DEBUG\(filename=(?P<filename>.*?), '
r'lineno=(?P<lineno>\d+)\)$')
-# For Python2.3 compatibiilty
+# For Python versions without generator exit exceptions
try:
- set
-except NameError:
- from sets import Set as set
-
-# For Python 2.3/2.4 compatibility
-try:
- GeneratorExit
+ GeneratorExit = GeneratorExit
except NameError:
class GeneratorExit(Exception):
pass
# handle requirements code
if requirements:
requirement_lines = ['def bootstrap(context):']
- has_requirements = False
for n in requirements:
requirement_lines.append(self.handle_node(n))
requirement_lines.append(' if 0: yield None\n')
self.to_tuple(tmp)
))
- # aliases boilerplate
- aliases = ['%s = environment.%s' % (item, item) for item in
- ['get_attribute', 'perform_test', 'apply_filters',
- 'call_function', 'call_function_simple', 'finish_var',
- 'undefined_singleton'] if item in self.used_shortcuts]
-
# bootstrapping code
lines = ['# Essential imports', 'from __future__ import division']
if self.used_utils:
from types import MethodType, FunctionType
from compiler.ast import CallFunc, Name, Const
from jinja.nodes import Trans
-from jinja.datastructure import Context
from jinja.exceptions import SecurityException, TemplateNotFound
# the python2.4 version of deque is missing the remove method
from collections import deque
deque.remove
except (ImportError, AttributeError):
- deque = None
+ class deque(list):
+ """
+ Minimal subclass of list that provides the deque
+ interface used by the native `BaseContext` and the
+ `CacheDict`
+ """
+ def appendleft(self, item):
+ list.insert(self, 0, item)
+ def popleft(self):
+ return list.pop(self, 0)
+ def clear(self):
+ del self[:]
+
+# support for a working reversed()
+try:
+ reversed = reversed
+except NameError:
+ def reversed(iterable):
+ if hasattr(iterable, '__reversed__'):
+ return iterable.__reversed__()
+ try:
+ return iter(iterable[::-1])
+ except TypeError:
+ return iter(tuple(iterable)[::-1])
# support for python 2.3/2.4
try:
- set
+ set = set
except NameError:
from sets import Set as set
Used by the python translator to capture output of substreams.
(macros, filter sections etc)
"""
- def wrapped(*args, **kwargs):
- return capture_generator(f(*args, **kwargs))
- return wrapped
+ return lambda *a, **kw: capture_generator(f(*a, **kw))
def empty_block(context):
"""
# some traceback systems allow to skip frames
__traceback_hide__ = True
+
+ from jinja.datastructure import Context
if isinstance(context_or_env, Context):
env = context_or_env.environment
namespace = context_or_env.to_dict()
def __init__(self, capacity):
self.capacity = capacity
self._mapping = {}
-
- # use a deque here if possible
- if deque is not None:
- self._queue = deque()
- self._popleft = self._queue.popleft
- # python2.3/2.4, just use a list
- else:
- self._queue = []
- pop = self._queue.pop
- self._popleft = lambda: pop(0)
+ self._queue = deque()
# alias all queue methods for faster lookup
+ self._popleft = self._queue.popleft
self._pop = self._queue.pop
self._remove = self._queue.remove
self._append = self._queue.append
Clear the cache dict.
"""
self._mapping.clear()
- try:
- self._queue.clear()
- except AttributeError:
- del self._queue[:]
+ self._queue.clear()
def __contains__(self, key):
"""
Iterate over all values in the cache dict, ordered by
the most recent usage.
"""
- try:
- return reversed(self._queue)
- except NameError:
- return iter(self._queue[::-1])
+ return reversed(self._queue)
def __reversed__(self):
"""
--- /dev/null
+# lint Python modules using external checkers.
+#
+# This is the main checker controling the other ones and the reports
+# generation. It is itself both a raw checker and an astng checker in order
+# to:
+# * handle message activation / deactivation at the module level
+# * handle some basic but necessary stats'data (number of classes, methods...)
+#
+[MASTER]
+
+# Specify a configuration file.
+#rcfile=
+
+# Profiled execution.
+profile=no
+
+# Add <file or directory> to the black list. It should be a base name, not a
+# path. You may set this option multiple times.
+ignore=.svn
+
+# Pickle collected data for later comparisons.
+persistent=yes
+
+# Set the cache size for astng objects.
+cache-size=500
+
+# List of plugins (as comma separated values of python modules names) to load,
+# usually to register additional checkers.
+load-plugins=
+
+
+[MESSAGES CONTROL]
+
+# Enable only checker(s) with the given id(s). This option conflict with the
+# disable-checker option
+#enable-checker=
+
+# Enable all checker(s) except those with the given id(s). This option conflict
+# with the disable-checker option
+#disable-checker=
+
+# Enable all messages in the listed categories.
+#enable-msg-cat=
+
+# Disable all messages in the listed categories.
+#disable-msg-cat=
+
+# Enable the message(s) with the given id(s).
+#enable-msg=
+
+# Disable the message(s) with the given id(s).
+disable-msg=C0323,W0142,C0301,C0103,C0111,E0213,C0302,C0203,W0703,R0201
+
+
+[REPORTS]
+
+# set the output format. Available formats are text, parseable, colorized and
+# html
+output-format=colorized
+
+# Include message's id in output
+include-ids=yes
+
+# 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]".
+files-output=no
+
+# Tells wether to display a full report or only the messages
+reports=yes
+
+# 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
+# respectivly contain the number of errors / warnings messages and the total
+# number of statements analyzed. This is used by the global evaluation report
+# (R0004).
+evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10)
+
+# Add a comment according to your evaluation note. This is used by the global
+# evaluation report (R0004).
+comment=no
+
+# Enable the report(s) with the given id(s).
+#enable-report=
+
+# Disable the report(s) with the given id(s).
+#disable-report=
+
+
+# checks for
+# * unused variables / imports
+# * undefined variables
+# * redefinition of variable from builtins or from an outer scope
+# * use of variable before assigment
+#
+[VARIABLES]
+
+# Tells wether we should check for unused import in __init__ files.
+init-import=no
+
+# A regular expression matching names used for dummy variables (i.e. not used).
+dummy-variables-rgx=_|dummy
+
+# List of additional names supposed to be defined in builtins. Remember that
+# you should avoid to define new builtins when possible.
+additional-builtins=
+
+
+# try to find bugs in the code using type inference
+#
+[TYPECHECK]
+
+# Tells wether missing members accessed in mixin class should be ignored. A
+# mixin class is detected if its name ends with "mixin" (case insensitive).
+ignore-mixin-members=yes
+
+# When zope mode is activated, consider the acquired-members option to ignore
+# access to some undefined attributes.
+zope=no
+
+# List of members which are usually get through zope's acquisition mecanism and
+# so shouldn't trigger E0201 when accessed (need zope=yes to be considered).
+acquired-members=REQUEST,acl_users,aq_parent
+
+
+# checks for :
+# * doc strings
+# * modules / classes / functions / methods / arguments / variables name
+# * number of arguments, local variables, branchs, returns and statements in
+# functions, methods
+# * required module attributes
+# * dangerous default values as arguments
+# * redefinition of function / method / class
+# * uses of the global statement
+#
+[BASIC]
+
+# Required attributes for module, separated by a comma
+required-attributes=
+
+# Regular expression which should only match functions or classes name which do
+# not require a docstring
+no-docstring-rgx=__.*__
+
+# Regular expression which should only match correct module names
+module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$
+
+# Regular expression which should only match correct module level names
+const-rgx=(([A-Z_][A-Z1-9_]*)|(__.*__))$
+
+# Regular expression which should only match correct class names
+class-rgx=[A-Z_][a-zA-Z0-9]+$
+
+# Regular expression which should only match correct function names
+function-rgx=[a-z_][a-z0-9_]*$
+
+# Regular expression which should only match correct method names
+method-rgx=[a-z_][a-z0-9_]*$
+
+# Regular expression which should only match correct instance attribute names
+attr-rgx=[a-z_][a-z0-9_]*$
+
+# Regular expression which should only match correct argument names
+argument-rgx=[a-z_][a-z0-9_]*$
+
+# Regular expression which should only match correct variable names
+variable-rgx=[a-z_][a-z0-9_]*$
+
+# Regular expression which should only match correct list comprehension /
+# generator expression variable names
+inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$
+
+# Good variable names which should always be accepted, separated by a comma
+good-names=i,j,k,ex,Run,_
+
+# Bad variable names which should always be refused, separated by a comma
+bad-names=foo,bar,baz,toto,tutu,tata
+
+# List of builtins function names that should not be used, separated by a comma
+bad-functions=apply,input
+
+
+# checks for sign of poor/misdesign:
+# * number of methods, attributes, local variables...
+# * size, complexity of functions, methods
+#
+[DESIGN]
+
+# Maximum number of arguments for function / method
+max-args=12
+
+# Maximum number of locals for function / method body
+max-locals=30
+
+# Maximum number of return / yield for function / method body
+max-returns=12
+
+# Maximum number of branch for function / method body
+max-branchs=30
+
+# Maximum number of statements in function / method body
+max-statements=60
+
+# Maximum number of parents for a class (see R0901).
+max-parents=7
+
+# Maximum number of attributes for a class (see R0902).
+max-attributes=20
+
+# Minimum number of public methods for a class (see R0903).
+min-public-methods=0
+
+# Maximum number of public methods for a class (see R0904).
+max-public-methods=20
+
+
+# checks for
+# * external modules dependencies
+# * relative / wildcard imports
+# * cyclic imports
+# * uses of deprecated modules
+#
+[IMPORTS]
+
+# Deprecated modules which should not be used, separated by a comma
+deprecated-modules=regsub,string,TERMIOS,Bastion,rexec
+
+# Create a graph of every (i.e. internal and external) dependencies in the
+# given file (report R0402 must not be disabled)
+import-graph=
+
+# Create a graph of external dependencies in the given file (report R0402 must
+# not be disabled)
+ext-import-graph=
+
+# Create a graph of internal dependencies in the given file (report R0402 must
+# not be disabled)
+int-import-graph=
+
+
+# checks for :
+# * methods without self as first argument
+# * overridden methods signature
+# * access only to existant members via self
+# * attributes not defined in the __init__ method
+# * supported interfaces implementation
+# * unreachable code
+#
+[CLASSES]
+
+# 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.
+ignore-iface-methods=isImplementedBy,deferred,extends,names,namesAndDescriptions,queryDescriptionFor,getBases,getDescriptionFor,getDoc,getName,getTaggedValue,getTaggedValueTags,isEqualOrExtendedBy,setTaggedValue,isImplementedByInstancesOf,adaptWith,is_implemented_by
+
+# List of method names used to declare (i.e. assign) instance attributes.
+defining-attr-methods=__init__,__new__,setUp
+
+
+# checks for similarities and duplicated code. This computation may be
+# memory / CPU intensive, so you should disable it if you experiments some
+# problems.
+#
+[SIMILARITIES]
+
+# Minimum lines number of a similarity.
+min-similarity-lines=10
+
+# Ignore comments when computing similarities.
+ignore-comments=yes
+
+# Ignore docstrings when computing similarities.
+ignore-docstrings=yes
+
+
+# checks for:
+# * warning notes in the code like FIXME, XXX
+# * PEP 263: source code with non ascii character but no encoding declaration
+#
+[MISCELLANEOUS]
+
+# List of note tags to take in consideration, separated by a comma.
+notes=FIXME,XXX,TODO
+
+
+# checks for :
+# * unauthorized constructions
+# * strict indentation
+# * line length
+# * use of <> instead of !=
+#
+[FORMAT]
+
+# Maximum number of characters on a single line.
+max-line-length=90
+
+# Maximum number of lines in a module
+max-module-lines=1000
+
+# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1
+# tab).
+indent-string=' '