diff --git a/.travis.yml b/.travis.yml
index ecc0bf8..7df4c41 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -55,6 +55,19 @@ notifications:
     on_failure: always
 
 deploy:
+  # test pypi
+  - provider: pypi
+    distributions: sdist bdist_wheel
+    server: https://test.pypi.org/legacy/
+    user: bavo.van.achte
+    password:
+      secure: cKCBgEUOSUnlPbOxHCrXENlVgdMGnjNC+7nnutp/1xF8VEDF3aj9Br4u5LKrAYs0sm0AvnCyjhPvfKGPwyRDdfGBjoG06G+L+1hcfpgBlItmdSBqB8RxMm2B76si1ZlVI9gC58hlk/agFr2vik/mLXsH23rafB/2UwfB3ItTTx2J14xC5jlaqYR/srMJUi8YO5z6mGGLokfcz0KhYUHegOna38UcARM8rkAC2Je0xrPKZMlCoTI84dqwnFPW4zn3g/B5s3s18gmZu4fE4+J1g0PNMvxhbDP1TIBzPSWXLBv+YPSKrIT6+Q4R/kfDJFzLn3SmDDnNOpD/OC8ssqVJOcQL3HhKQ7EAcxX9W+/Rt7mIpdJdDXohiPrBl9EdRYbhB+KiPeo/dekAV6loUP/8cHuEgjcW/gE8t+HIqWsa5SO9yK7Sz8Ym+0ENdzS1df0iPOj2ebR3kb1iwINdFi7zIG6Utvlf7w1A2Qtx1xfI2+woPU+GOgQrpwdw64Wl1uo4l0kqTpFkytIG7BEVWC+zPPzqddi+3Ulf9AkWSjNDTqYafxZ9oqBJ5q7WPH8zyPQHotcHbnziTAnv7qRa+CTFLeME/KXNT8egToLK75G367lANTFIhMm8eSDS7wAxFWHacq8j68wNb38Yj1Rv1WMHQh14sxOkzQ4hVEV0xYY7Bj8=
+    before_deploy:
+      - "env SETUP_TOOLS_SCM_PRETEND_VERSION='{next_version}.dev{distance}'"
+    on:
+      branch: master
+      python: 3.6
+      tags: false
   # production pypi
   - provider: pypi
     distributions: sdist bdist_wheel
diff --git a/src/mlx/warnings.py b/src/mlx/warnings.py
index 7f23c10..894f799 100644
--- a/src/mlx/warnings.py
+++ b/src/mlx/warnings.py
@@ -213,6 +213,7 @@ class WarningsPlugin:
         self.warn_min = 0
         self.warn_max = 0
         self.count = 0
