blob: 7609a96de90f0d68844a22549528349acd33b357 [file] [log] [blame]
# Copyright 2016 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Some constants used throughout Monorail."""
from __future__ import print_function
from __future__ import division
from __future__ import absolute_import
import os
import re
# Number of seconds in various periods.
SECS_PER_MINUTE = 60
SECS_PER_HOUR = SECS_PER_MINUTE * 60
SECS_PER_DAY = SECS_PER_HOUR * 24
SECS_PER_MONTH = SECS_PER_DAY * 30
SECS_PER_YEAR = SECS_PER_DAY * 365
# When we write to memcache, let the values expire so that we don't
# get any unexpected super-old values as we make code changes over the
# years. Also, searches can contain date terms like [opened<today-1]
# that would become wrong if cached for a long time.
CACHE_EXPIRATION = 6 * SECS_PER_HOUR
# Fulltext indexing happens asynchronously and we get no notification
# when the indexing operation has completed. So, when we cache searches
# that use fulltext terms, the results might be stale. We still do
# cache them and use the cached values, but we expire them so that the
# results cannot be stale for a long period of time.
FULLTEXT_MEMCACHE_EXPIRATION = 3 * SECS_PER_MINUTE
# Size in bytes of the largest form submission that we will accept
MAX_POST_BODY_SIZE = 10 * 1024 * 1024 # = 10 MB
# Special issue ID to use when an issue is explicitly not specified.
NO_ISSUE_SPECIFIED = 0
# Special user ID and name to use when no user was specified.
NO_USER_SPECIFIED = 0
NO_SESSION_SPECIFIED = 0
NO_USER_NAME = '----'
DELETED_USER_NAME = 'a_deleted_user'
DELETED_USER_ID = 1
USER_NOT_FOUND_NAME = 'user_not_found'
# Queues for deleting users tasks.
QUEUE_SEND_WIPEOUT_USER_LISTS = 'wipeoutsendusers'
QUEUE_FETCH_WIPEOUT_DELETED_USERS = 'wipeoutdeleteusers'
QUEUE_DELETE_USERS = 'deleteusers'
# We remember the time of each user's last page view, but to reduce the
# number of database writes, we only update it if it is newer by an hour.
VISIT_RESOLUTION = 1 * SECS_PER_HOUR
# String to display when some field has no value.
NO_VALUES = '----'
# If the user enters one or more dashes, that means "no value". This is useful
# in bulk edit, inbound email, and commit log command where a blank field
# means "keep what was there" or is ignored.
NO_VALUE_RE = re.compile(r'^-+$')
# Used to loosely validate column spec. Mainly guards against malicious input.
COLSPEC_RE = re.compile(r'^[-.\w\s/]*$', re.UNICODE)
COLSPEC_COL_RE = re.compile(r'[-.\w/]+', re.UNICODE)
MAX_COL_PARTS = 25
MAX_COL_LEN = 50
# Used to loosely validate sort spec. Mainly guards against malicious input.
SORTSPEC_RE = re.compile(r'^[-.\w\s/]*$', re.UNICODE)
MAX_SORT_PARTS = 6
# For the artifact search box autosizing when the user types a long query.
MIN_ARTIFACT_SEARCH_FIELD_SIZE = 38
MAX_ARTIFACT_SEARCH_FIELD_SIZE = 75
AUTOSIZE_STEP = 3
# Regular expressions used in parsing label and status configuration text
IDENTIFIER_REGEX = r'[-.\w]+'
IDENTIFIER_RE = re.compile(IDENTIFIER_REGEX, re.UNICODE)
# Labels and status values that are prefixed by a pound-sign are not displayed
# in autocomplete menus.
IDENTIFIER_DOCSTRING_RE = re.compile(
r'^(#?%s)[ \t]*=?[ \t]*(.*)$' % IDENTIFIER_REGEX,
re.MULTILINE | re.UNICODE)
# Number of label text fields that we can display on a web form for issues.
MAX_LABELS = 24
# Default number of comments to display on an artifact detail page at one time.
# Other comments will be paginated.
DEFAULT_COMMENTS_PER_PAGE = 100
# Content type to use when serving JSON.
CONTENT_TYPE_JSON = 'application/json; charset=UTF-8'
CONTENT_TYPE_JSON_OPTIONS = 'nosniff'
# Maximum comments to index to keep the search index from choking. E.g., if an
# artifact had 1200 comments, only 0..99 and 701..1200 would be indexed.
# This mainly affects advocacy issues which are highly redundant anyway.
INITIAL_COMMENTS_TO_INDEX = 100
FINAL_COMMENTS_TO_INDEX = 500
# This is the longest string that GAE search will accept in one field.
# The entire search document is also limited to 1MB, so our limit is 200 * 1024
# chars so that each can be 4 bytes and the comments leave room for metadata.
# https://cloud.google.com/appengine/docs/standard/python/search/#documents
MAX_FTS_FIELD_SIZE = 200 * 1024
# Base path to EZT templates.
this_dir = os.path.dirname(__file__)
TEMPLATE_PATH = this_dir[:this_dir.rindex('/')] + '/templates/'
# Defaults for dooming a project.
DEFAULT_DOOM_REASON = 'No longer needed'
DEFAULT_DOOM_PERIOD = SECS_PER_DAY * 90
MAX_PROJECT_PEOPLE = 1000
MAX_HOTLIST_NAME_LENGTH = 80
# When logging potentially long debugging strings, only show this many chars.
LOGGING_MAX_LENGTH = 2000
# Maps languages supported by google-code-prettify
# to the class name that should be added to code blocks in that language.
# This list should be kept in sync with the handlers registered
# in lang-*.js and prettify.js from the prettify project.
PRETTIFY_CLASS_MAP = {
ext: 'lang-' + ext
for ext in [
# Supported in lang-*.js
'apollo', 'agc', 'aea', 'lisp', 'el', 'cl', 'scm',
'css', 'go', 'hs', 'lua', 'fs', 'ml', 'proto', 'scala', 'sql', 'vb',
'vbs', 'vhdl', 'vhd', 'wiki', 'yaml', 'yml', 'clj',
# Supported in prettify.js
'htm', 'html', 'mxml', 'xhtml', 'xml', 'xsl',
'c', 'cc', 'cpp', 'cxx', 'cyc', 'm',
'json', 'cs', 'java', 'bsh', 'csh', 'sh', 'cv', 'py', 'perl', 'pl',
'pm', 'rb', 'js', 'coffee',
]}
# Languages which are not specifically mentioned in prettify.js
# but which render intelligibly with the default handler.
PRETTIFY_CLASS_MAP.update(
(ext, '') for ext in [
'hpp', 'hxx', 'hh', 'h', 'inl', 'idl', 'swig', 'd',
'php', 'tcl', 'aspx', 'cfc', 'cfm',
'ent', 'mod', 'as',
'y', 'lex', 'awk', 'n', 'pde',
])
# Languages which are not specifically mentioned in prettify.js
# but which should be rendered using a certain prettify module.
PRETTIFY_CLASS_MAP.update({
'docbook': 'lang-xml',
'dtd': 'lang-xml',
'duby': 'lang-rb',
'mk': 'lang-sh',
'mak': 'lang-sh',
'make': 'lang-sh',
'mirah': 'lang-rb',
'ss': 'lang-lisp',
'vcproj': 'lang-xml',
'xsd': 'lang-xml',
'xslt': 'lang-xml',
})
PRETTIFY_FILENAME_CLASS_MAP = {
'makefile': 'lang-sh',
'makefile.in': 'lang-sh',
'doxyfile': 'lang-sh', # Key-value pairs with hash comments
'.checkstyle': 'lang-xml',
'.classpath': 'lang-xml',
'.project': 'lang-xml',
}
OAUTH_SCOPE = 'https://www.googleapis.com/auth/userinfo.email'
MONORAIL_SCOPE = 'https://www.googleapis.com/auth/monorail'
FILENAME_RE = re.compile('^[-_.a-zA-Z0-9 #+()]+$')