summaryrefslogtreecommitdiff
path: root/gr-utils/src/python
diff options
context:
space:
mode:
authorMartin Braun2013-01-28 15:26:05 +0100
committerMartin Braun2013-01-28 15:26:05 +0100
commit2d695b3c4c86b5c206f95dcc1d71f97d808d98b8 (patch)
treecf52a650d74ada32663cc9bc04ee5e64bd1e0f83 /gr-utils/src/python
parentede34060de27184eb6f6df6b5fd03ae8a643bf91 (diff)
downloadgnuradio-2d695b3c4c86b5c206f95dcc1d71f97d808d98b8.tar.gz
gnuradio-2d695b3c4c86b5c206f95dcc1d71f97d808d98b8.tar.bz2
gnuradio-2d695b3c4c86b5c206f95dcc1d71f97d808d98b8.zip
modtool: cleanup, bugfixes
Diffstat (limited to 'gr-utils/src/python')
-rwxr-xr-xgr-utils/src/python/gr_modtool20
-rw-r--r--gr-utils/src/python/modtool/__init__.py5
-rw-r--r--gr-utils/src/python/modtool/cmakefile_editor.py2
-rw-r--r--gr-utils/src/python/modtool/modtool_add.py1
-rw-r--r--gr-utils/src/python/modtool/modtool_base.py28
-rw-r--r--gr-utils/src/python/modtool/modtool_disable.py19
-rw-r--r--gr-utils/src/python/modtool/modtool_help.py4
-rw-r--r--gr-utils/src/python/modtool/modtool_info.py2
-rw-r--r--gr-utils/src/python/modtool/modtool_makexml.py26
-rw-r--r--gr-utils/src/python/modtool/modtool_newmod.py2
-rw-r--r--gr-utils/src/python/modtool/modtool_rm.py19
-rw-r--r--gr-utils/src/python/modtool/parser_cc_block.py5
-rw-r--r--gr-utils/src/python/modtool/templates.py6
-rw-r--r--gr-utils/src/python/modtool/util_functions.py19
14 files changed, 53 insertions, 105 deletions
diff --git a/gr-utils/src/python/gr_modtool b/gr-utils/src/python/gr_modtool
index bc41d56f5..8c5c710af 100755
--- a/gr-utils/src/python/gr_modtool
+++ b/gr-utils/src/python/gr_modtool
@@ -24,24 +24,9 @@
import sys
from gnuradio.modtool import *
-def get_class_dict():
- " Return a dictionary of the available commands in the form command->class "
- classdict = {}
- for g in globals().values():
- try:
- if issubclass(g, ModTool):
- classdict[g.name] = g
- for a in g.aliases:
- classdict[a] = g
- except (TypeError, AttributeError):
- pass
- return classdict
-
-
-### Main code ################################################################
def main():
""" Here we go. Parse command, choose class and run. """
- cmd_dict = get_class_dict()
+ cmd_dict = get_class_dict(globals().values())
command = get_command_from_argv(cmd_dict.keys())
if command is None:
print 'Usage:' + templates.Templates['usage']
@@ -51,9 +36,6 @@ def main():
modtool.run()
if __name__ == '__main__':
- if not ((sys.version_info[0] > 2) or
- (sys.version_info[0] == 2 and sys.version_info[1] >= 7)):
- print "Using Python < 2.7 is not recommended for gr_modtool."
try:
main()
except KeyboardInterrupt:
diff --git a/gr-utils/src/python/modtool/__init__.py b/gr-utils/src/python/modtool/__init__.py
index 7935e4b48..a242722ab 100644
--- a/gr-utils/src/python/modtool/__init__.py
+++ b/gr-utils/src/python/modtool/__init__.py
@@ -22,13 +22,14 @@
from cmakefile_editor import CMakeFileEditor
from code_generator import GRMTemplate
from grc_xml_generator import GRCXMLGenerator
+from modtool_base import ModTool, get_class_dict
from modtool_add import ModToolAdd
-from modtool_base import ModTool
from modtool_disable import ModToolDisable
-from modtool_help import ModToolHelp
from modtool_info import ModToolInfo
from modtool_makexml import ModToolMakeXML
from modtool_newmod import ModToolNewModule
from modtool_rm import ModToolRemove
+# Leave this at the end
+from modtool_help import ModToolHelp
from parser_cc_block import ParserCCBlock
from util_functions import *
diff --git a/gr-utils/src/python/modtool/cmakefile_editor.py b/gr-utils/src/python/modtool/cmakefile_editor.py
index 92121dda3..3d90b8d16 100644
--- a/gr-utils/src/python/modtool/cmakefile_editor.py
+++ b/gr-utils/src/python/modtool/cmakefile_editor.py
@@ -49,7 +49,7 @@ class CMakeFileEditor(object):
"""Remove an entry from the current buffer."""
regexp = '%s\s*\([^()]*%s[^()]*\)[^\n]*\n' % (entry, value_pattern)
regexp = re.compile(regexp, re.MULTILINE)
- (self.cfile, nsubs) = re.sub(regexp, '', self.cfile, count=1)
+ (self.cfile, nsubs) = re.subn(regexp, '', self.cfile, count=1)
return nsubs
def write(self):
diff --git a/gr-utils/src/python/modtool/modtool_add.py b/gr-utils/src/python/modtool/modtool_add.py
index 32cfe0440..7ca375b6f 100644
--- a/gr-utils/src/python/modtool/modtool_add.py
+++ b/gr-utils/src/python/modtool/modtool_add.py
@@ -45,7 +45,6 @@ class ModToolAdd(ModTool):
def setup_parser(self):
parser = ModTool.setup_parser(self)
- parser.usage = '%prog add [options]. \n Call %prog without any options to run it interactively.'
ogroup = OptionGroup(parser, "Add module options")
ogroup.add_option("-t", "--block-type", type="choice",
choices=self._block_types, default=None, help="One of %s." % ', '.join(self._block_types))
diff --git a/gr-utils/src/python/modtool/modtool_base.py b/gr-utils/src/python/modtool/modtool_base.py
index d824910e9..3f8f2bc3c 100644
--- a/gr-utils/src/python/modtool/modtool_base.py
+++ b/gr-utils/src/python/modtool/modtool_base.py
@@ -28,6 +28,7 @@ from optparse import OptionParser, OptionGroup
from util_functions import get_modname
from templates import Templates
+
class ModTool(object):
""" Base class for all modtool command classes. """
def __init__(self):
@@ -47,15 +48,17 @@ class ModTool(object):
def setup_parser(self):
""" Init the option parser. If derived classes need to add options,
override this and call the parent function. """
- parser = OptionParser(usage=Templates['usage'], add_help_option=False)
+ parser = OptionParser(add_help_option=False)
+ parser.usage = '%prog ' + self.name + ' [options] <PATTERN> \n' + \
+ ' Call "%prog ' + self.name + '" without any options to run it interactively.'
ogroup = OptionGroup(parser, "General options")
ogroup.add_option("-h", "--help", action="help", help="Displays this help message.")
ogroup.add_option("-d", "--directory", type="string", default=".",
- help="Base directory of the module.")
+ help="Base directory of the module. Defaults to the cwd.")
ogroup.add_option("-n", "--module-name", type="string", default=None,
- help="Name of the GNU Radio module. If possible, this gets detected from CMakeLists.txt.")
+ help="Use this to override the current module's name (is normally autodetected).")
ogroup.add_option("-N", "--block-name", type="string", default=None,
- help="Name of the block, minus the module name prefix.")
+ help="Name of the block, where applicable.")
ogroup.add_option("--skip-lib", action="store_true", default=False,
help="Don't do anything in the lib/ subdirectory.")
ogroup.add_option("--skip-swig", action="store_true", default=False,
@@ -64,6 +67,8 @@ class ModTool(object):
help="Don't do anything in the python/ subdirectory.")
ogroup.add_option("--skip-grc", action="store_true", default=False,
help="Don't do anything in the grc/ subdirectory.")
+ ogroup.add_option("-y", "--yes", action="store_true", default=False,
+ help="Answer all questions with 'yes'. This can overwrite and delete your files, so be careful.")
parser.add_option_group(ogroup)
return parser
@@ -74,7 +79,6 @@ class ModTool(object):
if not self._check_directory(self._dir):
print "No GNU Radio module found in the given directory. Quitting."
sys.exit(1)
- print "Operating in directory " + self._dir
if options.module_name is not None:
self._info['modname'] = options.module_name
else:
@@ -96,6 +100,7 @@ class ModTool(object):
self._info['blockname'] = options.block_name
self.options = options
self._setup_files()
+ self._info['yes'] = options.yes
def _setup_files(self):
""" Initialise the self._file[] dictionary """
@@ -156,3 +161,16 @@ class ModTool(object):
""" Override this. """
pass
+def get_class_dict(the_globals):
+ " Return a dictionary of the available commands in the form command->class "
+ classdict = {}
+ for g in the_globals:
+ try:
+ if issubclass(g, ModTool):
+ classdict[g.name] = g
+ for a in g.aliases:
+ classdict[a] = g
+ except (TypeError, AttributeError):
+ pass
+ return classdict
+
diff --git a/gr-utils/src/python/modtool/modtool_disable.py b/gr-utils/src/python/modtool/modtool_disable.py
index b0fb13245..36725e557 100644
--- a/gr-utils/src/python/modtool/modtool_disable.py
+++ b/gr-utils/src/python/modtool/modtool_disable.py
@@ -35,24 +35,10 @@ class ModToolDisable(ModTool):
def __init__(self):
ModTool.__init__(self)
- def setup_parser(self):
- " Initialise the option parser for 'gr_modtool.py rm' "
- parser = ModTool.setup_parser(self)
- parser.usage = '%prog disable [options]. \n Call %prog without any options to run it interactively.'
- ogroup = OptionGroup(parser, "Disable module options")
- ogroup.add_option("-p", "--pattern", type="string", default=None,
- help="Filter possible choices for blocks to be disabled.")
- ogroup.add_option("-y", "--yes", action="store_true", default=False,
- help="Answer all questions with 'yes'.")
- parser.add_option_group(ogroup)
- return parser
-
def setup(self):
ModTool.setup(self)
options = self.options
- if options.pattern is not None:
- self._info['pattern'] = options.pattern
- elif options.block_name is not None:
+ if options.block_name is not None:
self._info['pattern'] = options.block_name
elif len(self.args) >= 2:
self._info['pattern'] = self.args[1]
@@ -60,7 +46,6 @@ class ModToolDisable(ModTool):
self._info['pattern'] = raw_input('Which blocks do you want to disable? (Regex): ')
if len(self._info['pattern']) == 0:
self._info['pattern'] = '.'
- self._info['yes'] = options.yes
def run(self):
""" Go, go, go! """
@@ -123,7 +108,7 @@ class ModToolDisable(ModTool):
swigfile = re.sub('(GR_SWIG_BLOCK_MAGIC2?.+'+blockname+'.+;)', r'//\1', swigfile)
open(self._file['swig'], 'w').write(swigfile)
return False
- # List of special rules: 0: subdir, 1: filename re match, 2: function
+ # List of special rules: 0: subdir, 1: filename re match, 2: callback
special_treatments = (
('python', 'qa.+py$', _handle_py_qa),
('python', '^(?!qa).+py$', _handle_py_mod),
diff --git a/gr-utils/src/python/modtool/modtool_help.py b/gr-utils/src/python/modtool/modtool_help.py
index 79474a963..76d9fd28b 100644
--- a/gr-utils/src/python/modtool/modtool_help.py
+++ b/gr-utils/src/python/modtool/modtool_help.py
@@ -21,7 +21,7 @@
""" The help module """
from gnuradio.modtool import *
-from util_functions import get_command_from_argv, get_class_dict
+from util_functions import get_command_from_argv
from templates import Templates
@@ -51,7 +51,7 @@ class ModToolHelp(ModTool):
pass
def run(self):
- cmd_dict = get_class_dict()
+ cmd_dict = get_class_dict(globals().values())
cmds = cmd_dict.keys()
cmds.remove(self.name)
for a in self.aliases:
diff --git a/gr-utils/src/python/modtool/modtool_info.py b/gr-utils/src/python/modtool/modtool_info.py
index e774db911..680bd41b9 100644
--- a/gr-utils/src/python/modtool/modtool_info.py
+++ b/gr-utils/src/python/modtool/modtool_info.py
@@ -34,7 +34,7 @@ class ModToolInfo(ModTool):
ModTool.__init__(self)
def setup_parser(self):
- " Initialise the option parser for 'gr_modtool.py info' "
+ " Initialise the option parser for 'gr_modtool info' "
parser = ModTool.setup_parser(self)
parser.usage = '%prog info [options]. \n Call %prog without any options to run it interactively.'
ogroup = OptionGroup(parser, "Info options")
diff --git a/gr-utils/src/python/modtool/modtool_makexml.py b/gr-utils/src/python/modtool/modtool_makexml.py
index 104a0fdbd..777cc09e1 100644
--- a/gr-utils/src/python/modtool/modtool_makexml.py
+++ b/gr-utils/src/python/modtool/modtool_makexml.py
@@ -30,6 +30,7 @@ from modtool_base import ModTool
from parser_cc_block import ParserCCBlock
from grc_xml_generator import GRCXMLGenerator
from cmakefile_editor import CMakeFileEditor
+from util_functions import ask_yes_no
class ModToolMakeXML(ModTool):
""" Make XML file for GRC block bindings """
@@ -38,24 +39,10 @@ class ModToolMakeXML(ModTool):
def __init__(self):
ModTool.__init__(self)
- def setup_parser(self):
- " Initialise the option parser for 'gr_modtool.py makexml' "
- parser = ModTool.setup_parser(self)
- parser.usage = '%prog makexml [options]. \n Call %prog without any options to run it interactively.'
- ogroup = OptionGroup(parser, "Make XML module options")
- ogroup.add_option("-p", "--pattern", type="string", default=None,
- help="Filter possible choices for blocks to be parsed.")
- ogroup.add_option("-y", "--yes", action="store_true", default=False,
- help="Answer all questions with 'yes'. This can overwrite existing files!")
- parser.add_option_group(ogroup)
- return parser
-
def setup(self):
ModTool.setup(self)
options = self.options
- if options.pattern is not None:
- self._info['pattern'] = options.pattern
- elif options.block_name is not None:
+ if options.block_name is not None:
self._info['pattern'] = options.block_name
elif len(self.args) >= 2:
self._info['pattern'] = self.args[1]
@@ -63,7 +50,6 @@ class ModToolMakeXML(ModTool):
self._info['pattern'] = raw_input('Which blocks do you want to parse? (Regex): ')
if len(self._info['pattern']) == 0:
self._info['pattern'] = '.'
- self._info['yes'] = options.yes
def run(self):
""" Go, go, go! """
@@ -109,8 +95,11 @@ class ModToolMakeXML(ModTool):
'default': '2',
'in_constructor': False})
if os.path.isfile(os.path.join('grc', fname_xml)):
- # TODO add an option to keep
- print "Warning: Overwriting existing GRC file."
+ if not self._info['yes']:
+ if not ask_yes_no('Overwrite existing GRC file?', False):
+ return
+ else:
+ print "Warning: Overwriting existing GRC file."
grc_generator = GRCXMLGenerator(
modname=self._info['modname'],
blockname=blockname,
@@ -167,4 +156,3 @@ class ModToolMakeXML(ModTool):
sys.exit(1)
return (parser.read_params(), parser.read_io_signature(), blockname)
-
diff --git a/gr-utils/src/python/modtool/modtool_newmod.py b/gr-utils/src/python/modtool/modtool_newmod.py
index 5e14493c3..102d83d8d 100644
--- a/gr-utils/src/python/modtool/modtool_newmod.py
+++ b/gr-utils/src/python/modtool/modtool_newmod.py
@@ -35,7 +35,7 @@ class ModToolNewModule(ModTool):
ModTool.__init__(self)
def setup_parser(self):
- " Initialise the option parser for 'gr_modtool.py newmod' "
+ " Initialise the option parser for 'gr_modtool newmod' "
parser = ModTool.setup_parser(self)
parser.usage = '%prog rm [options]. \n Call %prog without any options to run it interactively.'
ogroup = OptionGroup(parser, "New out-of-tree module options")
diff --git a/gr-utils/src/python/modtool/modtool_rm.py b/gr-utils/src/python/modtool/modtool_rm.py
index 02ce8ef3f..32dfee480 100644
--- a/gr-utils/src/python/modtool/modtool_rm.py
+++ b/gr-utils/src/python/modtool/modtool_rm.py
@@ -37,24 +37,10 @@ class ModToolRemove(ModTool):
def __init__(self):
ModTool.__init__(self)
- def setup_parser(self):
- " Initialise the option parser for 'gr_modtool.py rm' "
- parser = ModTool.setup_parser(self)
- parser.usage = '%prog rm [options]. \n Call %prog without any options to run it interactively.'
- ogroup = OptionGroup(parser, "Remove module options")
- ogroup.add_option("-p", "--pattern", type="string", default=None,
- help="Filter possible choices for blocks to be deleted.")
- ogroup.add_option("-y", "--yes", action="store_true", default=False,
- help="Answer all questions with 'yes'.")
- parser.add_option_group(ogroup)
- return parser
-
def setup(self):
ModTool.setup(self)
options = self.options
- if options.pattern is not None:
- self._info['pattern'] = options.pattern
- elif options.block_name is not None:
+ if options.block_name is not None:
self._info['pattern'] = options.block_name
elif len(self.args) >= 2:
self._info['pattern'] = self.args[1]
@@ -62,7 +48,6 @@ class ModToolRemove(ModTool):
self._info['pattern'] = raw_input('Which blocks do you want to delete? (Regex): ')
if len(self._info['pattern']) == 0:
self._info['pattern'] = '.'
- self._info['yes'] = options.yes
def run(self):
""" Go, go, go! """
@@ -108,7 +93,7 @@ class ModToolRemove(ModTool):
return regexp
# Go, go, go!
if not self._skip_subdirs['lib']:
- self._run_subdir('lib', ('*.cc', '*.h'), ('add_library',),
+ self._run_subdir('lib', ('*.cc', '*.h'), ('add_library', 'list'),
cmakeedit_func=_remove_cc_test_case)
if not self._skip_subdirs['include']:
incl_files_deleted = self._run_subdir(self._info['includedir'], ('*.h',), ('install',))
diff --git a/gr-utils/src/python/modtool/parser_cc_block.py b/gr-utils/src/python/modtool/parser_cc_block.py
index d11353cc7..0d1d75f29 100644
--- a/gr-utils/src/python/modtool/parser_cc_block.py
+++ b/gr-utils/src/python/modtool/parser_cc_block.py
@@ -121,12 +121,13 @@ class ParserCCBlock(object):
if not in_string:
if c[i] == ')':
if parens_count == 0:
- if read_state == 'type':
+ if read_state == 'type' and len(this_type):
raise ValueError(
'Found closing parentheses before finishing last argument (this is how far I got: %s)'
% str(param_list)
)
- param_list.append((this_type, this_name, this_defv))
+ if len(this_type):
+ param_list.append((this_type, this_name, this_defv))
end_of_list = True
break
else:
diff --git a/gr-utils/src/python/modtool/templates.py b/gr-utils/src/python/modtool/templates.py
index 91d8370b9..877735711 100644
--- a/gr-utils/src/python/modtool/templates.py
+++ b/gr-utils/src/python/modtool/templates.py
@@ -490,9 +490,9 @@ Templates['grc_xml'] = '''<?xml version="1.0"?>
# Usage
Templates['usage'] = '''
-gr_modtool.py <command> [options] -- Run <command> with the given options.
-gr_modtool.py help -- Show a list of commands.
-gr_modtool.py help <command> -- Shows the help for a given command. '''
+gr_modtool <command> [options] -- Run <command> with the given options.
+gr_modtool help -- Show a list of commands.
+gr_modtool help <command> -- Shows the help for a given command. '''
# SWIG string
Templates['swig_block_magic'] = """#if $version == '37'
diff --git a/gr-utils/src/python/modtool/util_functions.py b/gr-utils/src/python/modtool/util_functions.py
index 33d8ad333..4ca294ac3 100644
--- a/gr-utils/src/python/modtool/util_functions.py
+++ b/gr-utils/src/python/modtool/util_functions.py
@@ -18,11 +18,13 @@
# the Free Software Foundation, Inc., 51 Franklin Street,
# Boston, MA 02110-1301, USA.
#
-""" Utility functions for gr_modtool.py """
+""" Utility functions for gr_modtool """
import re
import sys
+# None of these must depend on other modtool stuff!
+
def get_command_from_argv(possible_cmds):
""" Read the requested command from argv. This can't be done with optparse,
since the option parser isn't defined before the command is known, and
@@ -38,7 +40,7 @@ def get_command_from_argv(possible_cmds):
return None
def append_re_line_sequence(filename, linepattern, newline):
- """Detects the re 'linepattern' in the file. After its last occurrence,
+ """ Detects the re 'linepattern' in the file. After its last occurrence,
paste 'newline'. If the pattern does not exist, append the new line
to the file. Then, write. """
oldfile = open(filename, 'r').read()
@@ -99,19 +101,6 @@ def get_modname():
except AttributeError:
return None
-def get_class_dict():
- " Return a dictionary of the available commands in the form command->class "
- classdict = {}
- for g in globals().values():
- try:
- if issubclass(g, ModTool):
- classdict[g.name] = g
- for a in g.aliases:
- classdict[a] = g
- except (TypeError, AttributeError):
- pass
- return classdict
-
def is_number(s):
" Return True if the string s contains a number. "
try: