doc/coding_style.md
changeset 9862 54147de1d1b1
child 9902 34a670e2bcfd
equal deleted inserted replaced
9861:3af3a702c54c 9862:54147de1d1b1
       
     1 
       
     2 # Prosody Coding Style Guide
       
     3 
       
     4 This style guides lists the coding conventions used in the
       
     5 [Prosody](https://prosody.im/) project. It is based heavily on the [style guide used by the LuaRocks project](https://github.com/luarocks/lua-style-guide).
       
     6 
       
     7 ## Indentation and formatting
       
     8 
       
     9 * Prosody code is indented with tabs at the start of the line, a single
       
    10   tab per logical indent level:
       
    11 
       
    12 ```lua
       
    13 for i, pkg in ipairs(packages) do
       
    14     for name, version in pairs(pkg) do
       
    15         if name == searched then
       
    16             print(version)
       
    17         end
       
    18     end
       
    19 end
       
    20 ```
       
    21 
       
    22 Tab width is configurable in editors, so never assume a particular width.
       
    23 Specically this means you should not mix tabs and spaces, or use tabs for
       
    24 alignment of items at different indentation levels.
       
    25 
       
    26 * Use LF (Unix) line endings.
       
    27 
       
    28 ## Comments
       
    29 
       
    30 * Comments are encouraged where necessary to explain non-obvious code.
       
    31 
       
    32 * In general comments should be used to explain 'why', not 'how'
       
    33 
       
    34 ### Comment tags
       
    35 
       
    36 A comment may be prefixed with one of the following tags:
       
    37 
       
    38 * **FIXME**: Indicates a serious problem with the code that should be addressed
       
    39 * **TODO**: Indicates an open task, feature request or code restructuring that
       
    40   is primarily of interest to developers (otherwise it should be in the
       
    41   issue tracker).
       
    42 * **COMPAT**: Must be used on all code that is present only for backwards-compatibility,
       
    43   and may be removed one day. For example code that is added to support old
       
    44   or buggy third-party software or dependencies.
       
    45 
       
    46 **Example:**
       
    47 
       
    48 ```lua
       
    49 -- TODO: implement method
       
    50 local function something()
       
    51    -- FIXME: check conditions
       
    52 end
       
    53 
       
    54 ```
       
    55 
       
    56 ## Variable names
       
    57 
       
    58 * Variable names with larger scope should be more descriptive than those with
       
    59 smaller scope. One-letter variable names should be avoided except for very
       
    60 small scopes (less than ten lines) or for iterators.
       
    61 
       
    62 * `i` should be used only as a counter variable in for loops (either numeric for
       
    63 or `ipairs`).
       
    64 
       
    65 * Prefer more descriptive names than `k` and `v` when iterating with `pairs`,
       
    66 unless you are writing a function that operates on generic tables.
       
    67 
       
    68 * Use `_` for ignored variables (e.g. in for loops:)
       
    69 
       
    70 ```lua
       
    71 for _, item in ipairs(items) do
       
    72    do_something_with_item(item)
       
    73 end
       
    74 ```
       
    75 
       
    76 * Generally all identifiers (variables and function names) should use `snake_case`,
       
    77   i.e. lowercase words joined by `_`.
       
    78 
       
    79 ```lua
       
    80 -- bad
       
    81 local OBJEcttsssss = {}
       
    82 local thisIsMyObject = {}
       
    83 local c = function()
       
    84    -- ...stuff...
       
    85 end
       
    86 
       
    87 -- good
       
    88 local this_is_my_object = {}
       
    89 
       
    90 local function do_that_thing()
       
    91    -- ...stuff...
       
    92 end
       
    93 ```
       
    94 
       
    95 > **Rationale:** The standard library uses lowercase APIs, with `joinedlowercase`
       
    96 names, but this does not scale too well for more complex APIs. `snake_case`
       
    97 tends to look good enough and not too out-of-place along side the standard
       
    98 APIs.
       
    99 
       
   100 ```lua
       
   101 for _, name in pairs(names) do
       
   102    -- ...stuff...
       
   103 end
       
   104 ```
       
   105 
       
   106 * Prefer using `is_` when naming boolean functions:
       
   107 
       
   108 ```lua
       
   109 -- bad
       
   110 local function evil(alignment)
       
   111    return alignment < 100
       
   112 end
       
   113 
       
   114 -- good
       
   115 local function is_evil(alignment)
       
   116    return alignment < 100
       
   117 end
       
   118 ```
       
   119 
       
   120 * `UPPER_CASE` is to be used sparingly, with "constants" only.
       
   121 
       
   122 > **Rationale:** "Sparingly", since Lua does not have real constants. This
       
   123 notation is most useful in libraries that bind C libraries, when bringing over
       
   124 constants from C.
       
   125 
       
   126 * Do not use uppercase names starting with `_`, they are reserved by Lua.
       
   127 
       
   128 ## Tables
       
   129 
       
   130 * When creating a table, prefer populating its fields all at once, if possible:
       
   131 
       
   132 ```lua
       
   133 local player = { name = "Jack", class = "Rogue" }
       
   134 }
       
   135 ```
       
   136 
       
   137 * Items should be separated by commas. If there are many items, put each
       
   138   key/value on a separate line and use a semi-colon after each item (including
       
   139   the last one):
       
   140 
       
   141 ```lua
       
   142 local player = {
       
   143    name = "Jack";
       
   144    class = "Rogue";
       
   145 }
       
   146 ```
       
   147 
       
   148 > **Rationale:** This makes the structure of your tables more evident at a glance.
       
   149 Trailing commas make it quicker to add new fields and produces shorter diffs.
       
   150 
       
   151 * Use plain `key` syntax whenever possible, use `["key"]` syntax when using names
       
   152 that can't be represented as identifiers and avoid mixing representations in
       
   153 a declaration:
       
   154 
       
   155 ```lua
       
   156 local mytable = {
       
   157    ["1394-E"] = val1,
       
   158    ["UTF-8"] = val2,
       
   159    ["and"] = val2,
       
   160 }
       
   161 ```
       
   162 
       
   163 ## Strings
       
   164 
       
   165 * Use `"double quotes"` for strings; use `'single quotes'` when writing strings
       
   166 that contain double quotes.
       
   167 
       
   168 ```lua
       
   169 local name = "Prosody"
       
   170 local sentence = 'The name of the program is "Prosody"'
       
   171 ```
       
   172 
       
   173 > **Rationale:** Double quotes are used as string delimiters in a larger number of
       
   174 programming languages. Single quotes are useful for avoiding escaping when
       
   175 using double quotes in literals.
       
   176 
       
   177 ## Line lengths
       
   178 
       
   179 * There are no hard or soft limits on line lengths. Line lengths are naturally
       
   180 limited by using one statement per line. If that still produces lines that are
       
   181 too long (e.g. an expression that produces a line over 256-characters long,
       
   182 for example), this means the expression is too complex and would do better
       
   183 split into subexpressions with reasonable names.
       
   184 
       
   185 > **Rationale:** No one works on VT100 terminals anymore. If line lengths are a proxy
       
   186 for code complexity, we should address code complexity instead of using line
       
   187 breaks to fit mind-bending statements over multiple lines.
       
   188 
       
   189 ## Function declaration syntax
       
   190 
       
   191 * Prefer function syntax over variable syntax. This helps differentiate between
       
   192 named and anonymous functions.
       
   193 
       
   194 ```lua
       
   195 -- bad
       
   196 local nope = function(name, options)
       
   197    -- ...stuff...
       
   198 end
       
   199 
       
   200 -- good
       
   201 local function yup(name, options)
       
   202    -- ...stuff...
       
   203 end
       
   204 ```
       
   205 
       
   206 * Perform validation early and return as early as possible.
       
   207 
       
   208 ```lua
       
   209 -- bad
       
   210 local function is_good_name(name, options, arg)
       
   211    local is_good = #name > 3
       
   212    is_good = is_good and #name < 30
       
   213 
       
   214    -- ...stuff...
       
   215 
       
   216    return is_good
       
   217 end
       
   218 
       
   219 -- good
       
   220 local function is_good_name(name, options, args)
       
   221    if #name < 3 or #name > 30 then
       
   222       return false
       
   223    end
       
   224 
       
   225    -- ...stuff...
       
   226 
       
   227    return true
       
   228 end
       
   229 ```
       
   230 
       
   231 ## Function calls
       
   232 
       
   233 * Even though Lua allows it, generally you should not omit parentheses
       
   234   for functions that take a unique string literal argument.
       
   235 
       
   236 ```lua
       
   237 -- bad
       
   238 local data = get_data"KRP"..tostring(area_number)
       
   239 -- good
       
   240 local data = get_data("KRP"..tostring(area_number))
       
   241 local data = get_data("KRP")..tostring(area_number)
       
   242 ```
       
   243 
       
   244 > **Rationale:** It is not obvious at a glace what the precedence rules are
       
   245 when omitting the parentheses in a function call. Can you quickly tell which
       
   246 of the two "good" examples in equivalent to the "bad" one? (It's the second
       
   247 one).
       
   248 
       
   249 * You should not omit parenthesis for functions that take a unique table
       
   250 argument on a single line. You may do so for table arguments that span several
       
   251 lines.
       
   252 
       
   253 ```lua
       
   254 local an_instance = a_module.new {
       
   255    a_parameter = 42,
       
   256    another_parameter = "yay",
       
   257 }
       
   258 ```
       
   259 
       
   260 > **Rationale:** The use as in `a_module.new` above occurs alone in a statement,
       
   261 so there are no precedence issues.
       
   262 
       
   263 ## Table attributes
       
   264 
       
   265 * Use dot notation when accessing known properties.
       
   266 
       
   267 ```lua
       
   268 local luke = {
       
   269    jedi = true,
       
   270    age = 28,
       
   271 }
       
   272 
       
   273 -- bad
       
   274 local is_jedi = luke["jedi"]
       
   275 
       
   276 -- good
       
   277 local is_jedi = luke.jedi
       
   278 ```
       
   279 
       
   280 * Use subscript notation `[]` when accessing properties with a variable or if using a table as a list.
       
   281 
       
   282 ```lua
       
   283 local vehicles = load_vehicles_from_disk("vehicles.dat")
       
   284 
       
   285 if vehicles["Porsche"] then
       
   286    porsche_handler(vehicles["Porsche"])
       
   287    vehicles["Porsche"] = nil
       
   288 end
       
   289 for name, cars in pairs(vehicles) do
       
   290    regular_handler(cars)
       
   291 end
       
   292 ```
       
   293 
       
   294 > **Rationale:** Using dot notation makes it clearer that the given key is meant
       
   295 to be used as a record/object field.
       
   296 
       
   297 ## Functions in tables
       
   298 
       
   299 * When declaring modules and classes, declare functions external to the table definition:
       
   300 
       
   301 ```lua
       
   302 local my_module = {}
       
   303 
       
   304 function my_module.a_function(x)
       
   305    -- code
       
   306 end
       
   307 ```
       
   308 
       
   309 * When declaring metatables, declare function internal to the table definition.
       
   310 
       
   311 ```lua
       
   312 local version_mt = {
       
   313    __eq = function(a, b)
       
   314       -- code
       
   315    end;
       
   316    __lt = function(a, b)
       
   317       -- code
       
   318    end;
       
   319 }
       
   320 ```
       
   321 
       
   322 > **Rationale:** Metatables contain special behavior that affect the tables
       
   323 they're assigned (and are used implicitly at the call site), so it's good to
       
   324 be able to get a view of the complete behavior of the metatable at a glance.
       
   325 
       
   326 This is not as important for objects and modules, which usually have way more
       
   327 code, and which don't fit in a single screen anyway, so nesting them inside
       
   328 the table does not gain much: when scrolling a longer file, it is more evident
       
   329 that `check_version` is a method of `Api` if it says `function Api:check_version()`
       
   330 than if it says `check_version = function()` under some indentation level.
       
   331 
       
   332 ## Variable declaration
       
   333 
       
   334 * Always use `local` to declare variables. 
       
   335 
       
   336 ```lua
       
   337 -- bad
       
   338 superpower = get_superpower()
       
   339 
       
   340 -- good
       
   341 local superpower = get_superpower()
       
   342 ```
       
   343 
       
   344 > **Rationale:** Not doing so will result in global variables to avoid polluting
       
   345 the global namespace.
       
   346 
       
   347 ## Variable scope
       
   348 
       
   349 * Assign variables with the smallest possible scope.
       
   350 
       
   351 ```lua
       
   352 -- bad
       
   353 local function good()
       
   354    local name = get_name()
       
   355 
       
   356    test()
       
   357    print("doing stuff..")
       
   358 
       
   359    --...other stuff...
       
   360 
       
   361    if name == "test" then
       
   362       return false
       
   363    end
       
   364 
       
   365    return name
       
   366 end
       
   367 
       
   368 -- good
       
   369 local bad = function()
       
   370    test()
       
   371    print("doing stuff..")
       
   372 
       
   373    --...other stuff...
       
   374 
       
   375    local name = get_name()
       
   376 
       
   377    if name == "test" then
       
   378       return false
       
   379    end
       
   380 
       
   381    return name
       
   382 end
       
   383 ```
       
   384 
       
   385 > **Rationale:** Lua has proper lexical scoping. Declaring the function later means that its
       
   386 scope is smaller, so this makes it easier to check for the effects of a variable.
       
   387 
       
   388 ## Conditional expressions
       
   389 
       
   390 * False and nil are falsy in conditional expressions. Use shortcuts when you
       
   391 can, unless you need to know the difference between false and nil.
       
   392 
       
   393 ```lua
       
   394 -- bad
       
   395 if name ~= nil then
       
   396    -- ...stuff...
       
   397 end
       
   398 
       
   399 -- good
       
   400 if name then
       
   401    -- ...stuff...
       
   402 end
       
   403 ```
       
   404 
       
   405 * Avoid designing APIs which depend on the difference between `nil` and `false`.
       
   406 
       
   407 * Use the `and`/`or` idiom for the pseudo-ternary operator when it results in
       
   408 more straightforward code. When nesting expressions, use parentheses to make it
       
   409 easier to scan visually:
       
   410 
       
   411 ```lua
       
   412 local function default_name(name)
       
   413    -- return the default "Waldo" if name is nil
       
   414    return name or "Waldo"
       
   415 end
       
   416 
       
   417 local function brew_coffee(machine)
       
   418    return (machine and machine.is_loaded) and "coffee brewing" or "fill your water"
       
   419 end
       
   420 ```
       
   421 
       
   422 Note that the `x and y or z` as a substitute for `x ? y : z` does not work if
       
   423 `y` may be `nil` or `false` so avoid it altogether for returning booleans or
       
   424 values which may be nil.
       
   425 
       
   426 ## Blocks
       
   427 
       
   428 * Use single-line blocks only for `then return`, `then break` and `function return` (a.k.a "lambda") constructs:
       
   429 
       
   430 ```lua
       
   431 -- good
       
   432 if test then break end
       
   433 
       
   434 -- good
       
   435 if not ok then return nil, "this failed for this reason: " .. reason end
       
   436 
       
   437 -- good
       
   438 use_callback(x, function(k) return k.last end)
       
   439 
       
   440 -- good
       
   441 if test then
       
   442   return false
       
   443 end
       
   444 
       
   445 -- bad
       
   446 if test < 1 and do_complicated_function(test) == false or seven == 8 and nine == 10 then do_other_complicated_function() end
       
   447 
       
   448 -- good
       
   449 if test < 1 and do_complicated_function(test) == false or seven == 8 and nine == 10 then
       
   450    do_other_complicated_function() 
       
   451    return false 
       
   452 end
       
   453 ```
       
   454 
       
   455 * Separate statements onto multiple lines. Do not use semicolons as statement terminators.
       
   456 
       
   457 ```lua
       
   458 -- bad
       
   459 local whatever = "sure";
       
   460 a = 1; b = 2
       
   461 
       
   462 -- good
       
   463 local whatever = "sure"
       
   464 a = 1
       
   465 b = 2
       
   466 ```
       
   467 
       
   468 ## Spacing
       
   469 
       
   470 * Use a space after `--`. 
       
   471 
       
   472 ```lua
       
   473 --bad
       
   474 -- good
       
   475 ```
       
   476 
       
   477 * Always put a space after commas and between operators and assignment signs:
       
   478 
       
   479 ```lua
       
   480 -- bad
       
   481 local x = y*9
       
   482 local numbers={1,2,3}
       
   483 numbers={1 , 2 , 3}
       
   484 numbers={1 ,2 ,3}
       
   485 local strings = { "hello"
       
   486                 , "Lua"
       
   487                 , "world"
       
   488                 }
       
   489 dog.set( "attr",{
       
   490   age="1 year",
       
   491   breed="Bernese Mountain Dog"
       
   492 })
       
   493 
       
   494 -- good
       
   495 local x = y * 9
       
   496 local numbers = {1, 2, 3}
       
   497 local strings = {
       
   498     "hello";
       
   499     "Lua";
       
   500     "world";
       
   501 }
       
   502 dog.set("attr", {
       
   503    age = "1 year",
       
   504    breed = "Bernese Mountain Dog",
       
   505 })
       
   506 ```
       
   507 
       
   508 * Indent tables and functions according to the start of the line, not the construct:
       
   509 
       
   510 ```lua
       
   511 -- bad
       
   512 local my_table = {
       
   513                     "hello",
       
   514                     "world",
       
   515                  }
       
   516 using_a_callback(x, function(...)
       
   517                        print("hello")
       
   518                     end)
       
   519 
       
   520 -- good
       
   521 local my_table = {
       
   522     "hello";
       
   523     "world";
       
   524 }
       
   525 using_a_callback(x, function(...)
       
   526    print("hello")
       
   527 end)
       
   528 ```
       
   529 
       
   530 > **Rationale:** This keep indentation levels aligned at predictable places. You don't
       
   531 need to realign the entire block if something in the first line changes (such as
       
   532 replacing `x` with `xy` in the `using_a_callback` example above).
       
   533 
       
   534 * The concatenation operator gets a pass for avoiding spaces:
       
   535 
       
   536 ```lua
       
   537 -- okay
       
   538 local message = "Hello, "..user.."! This is your day # "..day.." in our platform!"
       
   539 ```
       
   540 
       
   541 > **Rationale:** Being at the baseline, the dots already provide some visual spacing.
       
   542 
       
   543 * No spaces after the name of a function in a declaration or in its arguments:
       
   544 
       
   545 ```lua
       
   546 -- bad
       
   547 local function hello ( name, language )
       
   548    -- code
       
   549 end
       
   550 
       
   551 -- good
       
   552 local function hello(name, language)
       
   553    -- code
       
   554 end
       
   555 ```
       
   556 
       
   557 * Add blank lines between functions:
       
   558 
       
   559 ```lua
       
   560 -- bad
       
   561 local function foo()
       
   562    -- code
       
   563 end
       
   564 local function bar()
       
   565    -- code
       
   566 end
       
   567 
       
   568 -- good
       
   569 local function foo()
       
   570    -- code
       
   571 end
       
   572 
       
   573 local function bar()
       
   574    -- code
       
   575 end
       
   576 ```
       
   577 
       
   578 * Avoid aligning variable declarations:
       
   579 
       
   580 ```lua
       
   581 -- bad
       
   582 local a               = 1
       
   583 local long_identifier = 2
       
   584 
       
   585 -- good
       
   586 local a = 1
       
   587 local long_identifier = 2
       
   588 ```
       
   589 
       
   590 > **Rationale:** This produces extra diffs which add noise to `git blame`.
       
   591 
       
   592 * Alignment is occasionally useful when logical correspondence is to be highlighted:
       
   593 
       
   594 ```lua
       
   595 -- okay
       
   596 sys_command(form, UI_FORM_UPDATE_NODE, "a",      FORM_NODE_HIDDEN,  false)
       
   597 sys_command(form, UI_FORM_UPDATE_NODE, "sample", FORM_NODE_VISIBLE, false)
       
   598 ```
       
   599 
       
   600 ## Typing
       
   601 
       
   602 * In non-performance critical code, it can be useful to add type-checking assertions
       
   603 for function arguments:
       
   604 
       
   605 ```lua
       
   606 function manif.load_manifest(repo_url, lua_version)
       
   607    assert(type(repo_url) == "string")
       
   608    assert(type(lua_version) == "string" or not lua_version)
       
   609 
       
   610    -- ...
       
   611 end
       
   612 ```
       
   613 
       
   614 * Use the standard functions for type conversion, avoid relying on coercion:
       
   615 
       
   616 ```lua
       
   617 -- bad
       
   618 local total_score = review_score .. ""
       
   619 
       
   620 -- good
       
   621 local total_score = tostring(review_score)
       
   622 ```
       
   623 
       
   624 ## Errors
       
   625 
       
   626 * Functions that can fail for reasons that are expected (e.g. I/O) should
       
   627 return `nil` and a (string) error message on error, possibly followed by other
       
   628 return values such as an error code.
       
   629 
       
   630 * On errors such as API misuse, an error should be thrown, either with `error()`
       
   631 or `assert()`.
       
   632 
       
   633 ## Modules
       
   634 
       
   635 Follow [these guidelines](http://hisham.hm/2014/01/02/how-to-write-lua-modules-in-a-post-module-world/) for writing modules. In short:
       
   636 
       
   637 * Always require a module into a local variable named after the last component of the module’s full name.
       
   638 
       
   639 ```lua
       
   640 local bar = require("foo.bar") -- requiring the module
       
   641 
       
   642 bar.say("hello") -- using the module
       
   643 ```
       
   644 
       
   645 * Don’t rename modules arbitrarily:
       
   646 
       
   647 ```lua
       
   648 -- bad
       
   649 local skt = require("socket")
       
   650 ```
       
   651 
       
   652 > **Rationale:** Code is much harder to read if we have to keep going back to the top
       
   653 to check how you chose to call a module.
       
   654 
       
   655 * Start a module by declaring its table using the same all-lowercase local
       
   656 name that will be used to require it. You may use an LDoc comment to identify
       
   657 the whole module path.
       
   658 
       
   659 ```lua
       
   660 --- @module foo.bar
       
   661 local bar = {}
       
   662 ```
       
   663 
       
   664 * Try to use names that won't clash with your local variables. For instance, don't
       
   665 name your module something like “size”.
       
   666 
       
   667 * Use `local function` to declare _local_ functions only: that is, functions
       
   668 that won’t be accessible from outside the module.
       
   669 
       
   670 That is, `local function helper_foo()` means that `helper_foo` is really local.
       
   671 
       
   672 * Public functions are declared in the module table, with dot syntax:
       
   673 
       
   674 ```lua
       
   675 function bar.say(greeting)
       
   676    print(greeting)
       
   677 end
       
   678 ```
       
   679 
       
   680 > **Rationale:** Visibility rules are made explicit through syntax.
       
   681 
       
   682 * Do not set any globals in your module and always return a table in the end.
       
   683 
       
   684 * If you would like your module to be used as a function, you may set the
       
   685 `__call` metamethod on the module table instead.
       
   686 
       
   687 > **Rationale:** Modules should return tables in order to be amenable to have their
       
   688 contents inspected via the Lua interactive interpreter or other tools.
       
   689 
       
   690 * Requiring a module should cause no side-effect other than loading other
       
   691 modules and returning the module table.
       
   692 
       
   693 * A module should not have state. If a module needs configuration, turn
       
   694   it into a factory. For example, do not make something like this:
       
   695 
       
   696 ```lua
       
   697 -- bad
       
   698 local mp = require "MessagePack"
       
   699 mp.set_integer("unsigned")
       
   700 ```
       
   701 
       
   702 and do something like this instead:
       
   703 
       
   704 ```lua
       
   705 -- good
       
   706 local messagepack = require("messagepack")
       
   707 local mpack = messagepack.new({integer = "unsigned"})
       
   708 ```
       
   709 
       
   710 * The invocation of require may omit parentheses around the module name:
       
   711 
       
   712 ```lua
       
   713 local bla = require "bla"
       
   714 ```
       
   715 
       
   716 ## Metatables, classes and objects
       
   717 
       
   718 If creating a new type of object that has a metatable and methods, the
       
   719 metatable and methods table should be separate, and the metatable name
       
   720 should end with `_mt`.
       
   721 
       
   722 ```lua
       
   723 local mytype_methods = {};
       
   724 local mytype_mt = { __index = mytype_methods };
       
   725 
       
   726 function mytype_methods:add_new_thing(thing)
       
   727 end
       
   728 
       
   729 local function new()
       
   730     return setmetatable({}, mytype_mt);
       
   731 end
       
   732 
       
   733 return { new = new };
       
   734 ```
       
   735 
       
   736 * Use the method notation when invoking methods:
       
   737 
       
   738 ```
       
   739 -- bad
       
   740 my_object.my_method(my_object)
       
   741 
       
   742 -- good
       
   743 my_object:my_method()
       
   744 ```
       
   745 
       
   746 > **Rationale:** This makes it explicit that the intent is to use the function as a method.
       
   747 
       
   748 * Do not rely on the `__gc` metamethod to release resources other than memory.
       
   749 If your object manage resources such as files, add a `close` method to their
       
   750 APIs and do not auto-close via `__gc`. Auto-closing via `__gc` would entice
       
   751 users of your module to not close resources as soon as possible. (Note that
       
   752 the standard `io` library does not follow this recommendation, and users often
       
   753 forget that not closing files immediately can lead to "too many open files"
       
   754 errors when the program runs for a while.)
       
   755 
       
   756 > **Rationale:** The garbage collector performs automatic *memory* management,
       
   757 dealing with memory only. There is no guarantees as to when the garbage
       
   758 collector will be invoked, and memory pressure does not correlate to pressure
       
   759 on other resources.
       
   760 
       
   761 ## File structure
       
   762 
       
   763 * Lua files should be named in all lowercase.
       
   764 
       
   765 * Tests should be in a top-level `spec` directory. Prosody uses
       
   766 [Busted](http://olivinelabs.com/busted/) for testing.
       
   767 
       
   768 ## Static checking
       
   769 
       
   770 All code should pass [luacheck](https://github.com/mpeterv/luacheck) using
       
   771 the `.luacheckrc` provided in the Prosody repository, and using miminal
       
   772 inline exceptions.
       
   773 
       
   774 * luacheck warnings of class 211, 212, 213 (unused variable, argument or loop
       
   775 variable) may be ignored, if the unused variable was added explicitly: for
       
   776 example, sometimes it is useful, for code understandability, to spell out what
       
   777 the keys and values in a table are, even if you're only using one of them.
       
   778 Another example is a function that needs to follow a given signature for API
       
   779 reasons (e.g. a callback that follows a given format) but doesn't use some of
       
   780 its arguments; it's better to spell out in the argument what the API the
       
   781 function implements is, instead of adding `_` variables.
       
   782 
       
   783 ```
       
   784 local foo, bar = some_function() --luacheck: ignore 212/foo
       
   785 print(bar)
       
   786 ```
       
   787 
       
   788 * luacheck warning 542 (empty if branch) can also be ignored, when a sequence
       
   789 of `if`/`elseif`/`else` blocks implements a "switch/case"-style list of cases,
       
   790 and one of the cases is meant to mean "pass". For example:
       
   791 
       
   792 ```lua
       
   793 if warning >= 600 and warning <= 699 then
       
   794    print("no whitespace warnings")
       
   795 elseif warning == 542 then --luacheck: ignore 542
       
   796    -- pass
       
   797 else
       
   798    print("got a warning: "..warning)
       
   799 end
       
   800 ```
       
   801 
       
   802 > **Rationale:** This avoids writing negated conditions in the final fallback
       
   803 case, and it's easy to add another case to the construct without having to
       
   804 edit the fallback.
       
   805