#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#    http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

[nosetests]
# Allow discovery of Python test files marked executable.
exe=True
verbosity=2
# TODO(silviuc): Find a way to run the remaining tests excluded here.
#
# The following tests are excluded because they try to load the Cython-based
# fast_coders module which is not available when running unit tests:
# fast_coders_test and typecoders_test.
exclude=fast_coders_test|typecoders_test

# Creates an xml file compatible with standard XUnit XML format.
with-xunit=1

# Configurations to control coverage.py.
[coverage:run]
branch = True
source = apache_beam
omit =
  # Omit auto-generated files by the protocol buffer compiler.
  apache_beam/portability/api/*_pb2.py
  apache_beam/portability/api/*_pb2_grpc.py

[coverage:report]
# Regexes for lines to exclude from consideration
exclude_lines =
  # Have to re-enable the standard pragma
  pragma: no cover
  abc.abstractmethod

  # Don't complain about missing debug-only code:
  def __repr__
  if self\.debug

  # Don't complain if tests don't hit defensive assertion code:
  raise NotImplementedError

  # Don't complain if non-runnable code isn't run:
  if __name__ == .__main__.:

[coverage:xml]
output = target/site/cobertura/coverage.xml