+        self.printout = False
 
     def activate_checker(self, checker):
         '''
@@ -244,6 +245,8 @@ class WarningsPlugin:
         if len(self.checkerList) == 0:
             print("No checkers activated. Please use activate_checker function")
         else:
+            if self.printout:
+                print(content)
             for name, checker in self.checkerList.items():
                 checker.check(content)
 
@@ -309,6 +312,16 @@ class WarningsPlugin:
 
         return 0
 
+    def toggle_printout(self, printout):
+        ''' Toggle printout of all the parsed content
+
+        Useful for command input where we want to print content as well
+
+        Args:
+            printout: True enables the printout, False provides more silent mode
+        '''
+        self.printout = printout
+
 
 def warnings_wrapper(args):
     parser = argparse.ArgumentParser(prog='mlx-warnings')
@@ -319,6 +332,8 @@ def warnings_wrapper(args):
     parser.add_argument('-v', '--verbose', dest='verbose', action='store_true')
     parser.add_argument('--command', dest='command', action='store_true',
                         help='Treat program arguments as command to execute to obtain data')
+    parser.add_argument('--ignore-retval', dest='ignore', action='store_true',
+                        help='Ignore return value of the executed command')
     parser.add_argument('-m', '--maxwarnings', type=int, required=False, default=0,
                         help='Maximum amount of warnings accepted')
     parser.add_argument('--minwarnings', type=int, required=False, default=0,
@@ -338,7 +353,11 @@ def warnings_wrapper(args):
         cmd = args.logfile
         if args.flags:
             cmd.extend(args.flags)
-        warnings_command(warnings, cmd)
+        warnings.toggle_printout(True)
+        retval = warnings_command(warnings, cmd)
+
+        if (not args.ignore) and (retval != 0):
+            return retval
     else:
         warnings_logfile(warnings, args.logfile)
 
@@ -347,6 +366,24 @@ def warnings_wrapper(args):
 
 
 def warnings_command(warnings, cmd):
+    ''' Execute command to obtain input for parsing for warnings
+
+    Usually log files are output of the commands. To avoid this additional step
+    this function runs a command instead and parses the stderr and stdout of the
+    command for warnings.
+
+    Args:
+        warnings (WarningsPlugin): Object for warnings where errors should be logged
+        cmd: Command list, which should be executed to obtain input for parsing
+        ignore: Flag to ignore return value of the command
+
+    Return:
+        retval: Return value of executed command
+
+    Raises:
+        OSError: When program is not installed.
+    '''
+
     try:
         print("Executing: ", end='')
         print(cmd)
@@ -356,19 +393,16 @@ def warnings_command(warnings, cmd):
         # Check stdout
         if out:
             try:
-                print(out.decode(encoding="utf-8"))
                 warnings.check(out.decode(encoding="utf-8"))
             except AttributeError as e:
                 warnings.check(out)
-                print(out)
         # Check stderr
         if err:
             try:
                 warnings.check(err.decode(encoding="utf-8"))
-                print(err.decode(encoding="utf-8"), file=sys.stderr)
             except AttributeError as e:
                 warnings.check(err)
-                print(err, file=sys.stderr)
+        return proc.returncode
     except OSError as e:
         if e.errno == os.errno.ENOENT:
             print("It seems like program " + str(cmd) + " is not installed.")

Report command return value by default
If command exists with non 0 value, we just check if there are no warnings and we might mark a field as passed. Confirm the return value of the command and use that as a default return value. Provide flag to disregard that.
diff --git a/tests/test_integration.py b/tests/test_integration.py
index 4500dfb..9bc771a 100644
--- a/tests/test_integration.py
+++ b/tests/test_integration.py
@@ -50,6 +50,14 @@ class TestIntegration(TestCase):
         with self.assertRaises(OSError):
             warnings_wrapper(['--sphinx', '--command', 'blahahahaha', 'tests/sphinx_single_warning.txt'])
 
+    def test_command_revtal_err(self):
+        retval = warnings_wrapper(['--sphinx', '--command', 'false'])
+        self.assertEqual(1, retval)
+
+    def test_command_revtal_err_supress(self):
+        retval = warnings_wrapper(['--sphinx', '--ignore-retval', '--command', 'false'])
+        self.assertEqual(0, retval)
+
     def test_wildcarded_arguments(self):
         # note: no shell expansion simulation (e.g. as in windows)
         retval = warnings_wrapper(['--junit', 'tests/junit*.xml'])

pip install -e .[dev]
parse_log_pytest
pytest
pytest pytest-cov pytest-travis-fold
3.6
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
attrs @ file:///opt/conda/conda-bld/attrs_1642510447205/work
certifi==2021.5.30
coverage==6.2
importlib-metadata @ file:///tmp/build/80754af9/importlib-metadata_1631916693255/work
iniconfig @ file:///home/linux1/recipes/ci/iniconfig_1610983019677/work
junitparser==3.2.0
-e git+https://github.com/melexis/warnings-plugin.git@1a913d2e8b2d770ed4ec98eeb4238893d69ef66d#egg=mlx.warnings
more-itertools @ file:///tmp/build/80754af9/more-itertools_1637733554872/work
packaging @ file:///tmp/build/80754af9/packaging_1637314298585/work
pluggy @ file:///tmp/build/80754af9/pluggy_1615976315926/work
py @ file:///opt/conda/conda-bld/py_1644396412707/work
pyparsing @ file:///tmp/build/80754af9/pyparsing_1635766073266/work
pytest==6.2.4
pytest-cov==4.0.0
pytest-travis-fold==1.3.0
setuptools-scm==6.4.2
toml @ file:///tmp/build/80754af9/toml_1616166611790/work
tomli==1.2.3
typing_extensions @ file:///opt/conda/conda-bld/typing_extensions_1647553014482/work
zipp @ file:///tmp/build/80754af9/zipp_1633618647012/work

name: warnings-plugin
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - attrs=21.4.0=pyhd3eb1b0_0
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2021.5.30=py36h06a4308_0
  - importlib-metadata=4.8.1=py36h06a4308_0
  - importlib_metadata=4.8.1=hd3eb1b0_0
  - iniconfig=1.1.1=pyhd3eb1b0_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.3=he6710b0_2
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - more-itertools=8.12.0=pyhd3eb1b0_0
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - packaging=21.3=pyhd3eb1b0_0
  - pip=21.2.2=py36h06a4308_0
  - pluggy=0.13.1=py36h06a4308_0
  - py=1.11.0=pyhd3eb1b0_0
  - pyparsing=3.0.4=pyhd3eb1b0_0
  - pytest=6.2.4=py36h06a4308_2
  - python=3.6.13=h12debd9_1
  - readline=8.2=h5eee18b_0
  - setuptools=58.0.4=py36h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - toml=0.10.2=pyhd3eb1b0_0
  - typing_extensions=4.1.1=pyh06a4308_0
  - wheel=0.37.1=pyhd3eb1b0_0
  - xz=5.6.4=h5eee18b_1
  - zipp=3.6.0=pyhd3eb1b0_0
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - coverage==6.2
      - junitparser==3.2.0
      - pytest-cov==4.0.0
      - pytest-travis-fold==1.3.0
      - setuptools-scm==6.4.2
      - tomli==1.2.3
prefix: /opt/conda/envs/warnings-plugin

tests/test_integration.py::TestIntegration::test_command_revtal_err tests/test_integration.py::TestIntegration::test_command_revtal_err_supress
tests/test_integration.py::TestIntegration::test_command_to_stderr tests/test_integration.py::TestIntegration::test_command_with_its_own_arguments tests/test_integration.py::TestIntegration::test_faulty_command tests/test_integration.py::TestIntegration::test_help tests/test_integration.py::TestIntegration::test_max tests/test_integration.py::TestIntegration::test_max_but_still_ok tests/test_integration.py::TestIntegration::test_min tests/test_integration.py::TestIntegration::test_min_but_still_ok tests/test_integration.py::TestIntegration::test_no_parser_selection tests/test_integration.py::TestIntegration::test_single_argument tests/test_integration.py::TestIntegration::test_single_command_argument tests/test_integration.py::TestIntegration::test_two_arguments tests/test_integration.py::TestIntegration::test_two_command_arguments tests/test_integration.py::TestIntegration::test_version tests/test_integration.py::TestIntegration::test_wildcarded_arguments
src/mlx/warnings.py .travis.yml
src/mlx/warnings.py .travis.yml