This commit was generated by cvs2svn to compensate for changes in r4407,
[freeside.git] / rt / lib / RT / StyleGuide.pod
1 =head1 NAME
2
3 RT::StyleGuide - RT Style Guide
4
5 =head1 INTRODUCTION
6
7 All code and documentation that is submitted to be included in the RT
8 distribution should follow the style in this document.  This is not to
9 try to stifle your creativity, but to make life easier for everybody who
10 has to work with your code, and to aid those who are not quite sure how
11 to do something.
12
13 These conventions below apply to perl modules, web programs, and
14 command-line programs, specifically, but also might apply to some
15 degree to any Perl code written for use in RT.
16
17 Note that these are all guidelines, not unbreakable rules.  If you have
18 a really good need to break one of the rules herein, however, then it is
19 best to ask on the B<rt-devel> mailing list first.
20
21 Note that with much of this document, it is not so much the Right Way as
22 it is Our Way.  We need to have conventions in order to make life easier
23 for everyone.  So don't gripe, and just follow it, because you didn't
24 get a good grade in "Plays Well With Others" in kindergarten and you
25 want to make up for it now.
26
27 If you have any questions, please ask us on the B<rt-devel> mailing list:
28
29         http://www.bestpractical.com/rt/lists.html
30
31 We don't always follow this guide.  We are making changes throughout
32 our code to be in line with it.  But just because we didn't do
33 it yet, that is no excuse.  Do it anyway.  :-)
34
35 This document is subject to change at the whims of the core RT team.
36 We hope to add any significant changes at the bottom of the document.
37
38
39 =head1 CODING PRINCIPLES
40
41 =head2 Perl Version
42
43 We code everything to perl 5.6.1. Some features require advanced unicode
44 features in perl 5.8.0. It is acceptable that unicode features work only for 
45 US-ASCII on perl 5.6.1. 
46
47
48 =head2 Documentation
49
50 All modules will be documented using the POD examples in the module
51 boilerplate.  The function, purpose, use of the module will be
52 explained, and each public API will be documented with name,
53 description, inputs, outputs, side effects, etc.
54
55 If an array or hash reference is returned, document the size of the
56 array (including what each element is, as appropriate) and name each key
57 in the hash.  For complex data structures, map out the structure as
58 appropriate (e.g., name each field returned for each column from a DB
59 call; yes, this means you shouldn't use "SELECT *", which you shouldn't
60 use anyway).
61
62 Also document what kind of data returned values are.  Is it an integer,
63 a block of HTML, a boolean?
64
65 All command-line program options will be documented using the
66 boilerplate code for command-line programs, which doesn't yet exist.
67 Each available function, switch, etc. should be documented, along
68 with a statement of function, purpose, use of the program.  Do not
69 use the same options as another program, for a different purpose.
70
71 All web templates should be documented with a statement of function,
72 purpose, and use in a mason comment block.
73
74 Any external documents, and documentation for command-line programs and
75 modules, should be written in POD, where appropriate. From there, they
76 can be translated to many formats with the various pod2* translators. 
77 Read the perlpod manpage before writing any POD, because although POD is
78 not difficult, it is not what most people are used to.  It is not a
79 regular markup language; it is just a way to make easy documentation
80 for translating to other formats.  Read, and understand, the perlpod
81 manpage, and ask us or someone else who knows if you have any questions.
82
83
84 =head2 Version
85
86 Our distribution versions use tuples, where the first number is the
87 major revision, the second number is the version, and third
88 number is the subversion.  Odd-numbered versions are development
89 versions.  Examples:
90
91         1.0.0           First release of RT 1
92         1.0.1           Second release of RT 1.0
93         1.0.10          etc.
94         1.1.0           First development release of RT 1.2 (or 2.0)
95         2.0.0           First release of RT 2
96
97 Versions can be modified with a hyphen followed by some text, for
98 special versions, or to give extra information.  Examples:
99
100         2.0.0-pre1      Notes that this is not final, but preview
101
102 In perl 5.6.0, you can have versions like C<v2.0.0>, but this is not
103 allowed in previous versions of perl.  So to convert a tuple version
104 string to a string to use with $VERSION, use a regular integer for
105 the revision, and three digits for version and subversion.  Examples:
106
107         1.1.6   ->      1.001006
108         2.0.0   ->      2.000000
109
110 This way, perl can use the version strings in greater-than and
111 less-than comparisons.
112
113
114 =head2 Comments
115
116 All code should be self-documenting as much as possible.  Only include
117 necessary comments.  Use names like "$ticket_count", so you don't need to
118 do something like:
119
120         # ticket count
121         my $tc = 0;
122
123 Include any comments that are, or might be, necessary in order for
124 someone else to understand the code.  Sometimes a simple one-line
125 comment is good to explain what the purpose of the following code is
126 for.  Sometimes each line needs to be commented because of a complex
127 algorithm.  Read Kernighan & Pike's I<Practice of Programming> about
128 commenting.  Good stuff, Maynard.
129
130
131 =head2 Warnings and Strict
132
133 All code must compile and run cleanly with "use strict" enabled and the
134 perl "-w" (warnings) option on.  If you must do something that -w or
135 strict complains about, there are workarounds, but the chances that you
136 really need to do it that way are remote.
137
138 =head2 Lexical Variables
139
140 Use only lexical variables, except for special global variables
141 ($VERSION, %ENV, @ISA, $!, etc.) or very special circumstances (see
142 %HTML::Mason::Commands::session ).  Global variables
143 for regular use are never appropriate.  When necessary, "declare"
144 globals with "use vars" or "our()".
145
146 A lexical variable is created with my().  A global variable is
147 pre-existing (if it is a special variable), or it pops into existence
148 when it is used.  local() is used to tell perl to assign a temporary
149 value to a variable.  This should only be used with special variables,
150 like $/, or in special circumstances.  If you must assign to any global
151 variable, consider whether or not you should use local().
152
153 local() may also be used on elements of arrays and hashes, though there
154 is seldom a need to do it, and you shouldn't.
155
156
157 =head2 Exporting
158
159 Do not export anything from a module by default.  Feel free to put
160 anything you want to in @EXPORT_OK, so users of your modules can
161 explicitly ask for symbols (e.g., "use Something::Something qw(getFoo
162 setFoo)"), but do not export them by default.
163
164
165 =head2 Pass by Reference
166
167 Arrays and hashes should be passed to and from functions by reference
168 only.  Note that a list and an array are NOT the same thing.  This
169 is perfectly fine:
170
171         return($user, $form, $constants);
172
173 An exception might be a temporary array of discrete arguments:
174
175         my @return = ($user, $form);
176         push @return, $constants if $flag;
177         return @return;
178
179 Although, usually, this is better (faster, easier to read, etc.):
180
181         if ($flag) {
182                 return($user, $form, $constants);
183         } else {
184                 return($user, $form);
185         }
186
187 We need to talk about Class::ReturnValue here.
188
189
190 =head2 Garbage Collection
191
192 Perl does pretty good garbage collection for you.  It will automatically
193 clean up lexical variables that have gone out of scope and objects whose
194 references have gone away.  Normally you don't need to worry about
195 cleaning up after yourself, if using lexicals.
196
197 However, some glue code, code compiled in C and linked to Perl, might
198 not automatically clean up for you.  In such cases, clean up for
199 yourself.  If there is a method in that glue to dispose or destruct,
200 then use it as appropriate.
201
202 Also, if you have a long-running function that has a large data
203 structure in it, it is polite to free up the memory as soon as you are
204 done with it, if possible.
205
206         my $huge_data_structure = get_huge_data_structure();
207         do_something_with($huge_data_structure);
208         undef $huge_data_structure;
209
210 =head2 DESTROY
211
212 All object classes must provide a DESTROY method.  If it won't do
213 anything, provide it anyway:
214
215         sub DESTROY { }
216
217
218
219 =head2 die() and exit()
220
221 Don't do it.  Do not die() or exit() from a web template or module.  Do
222 not call C<kill 9, $$>.  Don't do it.
223
224 In command-line programs, do as you please.
225
226
227 =head2 shift and @_
228
229 Do not use @_.  Use shift.  shift may take more lines, but Jesse thinks it 
230 leads to cleaner code.
231
232         my $var = shift;                        # right
233         my($var) = @_;                          # ick. no
234         sub foo { uc $_[0] }                    # icky. sometimes ok.
235
236
237         my($var1, $var2) = (shift, shift);      # Um, no.
238
239         my $var1 = shift;                       # right
240         my $var2 = shift;                       
241
242 =head2 Method parameters
243
244 If a method takes exactly one mandatory argument, the argument should be
245 passed in a straightforward manner:
246
247         my $self = shift;
248         my $id = shift;
249
250 In all other cases, the method needs to take named parameters, usually
251 using a C<%args> hash to store them:
252
253         my $self = shift;
254         my %args = ( Name => undef,
255                      Description => undef,
256                      @_ );
257
258 You may specify defaults to those named parameters instead of using
259 C<undef> above, as long as it is documented as such.
260
261 It is worth noting that the existing RT codebase had not followed this
262 style perfectly; we are trying to fix it without breaking exsiting APIs.
263
264 =head2 Tests
265
266 Modules should provide test code, with documentation on how to use
267 it. Test::Inline allows tests to be embedded in code. Test::More makes it 
268 easy to create tests. Any code you write should have a testsuite.
269 Any code you alter should have a test suite. If a patch comes in without
270 tests, there is something wrong.
271
272 When altering code, you must run the test harness before submitting a patch
273 or committing code to the repository. 
274
275 "make regression" will extract inline tests, blow away the system database
276 and run the test suite.
277
278 "make regression-quiet" will do all that and not print the "ok" lines.
279
280
281
282 =head2 STDIN/STDOUT
283
284 Always report errors using $RT::Logger. It's a Log::Dispatch object.
285 Unlike message meant for the user, log messages are not to be
286 internationalized.
287
288 There are several different levels ($RT::Logger methods) of logging:
289
290 =over 4
291
292 =item debug
293
294 Used for messages only needed during system debugging.
295
296 =item info
297
298 Should be used to describe "system-critical" events which aren't errors.
299 Examples: creating users, deleting users, creating tickets, creating queues,
300 sending email (message id, time, recipients), recieving mail, changing
301 passwords, changing access control, superuser logins)
302
303 =item error
304
305 Used for RT-generated failures during execution.
306
307 =item crit
308
309 Should be used for messages when an action can not be completed due to some
310 error condition beyond our control.
311
312 =back
313
314 In the web UI and modules, never print directly to STDERR.  Do not print
315 directly to STDOUT, unless you need to print directly to the user's console.
316
317 In command-line programs, feel free to print to STDERR and STDOUT as
318 needed for direct console communication. But for actual error reporting,
319 use the logging API.
320
321
322 =head2 System Calls
323
324 Always check return values from system calls, including open(),
325 close(), mkdir(), or anything else that talks directly to the system. 
326 Perl built-in system calls return the error in $!; some functions in
327 modules might return an error in $@ or some other way, so read the module's
328 documentation if you don't know.  Always do something, even if it is
329 just calling $RT::Logger->warning(), when the return value is not what you'd expect.
330
331
332
333 =head1 STYLE
334
335 Much of the style section is taken from the perlsyle manpage.  We make
336 some changes to it here, but it wouldn't be a bad idea to read that
337 document, too.
338
339 =head2 Terminology
340
341 =over 4
342
343 =item RT the name
344
345 "RT" is the name of the project.  "RT" is, optionally, the
346 specific name for the actual file distribution.  That's it. 
347
348 While we sometimes use "RT2" or "RT3", that's shortand that's really
349 not recommended. The name of the project is "RT".
350
351 To specify a major version, use "RT 3.0".
352 To specify a specific release, use "RT 3.0.12"
353
354 =item function vs. sub(routine) vs. method
355
356 Just because it is the Perl Way (not necessarily right for all
357 languages, but the documented terminology in the perl documentation),
358 "method" should be used only to refer to a subroutine that are object
359 methods or class methods; that is, these are functions that are used
360 with OOP that always take either an object or a class as the first
361 argument. Regular subroutines, ones that are not object or class
362 methods, are functions.  Class methods that create and return an object
363 are optionally called constructors.
364
365 =item Users
366
367 "users" are normally users of RT, the ones hitting the site; if using
368 it in any other context, specify.  
369 "system users" are user
370 names on the operating system.  "database users" are the user names in
371 the database server.  None of these needs to be capitalized.
372
373 =back
374
375
376 =head2 Names
377
378 Don't use single-character variables, except as iterator variables.
379
380 Don't use two-character variables just to spite us over the above rule.
381
382 Constants are in all caps; these are variables whose value will I<never>
383 change during the course of the program.
384
385         $Minimum = 10;          # wrong
386         $MAXIMUM = 50;          # right
387
388 Other variables are lowercase, with underscores separating the words. 
389 They words used should, in general, form a noun (usually singular),
390 unless the variable is a flag used to denote some action that should be
391 taken, in which case they should be verbs (or gerunds, as appropriate)
392 describing that action.
393
394         $thisVar      = 'foo';  # wrong
395         $this_var     = 'foo';  # right
396         $work_hard    = 1;      # right, verb, boolean flag
397         $running_fast = 0;      # right, gerund, boolean flag
398
399 Arrays and hashes should be plural nouns, whether as regular arrays and
400 hashes or array and hash references.  Do not name references with "ref"
401 or the data type in the name.
402
403         @stories     = (1, 2, 3);      # right
404         $comment_ref = [4, 5, 6];      # wrong
405         $comments    = [4, 5, 6];      # right
406         $comment     = $comments->[0]; # right
407
408 Make the name descriptive.  Don't use variables like "$sc" when you
409 could call it "$story_count".  See L<"Comments">.
410
411 There are several variables in RT that are used throughout the code,
412 that you should use in your code.  Do not use these variable names for
413 anything other than how they are normally used, and do not use any
414 other variable names in their place.  Some of these are:
415
416         $self           # first named argument in object method
417
418 Subroutines (except for special cases, like AUTOLOAD and simple accessors)
419 begin with a verb, with words following to complete the action.  Accessors
420 don't start with "Get" if they're just the name of the attribute.
421
422 Accessors which return an object should end with the suffix Obj.
423
424 This section needs clarification for RT.
425
426 Words begin with a capital letter.  They
427 should as clearly as possible describe the activity to be peformed, and
428 the data to be returned. 
429
430
431
432         Load();         # good
433         LoadByName();   # good
434         LoadById();             # good
435
436 Subroutines beginning with C<_> are special: they are not to be used
437 outside the current object.  There is not to be enforced by the code
438 itself, but by someone very big and very scary.
439
440 For large for() loops, do not use $_, but name the variable.
441 Do not use $_ (or assume it) except for when it is absolutely
442 clear what is going on, or when it is required (such as with
443 map() and grep()).
444
445         for (@list) {
446                 print;                  # OK; everyone knows this one
447                 print uc;               # wrong; few people know this
448                 print uc $_;            # better
449         }
450
451 Note that the special variable C<_> I<should> be used when possible.
452 It is a placeholder that can be passed to stat() and the file test
453 operators, that saves perl a trip to re-stat the file.  In the
454 example below, using C<$file> over for each file test, instead of
455 C<_> for subsequent uses, is a performance hit.  You should be
456 careful that the last-tested file is what you think it is, though.
457
458         if (-d $file) {         # $file is a directory
459                 # ...
460         } elsif (-l _) {        # $file is a symlink
461                 # ...
462         }
463
464 Package names begin with a capital letter in each word, followed by
465 lower case letters (for the most part).  Multiple words should be StudlyCapped.
466
467         RT::User                        # good
468         RT::Database::MySQL             # proper name
469         RT::Display::Provider           # good
470         RT::CustomField                 # not so good, but OK
471
472 Plugin modules should begin with "RTx::", followed by the name
473 of the plugin.  
474
475 =head1 Code formatting
476
477 Use perltidy. Anything we say here is wrong if it conflicts with what
478 perltidy does. Your perltidyrc should read:
479
480 -lp -vt=2 -vtc=2 -nsfs -bar                                                                                             
481
482 =head2 Indents and Blank Space
483
484 All indents should be tabs.  Set your tab stops whatever you want them
485 to be; I use 8 spaces per tabs.
486
487 No space before a semicolon that closes a statement.
488
489         foo(@bar) ;     # wrong
490         foo(@bar);      # right
491
492 Line up corresponding items vertically.
493
494         my $foo   = 1;
495         my $bar   = 2;
496         my $xyzzy = 3;
497
498         open(FILE, $fh)   or die $!;
499         open(FILE2, $fh2) or die $!;
500
501         $rot13 =~ tr[abcedfghijklmnopqrstuvwxyz]
502                     [nopqrstuvwxyzabcdefghijklm];
503
504         # note we use a-mn-z instead of a-z,
505         # for readability
506         $rot13 =~ tr[a-mn-z]
507                     [n-za-m];
508
509 Put blank lines between groups of code that do different things.  Put
510 blank lines after your variable declarations.  Put a blank line before a
511 final return() statement.  Put a blank line following a block (and
512 before, with the exception of comment lines).
513
514 An example:
515
516         # this is my function!
517         sub foo {
518                 my $val = shift;
519                 my $obj = new Constructor;
520                 my($var1, $var2);
521
522                 $obj->SetFoo($val);
523                 $var1 = $obj->Foo();
524
525
526                 return($val);
527         }
528
529         print 1;
530
531
532 =head2 Parentheses
533
534 For control structures, there is a space between the keyword and opening
535 parenthesis.  For functions, there is not.
536
537         for(@list)      # wrong
538         for (@list)     # right
539
540         my ($ref)       # wrong
541         my($ref)        # right
542
543 Be careful about list vs. scalar context with parentheses!
544
545         my @array = ('a', 'b', 'c');
546         my($first_element) = @array;            # a
547         my($first_element) = ('a', 'b', 'c');   # a
548         my $element_count  = @array;            # 3
549         my $last_element   = ('a', 'b', 'c');   # c
550
551 Always include parentheses after functions, even if there are no arguments.
552 There are some exceptions, such as list operators (like print) and unary
553 operators (like undef, delete, uc).
554
555 There is no space inside the parentheses, unless it is needed for
556 readability.
557
558         for ( map { [ $_, 1 ] } @list ) # OK
559         for ( @list )                   # not really OK, not horrible
560
561 On multi-line expressions, match up the closing parenthesis with either
562 the opening statement, or the opening parenthesis, whichever works best.
563 Examples:
564
565         @list = qw(
566                 bar
567                 baz
568         );                      # right
569
570         if ($foo && $bar && $baz
571                  && $buz && $xyzzy
572         ) {
573                 print $foo;
574         }
575
576 Whether or not there is space following a closing parenthesis is
577 dependent on what it is that follows.
578
579         print foo(@bar), baz(@buz) if $xyzzy;
580
581 Note also that parentheses around single-statement control expressions,
582 as in C<if $xyzzy>, are optional (and discouraged) C<if> it is I<absolutely>
583 clear -- to a programmer -- what is going on.  There is absolutely no
584 need for parentheses around C<$xyzzy> above, so leaving them out enhances
585 readability.  Use your best discretion.  Better to include them, if
586 there is any question.
587
588 The same essentially goes for perl's built-in functions, when there is
589 nothing confusing about what is going on (for example, there is only one
590 function call in the statement, or the function call is separated by a
591 flow control operator).  User-supplied functions must always include
592 parentheses.
593
594         print 1, 2, 3;                          # good
595         delete $hash{key} if isAnon($uid);      # good
596
597
598 However, if there is any possible confusion at all, then include the
599 parentheses.  Remember the words of Larry Wall in the perlstyle manpage:
600
601         When in doubt, parenthesize.  At the very least it will
602         let some poor schmuck bounce on the % key in vi.
603
604         Even if you aren't in doubt, consider the mental welfare
605         of the person who has to maintain the code after you, and
606         who will probably put parens in the wrong place.
607
608 So leave them out when it is absoutely clear to a programmer, but if
609 there is any question, leave them in.
610
611
612 =head2 Braces
613
614 (This is about control braces, not hash/data structure braces.)
615
616 There is always a space befor the opening brace.
617
618         while (<$fh>){  # wrong
619         while (<$fh>) { # right
620
621 A one-line block may be put on one line, and the semicolon may be
622 omitted.
623
624         for (@list) { print }
625
626 Otherwise, finish each statement with a semicolon, put the keyword and
627 opening curly on the first line, and the ending curly lined up with the
628 keyword at the end.
629
630         for (@list) {
631                 print;
632                 smell();
633         }
634
635 Generally, we prefer "uncuddled elses":
636
637         if ($foo) {
638                 print;
639         }
640         else {
641                 die;
642         }
643
644 _If_ the if statement is very brief, sometimes "cuddling" the else makes code more readable. Feel free to cuddle them in that case:
645
646
647         if ($foo) {
648                 print;
649         } else {
650                 die;
651         }
652
653 =head2 Operators
654
655 Put space around most operators.  The primary exception is the for
656 aesthetics; e.g., sometimes the space around "**" is ommitted,
657 and there is never a space before a ",", but always after.
658
659         print $x , $y;  # wrong
660         print $x, $y;   # right
661
662         $x = 2 >> 1;    # good
663         $y = 2**2;      # ok
664
665 Note that "&&" and "||" have a higher precedence than "and" and "or". 
666 Other than that, they are exactly the same.  It is best to use the lower
667 precedence version for control, and the higher for testing/returning
668 values.  Examples:
669
670         $bool = $flag1 or $flag2;       # WRONG (doesn't work)
671         $value = $foo || $bar;          # right
672         open(FILE, $file) or die $!;
673
674         $true  = foo($bar) && baz($buz);
675         foo($bar) and baz($buz);
676
677 Note that "and" is seldom ever used, because the statement above is
678 better written using "if":
679
680         baz($buz) if foo($bar);
681
682 Most of the time, the confusion between and/&&, or/|| can be alleviated
683 by using parentheses.  If you want to leave off the parentheses then you
684 I<must> use the proper operator.  But if you use parentheses -- and
685 normally, you should, if there is any question at all -- then it doesn't
686 matter which you use.  Use whichever is most readable and aesthetically
687 pleasing to you at the time, and be consistent within your block of code.
688
689 Break long lines AFTER operators, except for "and", "or", "&&", "||".
690 Try to keep the two parts to a binary operator (an operator that
691 has two operands) together when possible.
692
693         print "foo" . "bar" . "baz"
694                 . "buz";                        # wrong
695
696         print "foo" . "bar" . "baz" .
697                 "buz";                          # right
698
699         print $foo unless $x == 3 && $y ==
700                 4 && $z == 5;                   # wrong
701
702         print $foo unless $x == 3 && $y == 4
703                 && $z == 5;                     # right
704
705
706 =head2 Other
707
708 Put space around a complex subscript inside the brackets or braces.
709
710         $foo{$bar{baz}{buz}};   # OK
711         $foo{ $bar{baz}{buz} }; # better
712
713 In general, use single-quotes around literals, and double-quotes
714 when the text needs to be interpolated. 
715
716 It is OK to omit quotes around names in braces and when using
717 the => operator, but be careful not to use a name that doubles as
718 a function; in that case, quote.
719
720         $what{'time'}{it}{is} = time();
721
722 When making compound statements, put the primary action first.
723
724         open(FILE, $fh) or die $!;      # right
725         die $! unless open(FILE, $fh);  # wrong
726
727         print "Starting\n" if $verbose; # right
728         $verbose && print "Starting\n"; # wrong
729
730
731 Use here-docs instead of repeated print statements.
732
733                 print <<EOT;
734         This is a whole bunch of text.
735         I like it.  I don't need to worry about messing
736         with lots of print statements and lining them up.
737         EOT
738
739 Just remember that unless you put single quotes around your here-doc
740 token (<<'EOT'), the text will be interpolated, so escape any "$" or "@"
741 as needed.
742
743 =head1 INTERNATIONALIZATION
744
745
746 =head2 String extraction styleguide
747
748 =over 4
749
750 =item Web templates
751
752 Templates should use the /l filtering component to call the localisation
753 framework
754
755 The string              Foo!
756
757 Should become           <&|/l&>Foo!</&>
758
759 All newlines should be removed from localized strings, to make it easy to 
760 grep the codebase for strings to be localized
761
762 The string              Foo
763                         Bar
764                         Baz
765                         
766 Should become           <&|/l&>Foo Bar Baz</&>
767
768
769 Variable subsititutions should be moved to Locale::MakeText format
770
771 The string              Hello, <%$name %>
772
773 should become           <&|/l, $name &>Hello, [_1]</&>  
774
775
776 Multiple variables work just like single variables
777  
778 The string              You found <%$num%> tickets in queue <%$queue%>
779
780 should become           <&|/l, $num, $queue &>You found [_1] tickets in queue [_2]</&>
781
782 When subcomponents are called in the middle of a phrase, they need to be escaped
783 too:
784
785 The string               <input type="submit" value="New ticket in">&nbsp<& /Elements/SelectNewTicketQueue&>
786
787 should become           <&|/l, $m->scomp('/Elements/SelectNewTicketQueue')&><input type="submit" value="New ticket in">&nbsp;[_1]</&>
788
789
790
791
792 The string      <& /Elements/TitleBoxStart, width=> "40%", titleright => "RT $RT::VERSION for   $RT::rtname", title => 'Login' &>
793
794 should become   <& /Elements/TitleBoxStart, 
795                         width=> "40%",
796                         titleright => loc("RT [_1] for [_2]",$RT::VERSION, $RT::rtname),
797                         title => loc('Login'),
798                 &>
799         
800
801 =item Library code                      
802
803
804
805 Within RT's core code, every module has a localization handle available through the 'loc' method:
806
807 The code        return ( $id, "Queue created" );
808
809 should become   return ( $id, $self->loc("Queue created") );    
810
811 When returning or localizing a single string, the "extra" set of parenthesis () should be omitted.
812
813 The code        return ("Subject changed to ". $self->Data );
814
815 should become    return $self->loc( "Subject changed to [_1]", $self->Data );
816
817
818 It is important not to localize  the names of rights or statuses within RT's core, as there is logic that depends on them as string identifiers.  The proper place to localize these values is when they're presented for display in the web or commandline interfaces.
819
820
821 =back 4
822
823 =head1 CODING PRCEDURE
824
825 This is for new programs, modules, specific APIs, or anything else.
826
827 =over 4
828
829 =item Present idea to rt-devel
830
831 We may know of a better way to approach the problem, or know of an
832 existing way to deal with it, or know someone else is working on it. 
833 This is mostly informal, but a fairly complete explanation for the need
834 and use of the code should be provided.
835
836
837 =item Present complete specs to rt-devel
838
839 The complete proposed API  should be submitted for
840 approval and discussion.  For web and command-line programs, present the
841 functionality and interface (op codes, command-lin switches, etc.).
842
843 The best way to do this is to take the documentation portion of the
844 boilerplate and fill it in.  You can make changes later if necessary,
845 but fill it in as much as you can.
846
847
848
849 =item Prepare for code review
850
851 When you are done, the code will undergo a code review by a member of
852 the core team, or someone picked by the core team.  This is not to
853 belittle you (that's just a nice side effect), it is to make sure that
854 you understand your code, that we understand your code, that it won't
855 break other code, that it follows the documentation and existing
856 proposal.  It is to check for possible optimizations or better ways of
857 doing it.
858
859 Note that all code is expected to follow the coding principles and style
860 guide contained in this document.
861
862
863 =item Finish it up
864
865 After the code is done (possibly going through multiple code reviews),
866 if you do not have repository access, submit it to rt-<major-version>-bugs@fsck.com as a unified diff. From that point on, it'll be handled by someone with repository access.
867
868 =back
869
870
871 =head1 BUG REPORTS, PATCHES
872
873 Use rt-<major-version>-bugs@fsck.com for I<any> bug that is not
874 being fixed immediately.  If it is not in RT, there
875 is a good chance it will not be dealt with.
876
877 Send patches to rt-<major-version>-bugs@fsck.com, too.  Use C<diff
878 -u> for patches.
879
880 =head1 SCHEMA DESIGN
881
882 RT uses a convention to denote the foreign key status in its tables.
883 The rule of thumb is:
884
885 =over 4
886
887 =item When it references to another table, always use the table name
888
889 For example, the C<Template> field in the C<Scrips> table refers to
890 the C<Id> of the same-named C<Template> table.
891
892 =item Otherwise, always use the C<Id> suffix
893
894 For example, the C<ObjectId> field in the C<ACL> table can refer
895 to any object, so it has the C<Id> suffix.
896
897 =back
898
899 There are some legacy fields that did not follow this rule, namely
900 C<ACL.PrincipalId>, C<GroupMembers.GroupId> and C<Attachments.TransactionId>,
901 but new tables are expected to be consistent.
902
903 =head1 TO DO
904
905 Talk about DBIx::SearchBuilder
906
907 Talk about mason
908         component style
909         cascading style sheets
910          
911 Talk about adding a new translation
912
913 Talk more about logging
914
915 =head1 CHANGES
916
917         Adapted from Slash Styleguide by jesse - 20 Dec, 2002
918
919
920 =head1 VERSION
921
922 0.1