Advertisement
Guest User

Untitled

a guest
May 26th, 2015
262
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.69 KB | None | 0 0
  1. _ = require("lodash")
  2.  
  3. module.exports =
  4.  
  5. class FixedLengthBuilder
  6. constructor: (@format, @delimiter = "\r\n") ->
  7.  
  8. build: (objects) ->
  9. objects
  10. .map @_buildOne
  11. .join @delimiter
  12.  
  13. _buildOne: (obj) =>
  14. mapColumn = (column) =>
  15. value = try eval "obj.#{column.name}"
  16.  
  17. value = @
  18. ._padValue value, column
  19. .substr 0, column.length
  20.  
  21. @format.map(mapColumn).join ""
  22.  
  23. _padValue: (value, column) =>
  24. if not value? or value is ""
  25. return _.padLeft " ", column.length
  26.  
  27. if column.decimals? and _.isNumber(value)
  28. _.padLeft(
  29. value.toFixed(column.decimals),
  30. column.length,
  31. "0"
  32. )
  33. else
  34. _.padRight value, column.length
  35.  
  36. #---
  37.  
  38. FixedLengthBuilder = require("./fixedLengthBuilder")
  39.  
  40. describe "FixedLengthBuilder", ->
  41. it "can build a fixed length string from a specific format", ->
  42. builder = new FixedLengthBuilder [
  43. { name: "name", length: 3 }
  44. { name: "dogs[0].description", length: 8 }
  45. { name: "balance", length: 10, decimals: 2 }
  46. ], "\n"
  47.  
  48. people = [
  49. { name: "Rodrigo", dogs: [{ description: "Willy", happyness: 10.5 }], balance: 123.246 }
  50. { name: "Charly", dogs: [{ description: "Octocat", happyness: 99 }], balance: 22323.1 }
  51. ]
  52.  
  53. builder.build(people).should
  54. .eql "RodWilly 0000123.25\nChaOctocat 0022323.10"
  55.  
  56. it "uses \r\n as default delimiter", ->
  57. builder = new FixedLengthBuilder [
  58. { name: "a", length: 1 }
  59. ]
  60.  
  61. input = [
  62. { a: "H" }
  63. { a: "O" }
  64. { a: "L" }
  65. { a: "A" }
  66. ]
  67.  
  68. builder.build(input).should.eql "H\r\nO\r\nL\r\nA"
  69.  
  70. it "puts an empty string if a field is null or empty", ->
  71. builder = new FixedLengthBuilder [
  72. { name: "fruit_property", length: 4, decimals: 20 }
  73. { name: "fruit_property.deep", length: 3 }
  74. { name: "empty", length: 2 }
  75. ]
  76.  
  77. input = [ { name: "Juan Carlos", empty: "" }]
  78.  
  79. builder.build(input).should.eql " "
  80.  
  81. it "truncates the string if the length isn't big enough", ->
  82. builder = new FixedLengthBuilder [
  83. { name: "name", length: 3 }
  84. ], ""
  85.  
  86. input = [
  87. { name: "Ayukawa" }
  88. { name: "Kinomoto" }
  89. ]
  90.  
  91. builder.build(input).should.eql "AyuKin"
  92.  
  93. it "truncates the number if the length isn't big enough", ->
  94. builder = new FixedLengthBuilder [
  95. { name: "price", length: 5, decimals: 2 }
  96. ], "\n"
  97.  
  98. input = [
  99. { price: 130.451 }
  100. { price: 13132.5 }
  101. ]
  102.  
  103. builder.build(input).should.eql "130.4\n13132"
  104.  
  105. it "rounds the number to fix the decimals", ->
  106. builder = new FixedLengthBuilder [
  107. { name: "amount", length: 9, decimals: 3 }
  108. ]
  109.  
  110. input = [{ amount: 130.4577 }]
  111.  
  112. builder.build(input).should.eql "00130.458"
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement