summaryrefslogtreecommitdiff
path: root/hacking
diff options
context:
space:
mode:
authorToshio Kuratomi <a.badger@gmail.com>2019-07-02 12:18:40 -0700
committerToshio Kuratomi <a.badger@gmail.com>2019-07-10 22:17:35 -0700
commit33d2728879f8655337bc2157b723f1efa3a1920a (patch)
tree5979971d5050bb06883336f38f1b61c63f3155af /hacking
parent146a7f8ff614727423560470efec1fa774eab022 (diff)
downloadansible-33d2728879f8655337bc2157b723f1efa3a1920a.tar.gz
Rename python files in hacking/ directory to have .py suffix
ansible-test only passes files which have the .py suffix for sanity tests on python files. This change will allow sanity tests to run on the Python files in hacking/ * Rename test-module to test-module.py * Symlink test-module for backwards compat since end users may be using test-module * Fix test-module sanity errors that are now triggered * Rename ansible_profile to ansible-profile.py * Rename build-ansible
Diffstat (limited to 'hacking')
-rw-r--r--hacking/README.md10
-rwxr-xr-xhacking/ansible-profile (renamed from hacking/ansible_profile)0
-rwxr-xr-xhacking/build-ansible.py (renamed from hacking/build-ansible)2
-rw-r--r--hacking/build_library/build_ansible/commands.py4
-rwxr-xr-xhacking/return_skeleton_generator.py2
l---------[-rwxr-xr-x]hacking/test-module275
-rwxr-xr-xhacking/test-module.py277
7 files changed, 287 insertions, 283 deletions
diff --git a/hacking/README.md b/hacking/README.md
index 3df98a3c8a..b31c884f0f 100644
--- a/hacking/README.md
+++ b/hacking/README.md
@@ -21,15 +21,15 @@ can install them from pip
From there, follow ansible instructions on docs.ansible.com as normal.
-test-module
------------
+test-module.py
+--------------
-'test-module' is a simple program that allows module developers (or testers) to run
+'test-module.py' is a simple program that allows module developers (or testers) to run
a module outside of the ansible program, locally, on the current machine.
Example:
- $ ./hacking/test-module -m lib/ansible/modules/commands/command.py -a "echo hi"
+ $ ./hacking/test-module.py -m lib/ansible/modules/commands/command.py -a "echo hi"
This is a good way to insert a breakpoint into a module, for instance.
@@ -46,7 +46,7 @@ parent:
Use:
- $ ./hacking/test-module -m module \
+ $ ./hacking/test-module.py -m module \
-a '{"parent": {"child": [{"item": "first", "val": "foo"}, {"item": "second", "val": "bar"}]}}'
return_skeleton_generator.py
diff --git a/hacking/ansible_profile b/hacking/ansible-profile
index 6612402da6..6612402da6 100755
--- a/hacking/ansible_profile
+++ b/hacking/ansible-profile
diff --git a/hacking/build-ansible b/hacking/build-ansible.py
index 69f98c6f48..1a3517ae2b 100755
--- a/hacking/build-ansible
+++ b/hacking/build-ansible.py
@@ -56,7 +56,7 @@ def main():
arg_parser = create_arg_parser(os.path.basename(sys.argv[0]))
subparsers = arg_parser.add_subparsers(title='Subcommands', dest='command',
- help='for help use build-ansible SUBCOMMANDS -h')
+ help='for help use build-ansible.py SUBCOMMANDS -h')
subcommands.pipe('init_parser', subparsers.add_parser)
if argcomplete:
diff --git a/hacking/build_library/build_ansible/commands.py b/hacking/build_library/build_ansible/commands.py
index 363e8056fc..e689e25a37 100644
--- a/hacking/build_library/build_ansible/commands.py
+++ b/hacking/build_library/build_ansible/commands.py
@@ -12,9 +12,9 @@ from abc import ABCMeta, abstractmethod, abstractproperty
class Command:
"""
- Subcommands of :program:`build-ansible`.
+ Subcommands of :program:`build-ansible.py`.
- This defines an interface that all subcommands must conform to. :program:`build-ansible` will
+ This defines an interface that all subcommands must conform to. :program:`build-ansible.py` will
require that these things are present in order to proceed.
"""
@staticmethod
diff --git a/hacking/return_skeleton_generator.py b/hacking/return_skeleton_generator.py
index e464300837..adfe3d76c1 100755
--- a/hacking/return_skeleton_generator.py
+++ b/hacking/return_skeleton_generator.py
@@ -21,7 +21,7 @@
# and creates a starting point for the RETURNS section of a module.
# This can be provided as stdin or a file argument
#
-# The easiest way to obtain the JSON output is to use hacking/test-module
+# The easiest way to obtain the JSON output is to use hacking/test-module.py
#
# You will likely want to adjust this to remove sensitive data or
# ensure the `returns` value is correct, and to write a useful description
diff --git a/hacking/test-module b/hacking/test-module
index 1eb9c91252..1deb52b467 100755..120000
--- a/hacking/test-module
+++ b/hacking/test-module
@@ -1,274 +1 @@
-#!/usr/bin/env python
-
-# (c) 2012, Michael DeHaan <michael.dehaan@gmail.com>
-#
-# This file is part of Ansible
-#
-# Ansible 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 3 of the License, or
-# (at your option) any later version.
-#
-# Ansible 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 Ansible. If not, see <http://www.gnu.org/licenses/>.
-#
-
-# this script is for testing modules without running through the
-# entire guts of ansible, and is very helpful for when developing
-# modules
-#
-# example:
-# ./hacking/test-module -m lib/ansible/modules/commands/command.py -a "/bin/sleep 3"
-# ./hacking/test-module -m lib/ansible/modules/commands/command.py -a "/bin/sleep 3" --debugger /usr/bin/pdb
-# ./hacking/test-module -m lib/ansible/modules/files/lineinfile.py -a "dest=/etc/exports line='/srv/home hostname1(rw,sync)'" --check
-# ./hacking/test-module -m lib/ansible/modules/commands/command.py -a "echo hello" -n -o "test_hello"
-
-import optparse
-import os
-import subprocess
-import sys
-import traceback
-import shutil
-
-from ansible.release import __version__
-import ansible.utils.vars as utils_vars
-from ansible.parsing.dataloader import DataLoader
-from ansible.parsing.utils.jsonify import jsonify
-from ansible.parsing.splitter import parse_kv
-import ansible.executor.module_common as module_common
-import ansible.constants as C
-from ansible.module_utils._text import to_native, to_text
-from ansible.template import Templar
-
-import json
-
-
-def parse():
- """parse command line
-
- :return : (options, args)"""
- parser = optparse.OptionParser()
-
- parser.usage = "%prog -[options] (-h for help)"
-
- parser.add_option('-m', '--module-path', dest='module_path',
- help="REQUIRED: full path of module source to execute")
- parser.add_option('-a', '--args', dest='module_args', default="",
- help="module argument string")
- parser.add_option('-D', '--debugger', dest='debugger',
- help="path to python debugger (e.g. /usr/bin/pdb)")
- parser.add_option('-I', '--interpreter', dest='interpreter',
- help="path to interpreter to use for this module (e.g. ansible_python_interpreter=/usr/bin/python)",
- metavar='INTERPRETER_TYPE=INTERPRETER_PATH',
- default="ansible_python_interpreter=%s" % (sys.executable if sys.executable else '/usr/bin/python'))
- parser.add_option('-c', '--check', dest='check', action='store_true',
- help="run the module in check mode")
- parser.add_option('-n', '--noexecute', dest='execute', action='store_false',
- default=True, help="do not run the resulting module")
- parser.add_option('-o', '--output', dest='filename',
- help="Filename for resulting module",
- default="~/.ansible_module_generated")
- options, args = parser.parse_args()
- if not options.module_path:
- parser.print_help()
- sys.exit(1)
- else:
- return options, args
-
-
-def write_argsfile(argstring, json=False):
- """ Write args to a file for old-style module's use. """
- argspath = os.path.expanduser("~/.ansible_test_module_arguments")
- argsfile = open(argspath, 'w')
- if json:
- args = parse_kv(argstring)
- argstring = jsonify(args)
- argsfile.write(argstring)
- argsfile.close()
- return argspath
-
-
-def get_interpreters(interpreter):
- result = dict()
- if interpreter:
- if '=' not in interpreter:
- print("interpreter must by in the form of ansible_python_interpreter=/usr/bin/python")
- sys.exit(1)
- interpreter_type, interpreter_path = interpreter.split('=')
- if not interpreter_type.startswith('ansible_'):
- interpreter_type = 'ansible_%s' % interpreter_type
- if not interpreter_type.endswith('_interpreter'):
- interpreter_type = '%s_interpreter' % interpreter_type
- result[interpreter_type] = interpreter_path
- return result
-
-
-def boilerplate_module(modfile, args, interpreters, check, destfile):
- """ simulate what ansible does with new style modules """
-
- # module_fh = open(modfile)
- # module_data = module_fh.read()
- # module_fh.close()
-
- # replacer = module_common.ModuleReplacer()
- loader = DataLoader()
-
- # included_boilerplate = module_data.find(module_common.REPLACER) != -1 or module_data.find("import ansible.module_utils") != -1
-
- complex_args = {}
-
- # default selinux fs list is pass in as _ansible_selinux_special_fs arg
- complex_args['_ansible_selinux_special_fs'] = C.DEFAULT_SELINUX_SPECIAL_FS
- complex_args['_ansible_tmpdir'] = C.DEFAULT_LOCAL_TMP
- complex_args['_ansible_keep_remote_files'] = C.DEFAULT_KEEP_REMOTE_FILES
- complex_args['_ansible_version'] = __version__
-
- if args.startswith("@"):
- # Argument is a YAML file (JSON is a subset of YAML)
- complex_args = utils_vars.combine_vars(complex_args, loader.load_from_file(args[1:]))
- args=''
- elif args.startswith("{"):
- # Argument is a YAML document (not a file)
- complex_args = utils_vars.combine_vars(complex_args, loader.load(args))
- args=''
-
- if args:
- parsed_args = parse_kv(args)
- complex_args = utils_vars.combine_vars(complex_args, parsed_args)
-
- task_vars = interpreters
-
- if check:
- complex_args['_ansible_check_mode'] = True
-
- modname = os.path.basename(modfile)
- modname = os.path.splitext(modname)[0]
- (module_data, module_style, shebang) = module_common.modify_module(
- modname,
- modfile,
- complex_args,
- Templar(loader=loader),
- task_vars=task_vars
- )
-
- if module_style == 'new' and '_ANSIBALLZ_WRAPPER = True' in to_native(module_data):
- module_style = 'ansiballz'
-
- modfile2_path = os.path.expanduser(destfile)
- print("* including generated source, if any, saving to: %s" % modfile2_path)
- if module_style not in ('ansiballz', 'old'):
- print("* this may offset any line numbers in tracebacks/debuggers!")
- modfile2 = open(modfile2_path, 'wb')
- modfile2.write(module_data)
- modfile2.close()
- modfile = modfile2_path
-
- return (modfile2_path, modname, module_style)
-
-
-def ansiballz_setup(modfile, modname, interpreters):
- os.system("chmod +x %s" % modfile)
-
- if 'ansible_python_interpreter' in interpreters:
- command = [interpreters['ansible_python_interpreter']]
- else:
- command = []
- command.extend([modfile, 'explode'])
-
- cmd = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
- out, err = cmd.communicate()
- out, err = to_text(out, errors='surrogate_or_strict'), to_text(err)
- lines = out.splitlines()
- if len(lines) != 2 or 'Module expanded into' not in lines[0]:
- print("*" * 35)
- print("INVALID OUTPUT FROM ANSIBALLZ MODULE WRAPPER")
- print(out)
- sys.exit(err)
- debug_dir = lines[1].strip()
-
- argsfile = os.path.join(debug_dir, 'args')
- modfile = os.path.join(debug_dir, '__main__.py')
-
- print("* ansiballz module detected; extracted module source to: %s" % debug_dir)
- return modfile, argsfile
-
-
-def runtest(modfile, argspath, modname, module_style, interpreters):
- """Test run a module, piping it's output for reporting."""
- invoke = ""
- if module_style == 'ansiballz':
- modfile, argspath = ansiballz_setup(modfile, modname, interpreters)
- if 'ansible_python_interpreter' in interpreters:
- invoke = "%s " % interpreters['ansible_python_interpreter']
-
- os.system("chmod +x %s" % modfile)
-
- invoke = "%s%s" % (invoke, modfile)
- if argspath is not None:
- invoke = "%s %s" % (invoke, argspath)
-
- cmd = subprocess.Popen(invoke, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
- (out, err) = cmd.communicate()
- out, err = to_text(out), to_text(err)
-
- try:
- print("*" * 35)
- print("RAW OUTPUT")
- print(out)
- print(err)
- results = json.loads(out)
- except Exception:
- print("*" * 35)
- print("INVALID OUTPUT FORMAT")
- print(out)
- traceback.print_exc()
- sys.exit(1)
-
- print("*" * 35)
- print("PARSED OUTPUT")
- print(jsonify(results,format=True))
-
-
-def rundebug(debugger, modfile, argspath, modname, module_style, interpreters):
- """Run interactively with console debugger."""
-
- if module_style == 'ansiballz':
- modfile, argspath = ansiballz_setup(modfile, modname, interpreters)
-
- if argspath is not None:
- subprocess.call("%s %s %s" % (debugger, modfile, argspath), shell=True)
- else:
- subprocess.call("%s %s" % (debugger, modfile), shell=True)
-
-
-def main():
-
- options, args = parse()
- interpreters = get_interpreters(options.interpreter)
- (modfile, modname, module_style) = boilerplate_module(options.module_path, options.module_args, interpreters, options.check, options.filename)
-
- argspath = None
- if module_style not in ('new', 'ansiballz'):
- if module_style in ('non_native_want_json', 'binary'):
- argspath = write_argsfile(options.module_args, json=True)
- elif module_style == 'old':
- argspath = write_argsfile(options.module_args, json=False)
- else:
- raise Exception("internal error, unexpected module style: %s" % module_style)
-
- if options.execute:
- if options.debugger:
- rundebug(options.debugger, modfile, argspath, modname, module_style, interpreters)
- else:
- runtest(modfile, argspath, modname, module_style, interpreters)
-
-if __name__ == "__main__":
- try:
- main()
- finally:
- shutil.rmtree(C.DEFAULT_LOCAL_TMP, True)
+test-module.py \ No newline at end of file
diff --git a/hacking/test-module.py b/hacking/test-module.py
new file mode 100755
index 0000000000..72b387cc92
--- /dev/null
+++ b/hacking/test-module.py
@@ -0,0 +1,277 @@
+#!/usr/bin/env python
+
+# (c) 2012, Michael DeHaan <michael.dehaan@gmail.com>
+#
+# This file is part of Ansible
+#
+# Ansible 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 3 of the License, or
+# (at your option) any later version.
+#
+# Ansible 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 Ansible. If not, see <http://www.gnu.org/licenses/>.
+#
+
+# this script is for testing modules without running through the
+# entire guts of ansible, and is very helpful for when developing
+# modules
+#
+# example:
+# ./hacking/test-module.py -m lib/ansible/modules/commands/command.py -a "/bin/sleep 3"
+# ./hacking/test-module.py -m lib/ansible/modules/commands/command.py -a "/bin/sleep 3" --debugger /usr/bin/pdb
+# ./hacking/test-module.py -m lib/ansible/modules/files/lineinfile.py -a "dest=/etc/exports line='/srv/home hostname1(rw,sync)'" --check
+# ./hacking/test-module.py -m lib/ansible/modules/commands/command.py -a "echo hello" -n -o "test_hello"
+
+import optparse
+import os
+import subprocess
+import sys
+import traceback
+import shutil
+
+from ansible.release import __version__
+import ansible.utils.vars as utils_vars
+from ansible.parsing.dataloader import DataLoader
+from ansible.parsing.utils.jsonify import jsonify
+from ansible.parsing.splitter import parse_kv
+import ansible.executor.module_common as module_common
+import ansible.constants as C
+from ansible.module_utils._text import to_native, to_text
+from ansible.template import Templar
+
+import json
+
+
+def parse():
+ """parse command line
+
+ :return : (options, args)"""
+ parser = optparse.OptionParser()
+
+ parser.usage = "%prog -[options] (-h for help)"
+
+ parser.add_option('-m', '--module-path', dest='module_path',
+ help="REQUIRED: full path of module source to execute")
+ parser.add_option('-a', '--args', dest='module_args', default="",
+ help="module argument string")
+ parser.add_option('-D', '--debugger', dest='debugger',
+ help="path to python debugger (e.g. /usr/bin/pdb)")
+ parser.add_option('-I', '--interpreter', dest='interpreter',
+ help="path to interpreter to use for this module"
+ " (e.g. ansible_python_interpreter=/usr/bin/python)",
+ metavar='INTERPRETER_TYPE=INTERPRETER_PATH',
+ default="ansible_python_interpreter=%s" %
+ (sys.executable if sys.executable else '/usr/bin/python'))
+ parser.add_option('-c', '--check', dest='check', action='store_true',
+ help="run the module in check mode")
+ parser.add_option('-n', '--noexecute', dest='execute', action='store_false',
+ default=True, help="do not run the resulting module")
+ parser.add_option('-o', '--output', dest='filename',
+ help="Filename for resulting module",
+ default="~/.ansible_module_generated")
+ options, args = parser.parse_args()
+ if not options.module_path:
+ parser.print_help()
+ sys.exit(1)
+ else:
+ return options, args
+
+
+def write_argsfile(argstring, json=False):
+ """ Write args to a file for old-style module's use. """
+ argspath = os.path.expanduser("~/.ansible_test_module_arguments")
+ argsfile = open(argspath, 'w')
+ if json:
+ args = parse_kv(argstring)
+ argstring = jsonify(args)
+ argsfile.write(argstring)
+ argsfile.close()
+ return argspath
+
+
+def get_interpreters(interpreter):
+ result = dict()
+ if interpreter:
+ if '=' not in interpreter:
+ print("interpreter must by in the form of ansible_python_interpreter=/usr/bin/python")
+ sys.exit(1)
+ interpreter_type, interpreter_path = interpreter.split('=')
+ if not interpreter_type.startswith('ansible_'):
+ interpreter_type = 'ansible_%s' % interpreter_type
+ if not interpreter_type.endswith('_interpreter'):
+ interpreter_type = '%s_interpreter' % interpreter_type
+ result[interpreter_type] = interpreter_path
+ return result
+
+
+def boilerplate_module(modfile, args, interpreters, check, destfile):
+ """ simulate what ansible does with new style modules """
+
+ # module_fh = open(modfile)
+ # module_data = module_fh.read()
+ # module_fh.close()
+
+ # replacer = module_common.ModuleReplacer()
+ loader = DataLoader()
+
+ # included_boilerplate = module_data.find(module_common.REPLACER) != -1 or module_data.find("import ansible.module_utils") != -1
+
+ complex_args = {}
+
+ # default selinux fs list is pass in as _ansible_selinux_special_fs arg
+ complex_args['_ansible_selinux_special_fs'] = C.DEFAULT_SELINUX_SPECIAL_FS
+ complex_args['_ansible_tmpdir'] = C.DEFAULT_LOCAL_TMP
+ complex_args['_ansible_keep_remote_files'] = C.DEFAULT_KEEP_REMOTE_FILES
+ complex_args['_ansible_version'] = __version__
+
+ if args.startswith("@"):
+ # Argument is a YAML file (JSON is a subset of YAML)
+ complex_args = utils_vars.combine_vars(complex_args, loader.load_from_file(args[1:]))
+ args = ''
+ elif args.startswith("{"):
+ # Argument is a YAML document (not a file)
+ complex_args = utils_vars.combine_vars(complex_args, loader.load(args))
+ args = ''
+
+ if args:
+ parsed_args = parse_kv(args)
+ complex_args = utils_vars.combine_vars(complex_args, parsed_args)
+
+ task_vars = interpreters
+
+ if check:
+ complex_args['_ansible_check_mode'] = True
+
+ modname = os.path.basename(modfile)
+ modname = os.path.splitext(modname)[0]
+ (module_data, module_style, shebang) = module_common.modify_module(
+ modname,
+ modfile,
+ complex_args,
+ Templar(loader=loader),
+ task_vars=task_vars
+ )
+
+ if module_style == 'new' and '_ANSIBALLZ_WRAPPER = True' in to_native(module_data):
+ module_style = 'ansiballz'
+
+ modfile2_path = os.path.expanduser(destfile)
+ print("* including generated source, if any, saving to: %s" % modfile2_path)
+ if module_style not in ('ansiballz', 'old'):
+ print("* this may offset any line numbers in tracebacks/debuggers!")
+ modfile2 = open(modfile2_path, 'wb')
+ modfile2.write(module_data)
+ modfile2.close()
+ modfile = modfile2_path
+
+ return (modfile2_path, modname, module_style)
+
+
+def ansiballz_setup(modfile, modname, interpreters):
+ os.system("chmod +x %s" % modfile)
+
+ if 'ansible_python_interpreter' in interpreters:
+ command = [interpreters['ansible_python_interpreter']]
+ else:
+ command = []
+ command.extend([modfile, 'explode'])
+
+ cmd = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+ out, err = cmd.communicate()
+ out, err = to_text(out, errors='surrogate_or_strict'), to_text(err)
+ lines = out.splitlines()
+ if len(lines) != 2 or 'Module expanded into' not in lines[0]:
+ print("*" * 35)
+ print("INVALID OUTPUT FROM ANSIBALLZ MODULE WRAPPER")
+ print(out)
+ sys.exit(err)
+ debug_dir = lines[1].strip()
+
+ argsfile = os.path.join(debug_dir, 'args')
+ modfile = os.path.join(debug_dir, '__main__.py')
+
+ print("* ansiballz module detected; extracted module source to: %s" % debug_dir)
+ return modfile, argsfile
+
+
+def runtest(modfile, argspath, modname, module_style, interpreters):
+ """Test run a module, piping it's output for reporting."""
+ invoke = ""
+ if module_style == 'ansiballz':
+ modfile, argspath = ansiballz_setup(modfile, modname, interpreters)
+ if 'ansible_python_interpreter' in interpreters:
+ invoke = "%s " % interpreters['ansible_python_interpreter']
+
+ os.system("chmod +x %s" % modfile)
+
+ invoke = "%s%s" % (invoke, modfile)
+ if argspath is not None:
+ invoke = "%s %s" % (invoke, argspath)
+
+ cmd = subprocess.Popen(invoke, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+ (out, err) = cmd.communicate()
+ out, err = to_text(out), to_text(err)
+
+ try:
+ print("*" * 35)
+ print("RAW OUTPUT")
+ print(out)
+ print(err)
+ results = json.loads(out)
+ except Exception:
+ print("*" * 35)
+ print("INVALID OUTPUT FORMAT")
+ print(out)
+ traceback.print_exc()
+ sys.exit(1)
+
+ print("*" * 35)
+ print("PARSED OUTPUT")
+ print(jsonify(results, format=True))
+
+
+def rundebug(debugger, modfile, argspath, modname, module_style, interpreters):
+ """Run interactively with console debugger."""
+
+ if module_style == 'ansiballz':
+ modfile, argspath = ansiballz_setup(modfile, modname, interpreters)
+
+ if argspath is not None:
+ subprocess.call("%s %s %s" % (debugger, modfile, argspath), shell=True)
+ else:
+ subprocess.call("%s %s" % (debugger, modfile), shell=True)
+
+
+def main():
+
+ options, args = parse()
+ interpreters = get_interpreters(options.interpreter)
+ (modfile, modname, module_style) = boilerplate_module(options.module_path, options.module_args, interpreters, options.check, options.filename)
+
+ argspath = None
+ if module_style not in ('new', 'ansiballz'):
+ if module_style in ('non_native_want_json', 'binary'):
+ argspath = write_argsfile(options.module_args, json=True)
+ elif module_style == 'old':
+ argspath = write_argsfile(options.module_args, json=False)
+ else:
+ raise Exception("internal error, unexpected module style: %s" % module_style)
+
+ if options.execute:
+ if options.debugger:
+ rundebug(options.debugger, modfile, argspath, modname, module_style, interpreters)
+ else:
+ runtest(modfile, argspath, modname, module_style, interpreters)
+
+
+if __name__ == "__main__":
+ try:
+ main()
+ finally:
+ shutil.rmtree(C.DEFAULT_LOCAL_TMP, True)