Repository 'column_maker'
hg clone https://toolshed.g2.bx.psu.edu/repos/devteam/column_maker

Changeset 3:be25c075ed54 (2020-06-04)
Previous changeset 2:464b9305180e (2018-10-25) Next changeset 4:6e8d94597139 (2020-07-15)
Commit message:
"planemo upload for repository https://github.com/galaxyproject/tools-devteam/tree/master/tools/column_maker commit 2b17bdfc47ca4d7f1a584216c4bd61a7050df7ea"
modified:
column_maker.py
column_maker.xml
b
diff -r 464b9305180e -r be25c075ed54 column_maker.py
--- a/column_maker.py Thu Oct 25 17:31:42 2018 -0400
+++ b/column_maker.py Thu Jun 04 05:03:46 2020 -0400
[
b'@@ -1,37 +1,36 @@\n #!/usr/bin/env python\n-# This tool takes a tab-delimited textfile as input and creates another column in the file which is the result of\n-# a computation performed on every row in the original file.  The tool will skip over invalid lines within the file,\n-# informing the user about the number of lines skipped.\n+"""\n+This tool takes a tab-delimited textfile as input and creates another column in\n+the file which is the result of a computation performed on every row in the\n+original file. The tool will skip over invalid lines within the file,\n+informing the user about the number of lines skipped.\n+"""\n+from __future__ import print_function\n \n-import sys, re\n-# These functions may be used in compute expression:\n-from math import log,exp,sqrt,ceil,floor\n-\n+import re\n+import sys\n \n-assert sys.version_info[:2] >= ( 2, 4 )\n-\n-def stop_err( msg ):\n-    sys.stderr.write( msg )\n-    sys.exit()\n+assert sys.version_info[:2] >= (2, 4)\n \n inp_file = sys.argv[1]\n out_file = sys.argv[2]\n expr = sys.argv[3]\n round_result = sys.argv[4]\n try:\n-    in_columns = int( sys.argv[5] )\n-except:\n-    stop_err( "Missing or invalid \'columns\' metadata value, click the pencil icon in the history item and select the Auto-detect option to correct it.  This tool can only be used with tab-delimited data." )\n+    in_columns = int(sys.argv[5])\n+except Exception:\n+    exit("Missing or invalid \'columns\' metadata value, click the pencil icon in the history item and select the Auto-detect option to correct it.  This tool can only be used with tab-delimited data.")\n if in_columns < 2:\n     # To be considered tabular, data must fulfill requirements of the sniff.is_column_based() method.\n-    stop_err( "Missing or invalid \'columns\' metadata value, click the pencil icon in the history item and select the Auto-detect option to correct it.  This tool can only be used with tab-delimited data." )\n+    exit("Missing or invalid \'columns\' metadata value, click the pencil icon in the history item and select the Auto-detect option to correct it.  This tool can only be used with tab-delimited data.")\n try:\n-    in_column_types = sys.argv[6].split( \',\' )\n-except:\n-    stop_err( "Missing or invalid \'column_types\' metadata value, click the pencil icon in the history item and select the Auto-detect option to correct it.  This tool can only be used with tab-delimited data." )\n-if len( in_column_types ) != in_columns:\n-    stop_err( "The \'columns\' metadata setting does not conform to the \'column_types\' metadata setting, click the pencil icon in the history item and select the Auto-detect option to correct it.  This tool can only be used with tab-delimited data." )\n-    \n+    in_column_types = sys.argv[6].split(\',\')\n+except Exception:\n+    exit("Missing or invalid \'column_types\' metadata value, click the pencil icon in the history item and select the Auto-detect option to correct it.  This tool can only be used with tab-delimited data.")\n+if len(in_column_types) != in_columns:\n+    exit("The \'columns\' metadata setting does not conform to the \'column_types\' metadata setting, click the pencil icon in the history item and select the Auto-detect option to correct it.  This tool can only be used with tab-delimited data.")\n+avoid_scientific_notation = sys.argv[7]\n+\n # Unescape if input has been escaped\n mapped_str = {\n     \'__lt__\': \'<\',\n@@ -44,43 +43,56 @@\n     \'__dq__\': \'"\',\n }\n for key, value in mapped_str.items():\n-    expr = expr.replace( key, value )\n+    expr = expr.replace(key, value)\n \n operators = \'is|not|or|and\'\n builtin_and_math_functions = \'abs|all|any|bin|chr|cmp|complex|divmod|float|bool|hex|int|len|long|max|min|oct|ord|pow|range|reversed|round|sorted|str|sum|type|unichr|unicode|log|exp|sqrt|ceil|floor\'\n-string_and_list_methods = [ name for name in dir(\'\') + dir([]) if not name.startswith(\'_\') ]\n-whitelist = "^([c0-9\\+\\-\\*\\/\\(\\)\\.\\\'\\"><=,:! ]|%s|%s|%s)*$" % (operators, builtin_and_math_functions, \'|\'.join(string_and_list_methods))\n+string_and_list_methods = [n'..b's and wrappers for column data types\n cols, type_casts = [], []\n-for col in range( 1, in_columns + 1 ):\n+for col in range(1, in_columns + 1):\n     col_name = "c%d" % col\n-    cols.append( col_name )\n-    col_type = in_column_types[ col - 1 ].strip()\n+    cols.append(col_name)\n+    col_type = in_column_types[col - 1].strip()\n     if round_result == \'no\' and col_type == \'int\':\n         col_type = \'float\'\n-    type_cast = "%s(%s)" % ( col_type, col_name )\n-    type_casts.append( type_cast )\n-        \n-col_str = \', \'.join( cols )    # \'c1, c2, c3, c4\'\n-type_cast_str = \', \'.join( type_casts )  # \'str(c1), int(c2), int(c3), str(c4)\'\n-assign = "%s = line.split( \'\\\\t\' )" % col_str\n-wrap = "%s = %s" % ( col_str, type_cast_str )\n+    type_cast = "%s(%s)" % (col_type, col_name)\n+    type_casts.append(type_cast)\n+\n+col_str = \', \'.join(cols)    # \'c1, c2, c3, c4\'\n+type_cast_str = \', \'.join(type_casts)  # \'str(c1), int(c2), int(c3), str(c4)\'\n+assign = "%s = line.split(\'\\\\t\')" % col_str\n+wrap = "%s = %s" % (col_str, type_cast_str)\n skipped_lines = 0\n first_invalid_line = 0\n invalid_line = None\n lines_kept = 0\n total_lines = 0\n-out = open( out_file, \'wt\' )\n+out = open(out_file, \'wt\')\n \n # Read input file, skipping invalid lines, and perform computation that will result in a new column\n code = \'\'\'\n-for i, line in enumerate( file( inp_file ) ):\n+# import here since flake8 complains otherwise\n+from math import (\n+    ceil,\n+    exp,\n+    floor,\n+    log,\n+    sqrt\n+)\n+from numpy import format_float_positional\n+\n+fh = open(inp_file)\n+for i, line in enumerate(fh):\n     total_lines += 1\n-    line = line.rstrip( \'\\\\r\\\\n\' )\n-    if not line or line.startswith( \'#\' ):\n+    line = line.rstrip(\'\\\\r\\\\n\')\n+    if not line or line.startswith(\'#\'):\n         skipped_lines += 1\n         if not invalid_line:\n             first_invalid_line = i + 1\n@@ -91,35 +103,38 @@\n         %s\n         new_val = %s\n         if round_result == "yes":\n-            new_val = int( round( new_val ) )\n-        new_line = line + \'\\\\t\' + str( new_val )\n-        print >> out, new_line\n+            new_val = int(round(new_val))\n+        new_line = line + \'\\\\t\' + str(new_val) + "\\\\n"\n+        out.write(new_line)\n         lines_kept += 1\n-    except:\n+    except Exception:\n         skipped_lines += 1\n         if not invalid_line:\n             first_invalid_line = i + 1\n             invalid_line = line\n-\'\'\' % ( assign, wrap, expr )\n+fh.close()\n+\'\'\' % (assign, wrap, expr)\n \n valid_expr = True\n try:\n-    exec code\n-except Exception, e:\n+    exec(code)\n+except Exception as e:\n     out.close()\n-    if str( e ).startswith( \'invalid syntax\' ):\n+    if str(e).startswith(\'invalid syntax\'):\n         valid_expr = False\n-        stop_err( \'Expression "%s" likely invalid. See tool tips, syntax and examples.\' % expr )\n+        exit(\'Expression "%s" likely invalid. See tool tips, syntax and examples.\' % expr)\n     else:\n-        stop_err( str( e ) )\n+        exit(str(e))\n \n if valid_expr:\n     out.close()\n     valid_lines = total_lines - skipped_lines\n-    print \'Creating column %d with expression %s\' % ( in_columns + 1, expr )\n+    print(\'Creating column %d with expression %s\' % (in_columns + 1, expr))\n     if valid_lines > 0:\n-        print \'kept %4.2f%% of %d lines.\' % ( 100.0*lines_kept/valid_lines, total_lines )\n+        print(\'kept %4.2f%% of %d lines.\' % (100.0 * lines_kept / valid_lines,\n+                                             total_lines))\n     else:\n-        print \'Possible invalid expression "%s" or non-existent column referenced. See tool tips, syntax and examples.\' % expr\n+        print(\'Possible invalid expression "%s" or non-existent column referenced. See tool tips, syntax and examples.\' % expr)\n     if skipped_lines > 0:\n-        print \'Skipped %d invalid lines starting at line #%d: "%s"\' % ( skipped_lines, first_invalid_line, invalid_line )\n+        print(\'Skipped %d invalid lines starting at line #%d: "%s"\' %\n+              (skipped_lines, first_invalid_line, invalid_line))\n'
b
diff -r 464b9305180e -r be25c075ed54 column_maker.xml
--- a/column_maker.xml Thu Oct 25 17:31:42 2018 -0400
+++ b/column_maker.xml Thu Jun 04 05:03:46 2020 -0400
[
@@ -1,8 +1,9 @@
-<tool id="Add_a_column1" name="Compute" version="1.2.0">
+<tool id="Add_a_column1" name="Compute" version="1.3.0">
     <description>an expression on every row</description>
     <requirements>
         <requirement type="package" version="2.7.13">python</requirement>
         <requirement type="package" version="4.4">sed</requirement>
+        <requirement type="package" version="1.14">numpy</requirement>
     </requirements>
     <command detect_errors="aggressive"><![CDATA[
         #if $header_lines_conditional.header_lines_select == "yes":
@@ -18,7 +19,8 @@
             "$cond"
             $round
             ${input.metadata.columns}
-            "${input.metadata.column_types}" &&
+            "${input.metadata.column_types}"
+            $avoid_scientific_notation &&
         cat header column_maker_output > '$out_file1'
     ]]></command>
     <inputs>
@@ -39,6 +41,10 @@
                 <param name="header_new_column_name" type="text" value="New Column" label="The new column name" />
             </when>
         </conditional>
+        <param name="avoid_scientific_notation" type="select" label="Avoid scientific notation" help="If yes, use fully expanded decimal representation when writing new columns (use only if expression produces decimal numbers).">
+            <option value="no">no</option>
+            <option value="yes">yes</option>
+        </param>
     </inputs>
     <outputs>
         <data format_source="input" name="out_file1" metadata_source="input"/>
@@ -72,6 +78,30 @@
             <param name="round" value="yes"/>
             <output name="out_file1" file="column_maker_out3.interval"/>
         </test>
+        <test>
+            <param name="cond" value="float(.0000000000001)"/>
+            <param name="input" value="1.bed"/>
+            <param name="round" value="no"/>
+            <output name="out_file1">
+                <assert_contents>
+                    <has_text text="CCDS10397" />
+                    <has_text text="1e-13" />
+                </assert_contents>
+            </output>
+        </test>
+        <test>
+            <param name="cond" value="float(.0000000000001)"/>
+            <param name="input" value="1.bed"/>
+            <param name="round" value="no"/>
+            <param name="avoid_scientific_notation" value="yes"/>
+            <output name="out_file1">
+                <assert_contents>
+                    <has_text text="CCDS10397" />
+                    <has_text text=".0000000000001" />
+                    <not_has_text text="1e-13" />
+                </assert_contents>
+            </output>
+        </test>
     </tests>
     <help>