PageRenderTime 23ms CodeModel.GetById 15ms RepoModel.GetById 1ms app.codeStats 0ms

/lib/coffee/config.coffee

https://github.com/looksgood/yalog
CoffeeScript | 170 lines | 89 code | 52 blank | 29 comment | 11 complexity | e629497e1d28429c599ec696e4dd777a MD5 | raw file
Possible License(s): MIT
  1. _ = require 'underscore'
  2. color = require './color'
  3. log = _.identity
  4. exports.defaultLogLevels = [
  5. { title: 'test' , color: 'magenta'}
  6. { title: 'trace', color: 'cyan' }
  7. { title: 'debug', color: 'blue' }
  8. { title: 'info' , color: 'green' }
  9. { title: 'warn' , color: 'yellow' }
  10. { title: 'error', color: 'red' , background: 'black', attr: ['bold', 'underline']}
  11. ]
  12. exports.defaultFileLevels = [
  13. ["*", "trace"]
  14. ]
  15. # @return array of items that contain {title: title.toUpperCase(), rawTitle, pos, ansiColor start}
  16. parse_log_levels = (methods) ->
  17. unless _.isArray(methods)
  18. throw "methods is defined, but is not an array"
  19. titlesSeen = {}
  20. maxTitleSize = 0
  21. ret = []
  22. for method, pos in methods
  23. unless method.title
  24. throw "title not found for the #{ pos } method"
  25. title = method.title.toUpperCase()
  26. maxTitleSize = Math.max(maxTitleSize, title.length)
  27. if titlesSeen[title]
  28. throw "title already found for '#{ title }'. Must be unique values when taken 'toUpperCase'"
  29. titlesSeen[title] = true
  30. ret.push {
  31. title : title
  32. rawTitle : method.title
  33. pos : pos
  34. ansiColor: color.ansi_str {
  35. font : method.color
  36. background: method.background
  37. attr : method.attr
  38. }
  39. }
  40. # pad the title to align nicely
  41. for item in ret
  42. while (item.title.length < maxTitleSize)
  43. item.title += ' '
  44. return ret
  45. # @return map of title to ansiColors
  46. log_levels_to_map_of_color = (logLevels) ->
  47. ret = {}
  48. for logLevel in logLevels
  49. ret[logLevel.title] = logLevel.ansiColor
  50. return ret
  51. # @return array of rawTitles of each logLevel
  52. log_levels_to_raw_title_arr = (logLevels) ->
  53. return _.pluck(logLevels, "rawTitle")
  54. # @return map of file to map of levels: true
  55. # @returnEx
  56. # input = {
  57. # ["*", "test"]
  58. # ["myFile", ["debug", "warn"]]
  59. # }
  60. # {
  61. # '*': {
  62. # TEST : true
  63. # TRACE: true
  64. # DEBUG: true
  65. # INFO : true
  66. # WARN : true
  67. # ERROR: true
  68. # }
  69. # myFile: {
  70. # DEBUG: true
  71. # WARN : true
  72. # }
  73. # }
  74. parse_file_levels = (fileLevels, logLevels) ->
  75. # log levels is passed as properly parsed log levels. no need to check
  76. unless _.isArray(fileLevels)
  77. throw "fileLevels is defined, but is not an array"
  78. logLevelNameArr = log_levels_to_raw_title_arr(logLevels)
  79. ret = {}
  80. for row, pos in fileLevels
  81. unless _.isArray(row) and row.length is 2
  82. throw "level in row #{ pos } is defined, but is not an array of length 2"
  83. rowFile = row[0]
  84. rowLevels = row[1]
  85. # upgrade a string level to a
  86. if _.isString(rowLevels)
  87. # "info" turns into ["info", "warn", "error"]
  88. logPos = logLevelNameArr.indexOf(rowLevels)
  89. unless logPos isnt -1
  90. throw "level in row '#{ pos }' is not a defined log level"
  91. rowLevels = logLevelNameArr.slice(logPos)
  92. else
  93. unless _.isArray(rowLevels)
  94. throw "level in row '#{ pos }' is not a string or an array"
  95. # is array. check for all strings
  96. unless _.uniq(rowLevels).length is rowLevels.length
  97. throw "log levels in row '#{ pos }' are not unique"
  98. for rowLevel in rowLevels
  99. unless _.include(logLevelNameArr, rowLevel)
  100. throw "log level called '#{ rowLevel }' in row '#{ pos }' is not a valid log level"
  101. # rowLevels are now valid
  102. rowMap = {}
  103. for rowLevel in rowLevels
  104. rowMap[rowLevel] = true
  105. ret[rowFile] = rowMap
  106. return ret
  107. exports.parse = ({logLevels, fileLevels}) ->
  108. logLevels ?= exports.defaultLogLevels
  109. fileLevels ?= exports.defaultFileLevels
  110. parsedLogLevels = parse_log_levels(logLevels)
  111. parsedFileLevels = parse_file_levels(fileLevels, parsedLogLevels)
  112. return {
  113. logLevels
  114. fileLevels
  115. parsedLogLevels
  116. colorMap : log_levels_to_map_of_color(parsedLogLevels)
  117. fileLevelMap: parsedFileLevels
  118. }