svc_hardware: better error messages for bad hw_addr when not validating as a MAC...
[freeside.git] / bin / generate-table-module
1 #!/usr/bin/perl
2
3 use strict;
4 use vars qw( $opt_n );
5 use FS::Schema qw( dbdef_dist );
6 use Getopt::Std;
7
8 getopts('n');
9 my $table = shift;
10
11 ###
12 # add a new FS/FS/table.pm
13 ###
14
15 my %ut = ( #just guesses
16   'int'     => 'number',
17   'number'  => 'float',
18   'varchar' => 'text',
19   'text'    => 'text',
20   'serial'  => 'number',
21 );
22
23 my $dbdef_table = dbdef_dist->table($table)
24   or die "define table in Schema.pm first";
25 my $primary_key = $dbdef_table->primary_key;
26
27 open(SRC,"<eg/table_template.pm") or die $!;
28 -e "FS/FS/$table.pm" and die "FS/FS/$table.pm already exists!";
29 open(DEST,">FS/FS/$table.pm") or die $!;
30
31 while (my $line = <SRC>) {
32
33   $line =~ s/table_name/$table/g;
34
35   if ( $line =~ /^=item\s+field\s+-\s+description\s*$/ ) {
36
37     foreach my $column ( $dbdef_table->columns ) {
38       print DEST "=item $column\n\n";
39       if ( $column eq $primary_key ) {
40         print DEST "primary key\n\n";
41       } else {
42         print DEST "$column\n\n";
43       }
44     }
45     next;
46
47   } elsif ( $line=~ /^(\s*)\$self->ut_numbern\('primary_key'\)\s*/ ) {
48
49     print DEST "$1\$self->ut_numbern('$primary_key')\n"
50       if $primary_key;
51     next;
52
53   } elsif (
54     $line =~ /^(\s*)\|\|\s+\$self->ut_number\('validate_other_fields'\)\s*/
55   ) {
56
57     foreach my $column ( grep { $_ ne $primary_key } $dbdef_table->columns ) {
58       my $ut = $ut{$dbdef_table->column($column)->type};
59       $ut .= 'n' if $dbdef_table->column($column)->null;
60       print DEST "$1|| \$self->ut_$ut('$column')\n";
61     }
62     next;
63
64   }
65
66   print DEST $line;
67 }
68
69 close SRC;
70 close DEST;
71
72 ###
73 # add to FS/FS/Mason.pm
74 ###
75
76 my $magic = '# Sammath Naur';
77 system("perl -pi -e 's/$magic/use FS::$table;\n  $magic/' FS/FS/Mason.pm")
78   unless $opt_n;
79
80 ###
81 # add FS/t/table.t
82 ###
83
84 open(TEST,">FS/t/$table.t") or die $!;
85 print TEST <<ENDTEST;
86 BEGIN { \$| = 1; print "1..1\\n" }
87 END {print "not ok 1\\n" unless \$loaded;}
88 use FS::$table;
89 \$loaded=1;
90 print "ok 1\\n";
91 ENDTEST
92 close TEST;
93
94 ###
95 # add them to MANIFEST
96 ###
97
98 open(MANIFEST,">>FS/MANIFEST") or die $!;
99 print MANIFEST "FS/$table.pm\n",
100                "t/$table.t\n";
101 close MANIFEST;
102
103 system("git add FS/FS/$table.pm FS/t/$table.t");
104