lina 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (219) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +33 -14
  3. data/app/assets/javascripts/lina/abn_tree_directive.js +2 -2
  4. data/app/assets/javascripts/lina/apidoc_controller.js +0 -15
  5. data/app/assets/javascripts/lina/json_parse_directive.js.erb +119 -0
  6. data/app/assets/javascripts/templates/lina/schema.html +83 -0
  7. data/app/assets/stylesheets/lina/{apidoc.css.scss → apidoc.scss} +47 -4
  8. data/app/views/lina/apidoc/index.html.erb +11 -50
  9. data/lib/generators/lina/api/USAGE +16 -0
  10. data/lib/generators/lina/api/api_generator.rb +60 -0
  11. data/lib/generators/{templates → lina/api/templates}/controller.rb +1 -1
  12. data/lib/generators/lina/{install_generator.rb → install/install_generator.rb} +3 -1
  13. data/lib/generators/{templates → lina/install/templates}/lina.rb +0 -0
  14. data/lib/generators/lina/view/templates/view.json.jbuilder +2 -0
  15. data/lib/generators/lina/view/view_generator.rb +17 -0
  16. data/lib/lina/error.rb +6 -0
  17. data/lib/lina/schema.rb +11 -1
  18. data/lib/lina/version.rb +1 -1
  19. data/test/controllers/lina/schema_controller_test.rb +29 -4
  20. data/test/dummy/app/controllers/arrays_controller.rb +133 -0
  21. data/test/dummy/app/controllers/desks_controller.rb +20 -0
  22. data/test/dummy/app/controllers/posts_controller.rb +2 -0
  23. data/test/dummy/config/routes.rb +15 -1
  24. data/test/dummy/log/development.log +12346 -0
  25. data/test/dummy/log/test.log +6415 -0
  26. data/test/dummy/test/controllers/arrays_controller_test.rb +14 -0
  27. data/test/dummy/test/controllers/desks_controller_test.rb +5 -1
  28. data/test/dummy/tmp/cache/assets/development/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_alerts.scssc +0 -0
  29. data/test/dummy/tmp/cache/assets/development/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_badges.scssc +0 -0
  30. data/test/dummy/tmp/cache/assets/development/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_breadcrumbs.scssc +0 -0
  31. data/test/dummy/tmp/cache/assets/development/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_button-groups.scssc +0 -0
  32. data/test/dummy/tmp/cache/assets/development/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_buttons.scssc +0 -0
  33. data/test/dummy/tmp/cache/assets/development/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_carousel.scssc +0 -0
  34. data/test/dummy/tmp/cache/assets/development/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_close.scssc +0 -0
  35. data/test/dummy/tmp/cache/assets/development/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_code.scssc +0 -0
  36. data/test/dummy/tmp/cache/assets/development/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_component-animations.scssc +0 -0
  37. data/test/dummy/tmp/cache/assets/development/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_dropdowns.scssc +0 -0
  38. data/test/dummy/tmp/cache/assets/development/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_forms.scssc +0 -0
  39. data/test/dummy/tmp/cache/assets/development/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_glyphicons.scssc +0 -0
  40. data/test/dummy/tmp/cache/assets/development/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_grid.scssc +0 -0
  41. data/test/dummy/tmp/cache/assets/development/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_input-groups.scssc +0 -0
  42. data/test/dummy/tmp/cache/assets/development/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_jumbotron.scssc +0 -0
  43. data/test/dummy/tmp/cache/assets/development/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_labels.scssc +0 -0
  44. data/test/dummy/tmp/cache/assets/development/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_list-group.scssc +0 -0
  45. data/test/dummy/tmp/cache/assets/development/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_media.scssc +0 -0
  46. data/test/dummy/tmp/cache/assets/development/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_mixins.scssc +0 -0
  47. data/test/dummy/tmp/cache/assets/development/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_modals.scssc +0 -0
  48. data/test/dummy/tmp/cache/assets/development/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_navbar.scssc +0 -0
  49. data/test/dummy/tmp/cache/assets/development/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_navs.scssc +0 -0
  50. data/test/dummy/tmp/cache/assets/development/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_normalize.scssc +0 -0
  51. data/test/dummy/tmp/cache/assets/development/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_pager.scssc +0 -0
  52. data/test/dummy/tmp/cache/assets/development/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_pagination.scssc +0 -0
  53. data/test/dummy/tmp/cache/assets/development/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_panels.scssc +0 -0
  54. data/test/dummy/tmp/cache/assets/development/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_popovers.scssc +0 -0
  55. data/test/dummy/tmp/cache/assets/development/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_print.scssc +0 -0
  56. data/test/dummy/tmp/cache/assets/development/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_progress-bars.scssc +0 -0
  57. data/test/dummy/tmp/cache/assets/development/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_responsive-embed.scssc +0 -0
  58. data/test/dummy/tmp/cache/assets/development/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_responsive-utilities.scssc +0 -0
  59. data/test/dummy/tmp/cache/assets/development/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_scaffolding.scssc +0 -0
  60. data/test/dummy/tmp/cache/assets/development/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_tables.scssc +0 -0
  61. data/test/dummy/tmp/cache/assets/development/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_thumbnails.scssc +0 -0
  62. data/test/dummy/tmp/cache/assets/development/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_tooltip.scssc +0 -0
  63. data/test/dummy/tmp/cache/assets/development/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_type.scssc +0 -0
  64. data/test/dummy/tmp/cache/assets/development/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_utilities.scssc +0 -0
  65. data/test/dummy/tmp/cache/assets/development/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_variables.scssc +0 -0
  66. data/test/dummy/tmp/cache/assets/development/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_wells.scssc +0 -0
  67. data/test/dummy/tmp/cache/assets/development/sass/31f62b379790380fb7c14342e6a18bd5f1f962b5/apidoc.css.scssc +0 -0
  68. data/test/dummy/tmp/cache/assets/development/sass/31f62b379790380fb7c14342e6a18bd5f1f962b5/apidoc.scssc +0 -0
  69. data/test/dummy/tmp/cache/assets/development/sass/53a32fd0cf48f407b2d4f9ed7db422c6981fc426/_bootstrap-sprockets.scssc +0 -0
  70. data/test/dummy/tmp/cache/assets/development/sass/53a32fd0cf48f407b2d4f9ed7db422c6981fc426/_bootstrap.scssc +0 -0
  71. data/test/dummy/tmp/cache/assets/development/sass/59128e3c9d0de44abe4a6b4e668b47538a90769b/abn_tree.cssc +0 -0
  72. data/test/dummy/tmp/cache/assets/development/sass/59128e3c9d0de44abe4a6b4e668b47538a90769b/apidoc.scssc +0 -0
  73. data/test/dummy/tmp/cache/assets/development/sass/59128e3c9d0de44abe4a6b4e668b47538a90769b/application.css.scssc +0 -0
  74. data/test/dummy/tmp/cache/assets/development/sass/76cdb9703e11b00861473eddaceac644b134d566/_alerts.scssc +0 -0
  75. data/test/dummy/tmp/cache/assets/development/sass/76cdb9703e11b00861473eddaceac644b134d566/_background-variant.scssc +0 -0
  76. data/test/dummy/tmp/cache/assets/development/sass/76cdb9703e11b00861473eddaceac644b134d566/_border-radius.scssc +0 -0
  77. data/test/dummy/tmp/cache/assets/development/sass/76cdb9703e11b00861473eddaceac644b134d566/_buttons.scssc +0 -0
  78. data/test/dummy/tmp/cache/assets/development/sass/76cdb9703e11b00861473eddaceac644b134d566/_center-block.scssc +0 -0
  79. data/test/dummy/tmp/cache/assets/development/sass/76cdb9703e11b00861473eddaceac644b134d566/_clearfix.scssc +0 -0
  80. data/test/dummy/tmp/cache/assets/development/sass/76cdb9703e11b00861473eddaceac644b134d566/_forms.scssc +0 -0
  81. data/test/dummy/tmp/cache/assets/development/sass/76cdb9703e11b00861473eddaceac644b134d566/_gradients.scssc +0 -0
  82. data/test/dummy/tmp/cache/assets/development/sass/76cdb9703e11b00861473eddaceac644b134d566/_grid-framework.scssc +0 -0
  83. data/test/dummy/tmp/cache/assets/development/sass/76cdb9703e11b00861473eddaceac644b134d566/_grid.scssc +0 -0
  84. data/test/dummy/tmp/cache/assets/development/sass/76cdb9703e11b00861473eddaceac644b134d566/_hide-text.scssc +0 -0
  85. data/test/dummy/tmp/cache/assets/development/sass/76cdb9703e11b00861473eddaceac644b134d566/_image.scssc +0 -0
  86. data/test/dummy/tmp/cache/assets/development/sass/76cdb9703e11b00861473eddaceac644b134d566/_labels.scssc +0 -0
  87. data/test/dummy/tmp/cache/assets/development/sass/76cdb9703e11b00861473eddaceac644b134d566/_list-group.scssc +0 -0
  88. data/test/dummy/tmp/cache/assets/development/sass/76cdb9703e11b00861473eddaceac644b134d566/_nav-divider.scssc +0 -0
  89. data/test/dummy/tmp/cache/assets/development/sass/76cdb9703e11b00861473eddaceac644b134d566/_nav-vertical-align.scssc +0 -0
  90. data/test/dummy/tmp/cache/assets/development/sass/76cdb9703e11b00861473eddaceac644b134d566/_opacity.scssc +0 -0
  91. data/test/dummy/tmp/cache/assets/development/sass/76cdb9703e11b00861473eddaceac644b134d566/_pagination.scssc +0 -0
  92. data/test/dummy/tmp/cache/assets/development/sass/76cdb9703e11b00861473eddaceac644b134d566/_panels.scssc +0 -0
  93. data/test/dummy/tmp/cache/assets/development/sass/76cdb9703e11b00861473eddaceac644b134d566/_progress-bar.scssc +0 -0
  94. data/test/dummy/tmp/cache/assets/development/sass/76cdb9703e11b00861473eddaceac644b134d566/_reset-filter.scssc +0 -0
  95. data/test/dummy/tmp/cache/assets/development/sass/76cdb9703e11b00861473eddaceac644b134d566/_resize.scssc +0 -0
  96. data/test/dummy/tmp/cache/assets/development/sass/76cdb9703e11b00861473eddaceac644b134d566/_responsive-visibility.scssc +0 -0
  97. data/test/dummy/tmp/cache/assets/development/sass/76cdb9703e11b00861473eddaceac644b134d566/_size.scssc +0 -0
  98. data/test/dummy/tmp/cache/assets/development/sass/76cdb9703e11b00861473eddaceac644b134d566/_tab-focus.scssc +0 -0
  99. data/test/dummy/tmp/cache/assets/development/sass/76cdb9703e11b00861473eddaceac644b134d566/_table-row.scssc +0 -0
  100. data/test/dummy/tmp/cache/assets/development/sass/76cdb9703e11b00861473eddaceac644b134d566/_text-emphasis.scssc +0 -0
  101. data/test/dummy/tmp/cache/assets/development/sass/76cdb9703e11b00861473eddaceac644b134d566/_text-overflow.scssc +0 -0
  102. data/test/dummy/tmp/cache/assets/development/sass/76cdb9703e11b00861473eddaceac644b134d566/_vendor-prefixes.scssc +0 -0
  103. data/test/dummy/tmp/cache/assets/development/sprockets/00c0697c7f3d2183c5054b6d38c61f85 +0 -0
  104. data/test/dummy/tmp/cache/assets/development/sprockets/025d3a514dee2fa6c61e1a8ddf8a811d +0 -0
  105. data/test/dummy/tmp/cache/assets/development/sprockets/02a3514578e42443fe85977b2fa33999 +0 -0
  106. data/test/dummy/tmp/cache/assets/development/sprockets/04611c51cd5b7bf26e6244fa19a5bfbd +0 -0
  107. data/test/dummy/tmp/cache/assets/development/sprockets/0b7428701b735623bbe7e6ff4342e7d6 +0 -0
  108. data/test/dummy/tmp/cache/assets/development/sprockets/1577d2d6ed493aa41d8a0f599887e3ef +0 -0
  109. data/test/dummy/tmp/cache/assets/development/sprockets/3251c44fa643b7b625c6c05cb11eeca4 +0 -0
  110. data/test/dummy/tmp/cache/assets/development/sprockets/33d68f21fb49b60aed8ccf2fc84a8588 +0 -0
  111. data/test/dummy/tmp/cache/assets/development/sprockets/37174a1556289cff8371d738701222ad +0 -0
  112. data/test/dummy/tmp/cache/assets/development/sprockets/3778e1b875202b71d8638dd8123c5f89 +0 -0
  113. data/test/dummy/tmp/cache/assets/development/sprockets/56215ed95a30ca742697e6460294e93a +0 -0
  114. data/test/dummy/tmp/cache/assets/development/sprockets/60da8e2105fc458c2af620764edd5dbf +0 -0
  115. data/test/dummy/tmp/cache/assets/development/sprockets/76933b790c46e6a92d7cd635de614eaf +0 -0
  116. data/test/dummy/tmp/cache/assets/development/sprockets/816bfd11725a6e3a206bfed45256be5a +0 -0
  117. data/test/dummy/tmp/cache/assets/development/sprockets/86a50a0819617ecca8256b7ae7cc96af +0 -0
  118. data/test/dummy/tmp/cache/assets/development/sprockets/a4dee2e02e8ce21babef0bbc5c84923e +0 -0
  119. data/test/dummy/tmp/cache/assets/development/sprockets/adc20d6f5970149f252754b46e2217df +0 -0
  120. data/test/dummy/tmp/cache/assets/development/sprockets/af31938f2dc1a756d4b68c68f0c90955 +0 -0
  121. data/test/dummy/tmp/cache/assets/development/sprockets/be482a8ab680e404d9e36ad99f5d9ca2 +0 -0
  122. data/test/dummy/tmp/cache/assets/development/sprockets/c1a8fdbd07c6b685d2ac56f87b47138d +0 -0
  123. data/test/dummy/tmp/cache/assets/development/sprockets/f4e4f7b077370875d66bd890b0ba36d3 +0 -0
  124. data/test/dummy/tmp/cache/assets/development/sprockets/f5f15562a56635717efb1b395c3de2a6 +0 -0
  125. data/test/dummy/tmp/cache/assets/development/sprockets/f794aa494de85bff62b026a35b9194f9 +0 -0
  126. data/test/dummy/tmp/cache/assets/test/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_alerts.scssc +0 -0
  127. data/test/dummy/tmp/cache/assets/test/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_badges.scssc +0 -0
  128. data/test/dummy/tmp/cache/assets/test/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_breadcrumbs.scssc +0 -0
  129. data/test/dummy/tmp/cache/assets/test/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_button-groups.scssc +0 -0
  130. data/test/dummy/tmp/cache/assets/test/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_buttons.scssc +0 -0
  131. data/test/dummy/tmp/cache/assets/test/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_carousel.scssc +0 -0
  132. data/test/dummy/tmp/cache/assets/test/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_close.scssc +0 -0
  133. data/test/dummy/tmp/cache/assets/test/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_code.scssc +0 -0
  134. data/test/dummy/tmp/cache/assets/test/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_component-animations.scssc +0 -0
  135. data/test/dummy/tmp/cache/assets/test/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_dropdowns.scssc +0 -0
  136. data/test/dummy/tmp/cache/assets/test/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_forms.scssc +0 -0
  137. data/test/dummy/tmp/cache/assets/test/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_glyphicons.scssc +0 -0
  138. data/test/dummy/tmp/cache/assets/test/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_grid.scssc +0 -0
  139. data/test/dummy/tmp/cache/assets/test/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_input-groups.scssc +0 -0
  140. data/test/dummy/tmp/cache/assets/test/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_jumbotron.scssc +0 -0
  141. data/test/dummy/tmp/cache/assets/test/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_labels.scssc +0 -0
  142. data/test/dummy/tmp/cache/assets/test/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_list-group.scssc +0 -0
  143. data/test/dummy/tmp/cache/assets/test/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_media.scssc +0 -0
  144. data/test/dummy/tmp/cache/assets/test/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_mixins.scssc +0 -0
  145. data/test/dummy/tmp/cache/assets/test/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_modals.scssc +0 -0
  146. data/test/dummy/tmp/cache/assets/test/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_navbar.scssc +0 -0
  147. data/test/dummy/tmp/cache/assets/test/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_navs.scssc +0 -0
  148. data/test/dummy/tmp/cache/assets/test/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_normalize.scssc +0 -0
  149. data/test/dummy/tmp/cache/assets/test/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_pager.scssc +0 -0
  150. data/test/dummy/tmp/cache/assets/test/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_pagination.scssc +0 -0
  151. data/test/dummy/tmp/cache/assets/test/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_panels.scssc +0 -0
  152. data/test/dummy/tmp/cache/assets/test/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_popovers.scssc +0 -0
  153. data/test/dummy/tmp/cache/assets/test/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_print.scssc +0 -0
  154. data/test/dummy/tmp/cache/assets/test/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_progress-bars.scssc +0 -0
  155. data/test/dummy/tmp/cache/assets/test/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_responsive-embed.scssc +0 -0
  156. data/test/dummy/tmp/cache/assets/test/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_responsive-utilities.scssc +0 -0
  157. data/test/dummy/tmp/cache/assets/test/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_scaffolding.scssc +0 -0
  158. data/test/dummy/tmp/cache/assets/test/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_tables.scssc +0 -0
  159. data/test/dummy/tmp/cache/assets/test/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_thumbnails.scssc +0 -0
  160. data/test/dummy/tmp/cache/assets/test/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_tooltip.scssc +0 -0
  161. data/test/dummy/tmp/cache/assets/test/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_type.scssc +0 -0
  162. data/test/dummy/tmp/cache/assets/test/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_utilities.scssc +0 -0
  163. data/test/dummy/tmp/cache/assets/test/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_variables.scssc +0 -0
  164. data/test/dummy/tmp/cache/assets/test/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_wells.scssc +0 -0
  165. data/test/dummy/tmp/cache/assets/test/sass/53a32fd0cf48f407b2d4f9ed7db422c6981fc426/_bootstrap-sprockets.scssc +0 -0
  166. data/test/dummy/tmp/cache/assets/test/sass/53a32fd0cf48f407b2d4f9ed7db422c6981fc426/_bootstrap.scssc +0 -0
  167. data/test/dummy/tmp/cache/assets/test/sass/59128e3c9d0de44abe4a6b4e668b47538a90769b/abn_tree.cssc +0 -0
  168. data/test/dummy/tmp/cache/assets/test/sass/59128e3c9d0de44abe4a6b4e668b47538a90769b/apidoc.css.scssc +0 -0
  169. data/test/dummy/tmp/cache/assets/test/sass/59128e3c9d0de44abe4a6b4e668b47538a90769b/apidoc.scssc +0 -0
  170. data/test/dummy/tmp/cache/assets/test/sass/59128e3c9d0de44abe4a6b4e668b47538a90769b/application.css.scssc +0 -0
  171. data/test/dummy/tmp/cache/assets/test/sass/76cdb9703e11b00861473eddaceac644b134d566/_alerts.scssc +0 -0
  172. data/test/dummy/tmp/cache/assets/test/sass/76cdb9703e11b00861473eddaceac644b134d566/_background-variant.scssc +0 -0
  173. data/test/dummy/tmp/cache/assets/test/sass/76cdb9703e11b00861473eddaceac644b134d566/_border-radius.scssc +0 -0
  174. data/test/dummy/tmp/cache/assets/test/sass/76cdb9703e11b00861473eddaceac644b134d566/_buttons.scssc +0 -0
  175. data/test/dummy/tmp/cache/assets/test/sass/76cdb9703e11b00861473eddaceac644b134d566/_center-block.scssc +0 -0
  176. data/test/dummy/tmp/cache/assets/test/sass/76cdb9703e11b00861473eddaceac644b134d566/_clearfix.scssc +0 -0
  177. data/test/dummy/tmp/cache/assets/test/sass/76cdb9703e11b00861473eddaceac644b134d566/_forms.scssc +0 -0
  178. data/test/dummy/tmp/cache/assets/test/sass/76cdb9703e11b00861473eddaceac644b134d566/_gradients.scssc +0 -0
  179. data/test/dummy/tmp/cache/assets/test/sass/76cdb9703e11b00861473eddaceac644b134d566/_grid-framework.scssc +0 -0
  180. data/test/dummy/tmp/cache/assets/test/sass/76cdb9703e11b00861473eddaceac644b134d566/_grid.scssc +0 -0
  181. data/test/dummy/tmp/cache/assets/test/sass/76cdb9703e11b00861473eddaceac644b134d566/_hide-text.scssc +0 -0
  182. data/test/dummy/tmp/cache/assets/test/sass/76cdb9703e11b00861473eddaceac644b134d566/_image.scssc +0 -0
  183. data/test/dummy/tmp/cache/assets/test/sass/76cdb9703e11b00861473eddaceac644b134d566/_labels.scssc +0 -0
  184. data/test/dummy/tmp/cache/assets/test/sass/76cdb9703e11b00861473eddaceac644b134d566/_list-group.scssc +0 -0
  185. data/test/dummy/tmp/cache/assets/test/sass/76cdb9703e11b00861473eddaceac644b134d566/_nav-divider.scssc +0 -0
  186. data/test/dummy/tmp/cache/assets/test/sass/76cdb9703e11b00861473eddaceac644b134d566/_nav-vertical-align.scssc +0 -0
  187. data/test/dummy/tmp/cache/assets/test/sass/76cdb9703e11b00861473eddaceac644b134d566/_opacity.scssc +0 -0
  188. data/test/dummy/tmp/cache/assets/test/sass/76cdb9703e11b00861473eddaceac644b134d566/_pagination.scssc +0 -0
  189. data/test/dummy/tmp/cache/assets/test/sass/76cdb9703e11b00861473eddaceac644b134d566/_panels.scssc +0 -0
  190. data/test/dummy/tmp/cache/assets/test/sass/76cdb9703e11b00861473eddaceac644b134d566/_progress-bar.scssc +0 -0
  191. data/test/dummy/tmp/cache/assets/test/sass/76cdb9703e11b00861473eddaceac644b134d566/_reset-filter.scssc +0 -0
  192. data/test/dummy/tmp/cache/assets/test/sass/76cdb9703e11b00861473eddaceac644b134d566/_resize.scssc +0 -0
  193. data/test/dummy/tmp/cache/assets/test/sass/76cdb9703e11b00861473eddaceac644b134d566/_responsive-visibility.scssc +0 -0
  194. data/test/dummy/tmp/cache/assets/test/sass/76cdb9703e11b00861473eddaceac644b134d566/_size.scssc +0 -0
  195. data/test/dummy/tmp/cache/assets/test/sass/76cdb9703e11b00861473eddaceac644b134d566/_tab-focus.scssc +0 -0
  196. data/test/dummy/tmp/cache/assets/test/sass/76cdb9703e11b00861473eddaceac644b134d566/_table-row.scssc +0 -0
  197. data/test/dummy/tmp/cache/assets/test/sass/76cdb9703e11b00861473eddaceac644b134d566/_text-emphasis.scssc +0 -0
  198. data/test/dummy/tmp/cache/assets/test/sass/76cdb9703e11b00861473eddaceac644b134d566/_text-overflow.scssc +0 -0
  199. data/test/dummy/tmp/cache/assets/test/sass/76cdb9703e11b00861473eddaceac644b134d566/_vendor-prefixes.scssc +0 -0
  200. data/test/dummy/tmp/cache/assets/test/sprockets/04611c51cd5b7bf26e6244fa19a5bfbd +0 -0
  201. data/test/dummy/tmp/cache/assets/test/sprockets/0b7428701b735623bbe7e6ff4342e7d6 +0 -0
  202. data/test/dummy/tmp/cache/assets/test/sprockets/1577d2d6ed493aa41d8a0f599887e3ef +0 -0
  203. data/test/dummy/tmp/cache/assets/test/sprockets/3251c44fa643b7b625c6c05cb11eeca4 +0 -0
  204. data/test/dummy/tmp/cache/assets/test/sprockets/33d68f21fb49b60aed8ccf2fc84a8588 +0 -0
  205. data/test/dummy/tmp/cache/assets/test/sprockets/37174a1556289cff8371d738701222ad +0 -0
  206. data/test/dummy/tmp/cache/assets/test/sprockets/3778e1b875202b71d8638dd8123c5f89 +0 -0
  207. data/test/dummy/tmp/cache/assets/test/sprockets/76933b790c46e6a92d7cd635de614eaf +0 -0
  208. data/test/dummy/tmp/cache/assets/test/sprockets/816bfd11725a6e3a206bfed45256be5a +0 -0
  209. data/test/dummy/tmp/cache/assets/test/sprockets/86a50a0819617ecca8256b7ae7cc96af +0 -0
  210. data/test/dummy/tmp/cache/assets/test/sprockets/a4dee2e02e8ce21babef0bbc5c84923e +0 -0
  211. data/test/dummy/tmp/cache/assets/test/sprockets/be482a8ab680e404d9e36ad99f5d9ca2 +0 -0
  212. data/test/dummy/tmp/cache/assets/test/sprockets/c1a8fdbd07c6b685d2ac56f87b47138d +0 -0
  213. data/test/dummy/tmp/cache/assets/test/sprockets/f4e4f7b077370875d66bd890b0ba36d3 +0 -0
  214. data/test/dummy/tmp/cache/assets/test/sprockets/f794aa494de85bff62b026a35b9194f9 +0 -0
  215. data/test/dummy/tmp/pids/server.pid +1 -1
  216. data/test/lib/generators/lina/lina/api_generator_test.rb +16 -0
  217. data/test/lib/generators/lina/lina/view_generator_test.rb +16 -0
  218. metadata +351 -10
  219. data/lib/generators/lina/api_generator.rb +0 -59
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e6f1263ff2802b1578fcae3f1f232e132adaef18
4
- data.tar.gz: 08ef794c256ecc46fc922485c706b88bb3f0b5cd
3
+ metadata.gz: 42f21ae8ee02bcd29bc7d4b5fcf92f00473db66f
4
+ data.tar.gz: 524f10fe12b14452afcdaa4e3ee75e94ebe77c56
5
5
  SHA512:
6
- metadata.gz: 276dace144d2887e604e311abfc8665b318b4c9861987d5277995c52a726e307361d62b24fd2ee27edfb7688d68319cab09309e4be4d6c4df768911a1ff128d0
7
- data.tar.gz: 922061bff3767fe1c33c326a9e5ace5040871e9a429405b8e99e68a623c062212e2791832b0fe6d205be8855c0fb650d5b06571b3e8a17b8d12a070d51f49a37
6
+ metadata.gz: cec4c791a427e084e15a3a95e6863acbadd652cb5842c73fc47ea782e2899c089eff24e057ed0ccdccaa31a731f6d79f3db576879be80095c7aca084f0163afa
7
+ data.tar.gz: 877440440b7116f07894120ba7c2ab5c90cd2a5a6338bc0ab430055fecdf7f488d3eae4865bf51c65d5c6b7c698552e6fb613c26d22f5f63745ba2228426d4d2
data/README.md CHANGED
@@ -1,10 +1,20 @@
1
1
  ![lina logo](lina-logo.png)
2
2
 
3
+ [![Gem Version](https://badge.fury.io/rb/lina.svg)](http://badge.fury.io/rb/lina)
4
+ [![license](http://img.shields.io/badge/license-MIT-red.svg?style=flat)](MIT-LICENSE)
3
5
  [![Build Status](https://travis-ci.org/windy/lina.png?branch=master)](https://travis-ci.org/windy/lina)
6
+ [![Dependency Status](https://gemnasium.com/windy/lina.svg)](https://gemnasium.com/windy/lina)
4
7
 
5
8
  Rails 开发者零成本上手的 Restful API 框架.
6
9
 
7
- Lina 是基于 `Ruby on Rails`, [JSON Schema](http://json-schema.org), `jbuilder` 的 API 开发框架, 具备自动生成 API 文档, 自动校验入口, 自校验返回值参数等功能.
10
+ Lina 是基于 `Ruby on Rails`, [JSON Schema](http://json-schema.org), `jbuilder` 的 API 开发框架, 整合 Ruby on Rails 开发 API 的最佳实践, 并添加 API 文档, 校验等必备功能.
11
+
12
+ 它的特点:
13
+
14
+ * Rails 开发者零成本上手
15
+ * 自动生成 API 文档
16
+ * 自动校验入口参数
17
+ * 自动校验返回值参数
8
18
 
9
19
  与 `Ruby on Rails` 几乎体验一致, 与 `grape` 相比, 更加易于上手.
10
20
 
@@ -25,17 +35,19 @@ $ rails g lina:install
25
35
  $ rails g lina:api posts index
26
36
  ```
27
37
 
28
- 启动 Rails 后, 访问 http://localhost:3000/apidoc 得到你的 API 文档.
38
+ 启动 Rails 后, 访问 `http://localhost:3000/apidoc` 得到你的 API 文档.
29
39
 
30
- ps: 目前仅支持 `Rails 4.1+`, `Rails4.2`, 如果你有更低版本的支持需求, 请告诉我.
40
+ ps: 目前仅支持 `Rails 4.1`, `Rails4.2`, 如果你有更低版本的支持需求, 请告诉我.
31
41
 
32
- Rails 新手 Lina 使用说明: [Rails 新手?](https://github.com/windy/lina/wiki)
42
+ Rails 新手 Lina 使用说明: [Rails 新手?( TODO )](https://github.com/windy/lina/wiki)
43
+
44
+ 目前 Lina 最新版 0.0.2 已经基本完善.
33
45
 
34
46
  ## 使用方法
35
47
 
36
- ### APIDOC
48
+ ### 自动 APIDOC
37
49
 
38
- `Lina` 会自动生成项目的 APIDOC, 供前端或客户端 APP 使用.
50
+ `Lina` 会遍历所有 API 控制器, 自动生成项目的 APIDOC, 供前端或客户端 APP 使用.
39
51
 
40
52
  APIDOC 中包括:
41
53
 
@@ -67,9 +79,9 @@ api_for '/apidoc'
67
79
 
68
80
  * `&block`: 控制器实际代码
69
81
 
70
- `Lina` 还提供了生成器 `rails g lina:api posts index show` 来快速生成代码.
82
+ 你可以使用 Lina API 生成器 `rails g lina:api posts index show` 来快速生成代码.
71
83
 
72
- `Lina` 控制器完全兼容 `Rails` 的控制器, `filter`, `render`, `params` 都与 `Rails` 完全一致.
84
+ `Lina` 控制器逻辑代码完全兼容 `Rails` 的控制器, `filter`, `render`, `params` 都与 `Rails` 完全一致.
73
85
 
74
86
  ```ruby
75
87
  class UsersController < Lina::ApplicationController
@@ -169,7 +181,7 @@ bio: 非必填, string 类型.
169
181
 
170
182
  `return` 的写法与 `params` 一致.
171
183
 
172
- 更全面的例子参考 [json-schema 官方例子](http://json-schema.org/examples.html)
184
+ `json-schema` 非常强大与简洁, 可以很容易地写出既优雅又安全的代码, 更全面的例子参考 [json-schema 官方例子](http://json-schema.org/examples.html)
173
185
 
174
186
  ### JSON 生成
175
187
 
@@ -184,7 +196,7 @@ json.array! @posts do |post|
184
196
  end
185
197
  ```
186
198
 
187
- `Lina` 整合了 `jbuilder`, 请到这里查看更多写法: [jbuilder readme](https://github.com/rails/jbuilder)
199
+ `Lina` 整合了 `jbuilder`, 请到这里查看更多写法: [Jbuilder README](https://github.com/rails/jbuilder)
188
200
 
189
201
  ### 路由与版本
190
202
 
@@ -193,7 +205,7 @@ end
193
205
  ```ruby
194
206
  Rails.application.routes.draw do
195
207
  resources :posts, only: [:index, :show]
196
-
208
+
197
209
  resources :labels, only: [:index] do
198
210
  member do
199
211
  post :approve
@@ -202,7 +214,7 @@ Rails.application.routes.draw do
202
214
  end
203
215
  ```
204
216
 
205
- 对外的 API 一定要用版本隔开, 如下:
217
+ 对外的 API 一定要用版本号隔开, 如下:
206
218
 
207
219
  ```ruby
208
220
  scope 'api/v1' do
@@ -222,13 +234,17 @@ end
222
234
 
223
235
  ### 权限与认证
224
236
 
225
- `Lina` 为了保持简洁, 并不提供这部分的支持.
237
+ `Lina` 为了保持简洁, 并不提供这部分的支持, 但整合非常容易.
226
238
 
227
239
  * 权限管理, 推荐使用 [`cancancan`](https://github.com/CanCanCommunity/cancancan)
228
240
  * 认证, 推荐 `JWT`, 看看这里: [`ruby-jwt`](https://github.com/progrium/ruby-jwt)
229
241
 
230
242
  你可以像 `Rails` 一样使用 `Lina`.
231
243
 
244
+ ### CORS 跨域
245
+
246
+ 推荐使用 [`rake-cors`](https://github.com/cyu/rack-cors) 整合.
247
+
232
248
  ### 测试
233
249
 
234
250
  `Lina` 控制器的测试与 `Rails` 完全一致(事实上, lina:api 生成器会自动生成对应的测试代码 ), 在 Test::Unit 中, 一个例子如下
@@ -250,12 +266,15 @@ class DesksControllerTest < ActionController::TestCase
250
266
  end
251
267
  ```
252
268
 
253
- ## 开发指南
269
+ ## 贡献指南
270
+
271
+ Lina 做了以下几件事情:
254
272
 
255
273
  1. `define_action` 实际上会将 API 信息存入类实例变量中, APIDOC 通过 `Lina::ApplicationController` 的子类遍历, 依据这些信息显示的.
256
274
  2. 覆写 `send_action`, 提供入口检测与返回参数检测.
257
275
  3. 提供生成器 `lina:install`, `lina:api`.
258
276
  4. 添加 `api_for` 路由项.
277
+ 5. 一个强大的 APIDOC
259
278
 
260
279
  `lina` 使用了 [appraisals](https://github.com/thoughtbot/appraisal) 测试不同版本 Rails 的支持情况.
261
280
 
@@ -140,7 +140,7 @@
140
140
  return b.uid = "" + Math.random();
141
141
  }
142
142
  });
143
- console.log('UIDs are set.');
143
+ //console.log('UIDs are set.');
144
144
  for_each_branch(function(b) {
145
145
  var child, _i, _len, _ref, _results;
146
146
  if (angular.isArray(b.children)) {
@@ -241,7 +241,7 @@
241
241
  });
242
242
  }
243
243
  n = scope.treeData.length;
244
- console.log('num root branches = ' + n);
244
+ //console.log('num root branches = ' + n);
245
245
  for_each_branch(function(b, level) {
246
246
  b.level = level;
247
247
  return b.expanded = b.level < expand_level;
@@ -12,19 +12,4 @@ app.controller('ApidocController', [ '$scope', '$http', function($scope, $http){
12
12
  });
13
13
  }
14
14
 
15
- $scope.isRequired = function(params, name){
16
- return params.required.indexOf(name) != -1;
17
- }
18
-
19
- $scope.moreInfo = function(properties) {
20
- properties = _.clone(properties);
21
- ['type', 'description'].forEach(function(e){
22
- delete properties[e];
23
- })
24
- var info = '';
25
- _.keys(properties).forEach( function(k) {
26
- info = info + k + ": " + properties[k] + "\n";
27
- })
28
- return info;
29
- }
30
15
  }])
@@ -0,0 +1,119 @@
1
+ app.factory('RecursionHelper', ['$compile', function($compile){
2
+ return {
3
+ /**
4
+ * Manually compiles the element, fixing the recursion loop.
5
+ * @param element
6
+ * @param [link] A post-link function, or an object with function(s) registered via pre and post properties.
7
+ * @returns An object containing the linking functions.
8
+ */
9
+ compile: function(element, link){
10
+ // Normalize the link parameter
11
+ if(angular.isFunction(link)){
12
+ link = { post: link };
13
+ }
14
+
15
+ // Break the recursion loop by removing the contents
16
+ var contents = element.contents().remove();
17
+ var compiledContents;
18
+ return {
19
+ pre: (link && link.pre) ? link.pre : null,
20
+ /**
21
+ * Compiles and re-adds the contents
22
+ */
23
+ post: function(scope, element){
24
+ // Compile the contents
25
+ if(!compiledContents){
26
+ compiledContents = $compile(contents);
27
+ }
28
+ // Re-add the compiled contents to the element
29
+ compiledContents(scope, function(clone){
30
+ element.append(clone);
31
+ });
32
+
33
+ // Call the post-linking function, if any
34
+ if(link && link.post){
35
+ link.post.apply(null, arguments);
36
+ }
37
+ }
38
+ };
39
+ }
40
+ };
41
+ }]);
42
+
43
+ app.directive('jsonSchema', [ 'RecursionHelper', function(RecursionHelper){
44
+ return {
45
+ restrict: 'E',
46
+ scope: {
47
+ schema: '='
48
+ },
49
+ controller: ['$scope', function($scope){
50
+ $scope.isRequired = function(params, name){
51
+ return _.contains(params.required, name);
52
+ }
53
+
54
+ $scope.moreInfo = function(properties) {
55
+ properties = _.clone(properties);
56
+ ['type', 'description'].forEach(function(e){
57
+ delete properties[e];
58
+ })
59
+ var info = '';
60
+ _.keys(properties).forEach( function(k) {
61
+ info = info + k + ": " + properties[k] + "\n";
62
+ })
63
+ return info || '-';
64
+ }
65
+
66
+ $scope.isOneOf = function(){
67
+ return !! $scope.schema.oneOf;
68
+ }
69
+
70
+ $scope.isObject = function(){
71
+ return !! $scope.schema.properties;
72
+ }
73
+
74
+ $scope.isString = function(){
75
+ return $scope.schema.type == 'string';
76
+ }
77
+
78
+ $scope.isArray = function(){
79
+ return $scope.schema.type == 'array';
80
+ }
81
+
82
+ $scope.isNull = function(){
83
+ return $scope.schema.type == 'null';
84
+ }
85
+
86
+ $scope.isBoolean = function(){
87
+ return $scope.schema.type == 'boolean';
88
+ }
89
+
90
+ $scope.isEmpty = function(){
91
+ return _.isEmpty($scope.schema);
92
+ }
93
+
94
+ $scope.hasMoreInfo = function(value){
95
+ return value.type !== 'array'
96
+ }
97
+
98
+ // translate { '$ref': '#/definitions/xx' } to real hash
99
+ $scope.refInfo = function(ref_hash){
100
+ var ref = ref_hash['$ref'];
101
+ var refs = ref.split('/');
102
+ var res;
103
+ _.each(refs, function(ref){
104
+ if( ref === '#' ){
105
+ res = $scope.schema;
106
+ }else{
107
+ res = res[ref];
108
+ }
109
+ });
110
+ return res;
111
+ }
112
+ }],
113
+ compile: function(element){
114
+ return RecursionHelper.compile(element);
115
+ },
116
+ templateUrl: '<%= asset_path("templates/lina/schema.html") %>'
117
+ };
118
+
119
+ }])
@@ -0,0 +1,83 @@
1
+ <div ng-if="isEmpty()">
2
+ <p class='blank'>
3
+ No Data
4
+ </p>
5
+ </div>
6
+ <div ng-if="isOneOf()">
7
+ <p>
8
+ <div class="left">Type</div>
9
+ <div class="right">One type of these below</div>
10
+ </p>
11
+ <div ng-repeat='s in schema.oneOf'>
12
+ <div class="sub-json-schema">
13
+ <json-schema schema='refInfo(s)'></json-schema>
14
+ </div>
15
+ </div>
16
+ </div>
17
+ <div ng-if="isString()">
18
+ <p>
19
+ <div class="left">Type</div>
20
+ <div class="right">String</div>
21
+ </p>
22
+ <p>
23
+ <div class="left">More Info</div>
24
+ <div class="right more-info ng-cloak">{{ moreInfo(schema) }}</div>
25
+ </p>
26
+ </div>
27
+ <div ng-if="isBoolean()">
28
+ <p>
29
+ <div class="left">Type</div>
30
+ <div class="right">Boolean</div>
31
+ </p>
32
+ <p>
33
+ <div class="left">More Info</div>
34
+ <div class="right more-info ng-cloak">{{ moreInfo(schema) }}</div>
35
+ </p>
36
+ </div>
37
+ <div ng-if="isNull()">
38
+ <p>
39
+ <div class="left">Type</div>
40
+ <div class="right">Null</div>
41
+ </p>
42
+ </div>
43
+ <div ng-if="isArray()">
44
+ <p>
45
+ <div class="left">Type</div>
46
+ <div class="right">Array</div>
47
+ </p>
48
+ <p>Items:</p>
49
+ <div class="sub-json-schema">
50
+ <json-schema schema='schema.items'></json-schema>
51
+ </div>
52
+ </div>
53
+ <div class='table-responsive' ng-if='isObject()'>
54
+ <table class='table ng-cloak'>
55
+ <thead>
56
+ <tr>
57
+ <th width='20%'>Name</th>
58
+ <th width='20%'>Type</th>
59
+ <th width='25%'>More Info</th>
60
+ <th>Description</th>
61
+ </tr>
62
+ </thead>
63
+ <tbody>
64
+ <tr ng-repeat='(key, value) in schema.properties'>
65
+ <td><span>{{ key }}
66
+ <span class="label label-primary" ng-show='isRequired(schema, key)'>must</span>
67
+ <span class="label label-default" ng-hide='isRequired(schema, key)'>optional</span>
68
+ </td>
69
+ <td>{{ value.type }}</td>
70
+ <td class='more-info' ng-if='hasMoreInfo(value)'>{{ moreInfo(value) }}</td>
71
+ <td class='more-info-array' ng-if='! hasMoreInfo(value)'>
72
+ <div>
73
+ Array Items:
74
+ </div>
75
+ <div class="sub-json-schema">
76
+ <json-schema schema='value.items'></json-schema>
77
+ </div>
78
+ </td>
79
+ <td class='description'>{{ value.description }}</td>
80
+ </tr>
81
+ </tbody>
82
+ </table>
83
+ </div>
@@ -2,6 +2,7 @@
2
2
  height: 100%;
3
3
  margin-right: 0;
4
4
  margin-left: 0;
5
+ font-weight: 300;
5
6
 
6
7
  .apidoc-title {
7
8
  border-bottom: 1px solid #eee;
@@ -12,13 +13,24 @@
12
13
  color: #999;
13
14
  }
14
15
 
16
+ .api-content-wrapper {
17
+ border-bottom: 4px solid #aaa;
18
+ margin-bottom: 30px;
19
+ padding-bottom: 10px;
20
+ &:last-child {
21
+ border: none;
22
+ }
23
+ }
24
+
15
25
  .more-info {
16
26
  white-space: pre;
17
27
  }
18
28
 
19
29
  .api-left-tree {
30
+ float: left;
31
+ width: 300px;
20
32
  height: 100%;
21
- overflow-y: auto;
33
+ overflow: auto;
22
34
  background: #FAFAFA;
23
35
  border-right: 1px solid #eee;
24
36
  padding: 0;
@@ -26,11 +38,13 @@
26
38
  .nav-pills > li > a {
27
39
  border-radius: 0;
28
40
  padding: 6px;
41
+ white-space: nowrap;
29
42
  }
30
43
  }
31
44
 
32
45
  .api-contents {
33
- padding-top: 10px;
46
+ margin-left: 300px;
47
+ padding: 10px;
34
48
  height: 100%;
35
49
  overflow-y: auto;
36
50
  font-size: 20px;
@@ -51,17 +65,18 @@
51
65
  .description {
52
66
  white-space: pre;
53
67
  color: #999;
54
- font-size: 75%;
68
+ font-size: 85%;
55
69
  }
56
70
 
57
71
  .parameters-title, .return-title {
58
72
  margin-top: 28px;
59
73
  font-size: 28px;
74
+ font-weight: 400;
60
75
  }
61
76
 
62
77
  .table-wrapper {
63
78
  background: #E8F4FF;
64
- padding: 10px 20px 20px;
79
+ padding: 10px;
65
80
  margin-bottom: 30px;
66
81
  }
67
82
 
@@ -73,9 +88,37 @@
73
88
 
74
89
  .table > thead > tr > th {
75
90
  border: none;
91
+ font-weight: 400;
76
92
  }
77
93
 
78
94
  .table > tbody > tr > td {
79
95
  border: none;
80
96
  }
97
+
98
+ .table > tbody > tr > td.description {
99
+ font-size: 90%;
100
+ }
101
+
102
+ .left {
103
+ display: inline-block;
104
+ width: 200px;
105
+ }
106
+
107
+ .right {
108
+ display: inline-block;
109
+ }
110
+
111
+ .sub-json-schema {
112
+ font-size: 85%;
113
+ margin-top: 20px;
114
+ margin-left: 20px;
115
+ margin-bottom: 20px;
116
+ border: 1px solid #cdd;
117
+ padding: 10px;
118
+ }
119
+
120
+ .blank {
121
+ color: #aaa;
122
+ margin-bottom: 0;
123
+ }
81
124
  }
@@ -1,66 +1,27 @@
1
- <div class="row apidoc-page" ng-controller='ApidocController' ng-init="setData('<%= lina.data_path %>')">
1
+ <div class="apidoc-page" ng-controller='ApidocController' ng-init="setData('<%= lina.data_path %>')">
2
2
 
3
- <div class="col-md-3 api-left-tree">
3
+ <div class="api-left-tree">
4
4
  <h4 class='apidoc-title'>APIDOC</h4>
5
5
  <abn-tree tree-data="my_data" tree-control="my_tree" on-select='showApi(branch)'></abn-tree>
6
6
  </div>
7
- <div class="col-md-9 api-contents">
7
+ <div class="api-contents ng-cloak">
8
8
  <ul class='list-unstyled'>
9
- <li ng-repeat='api in currentApi'>
10
- <div class='path'>
11
- <span class='path-verb'> {{ api.verb }} </span>
12
- <span class='path-path'> {{ api.path }} </span>
13
- </div>
9
+ <li class='api-content-wrapper' ng-repeat='api in currentApi'>
10
+ <div class='path'>
11
+ <span class='path-verb'> {{ api.verb }} </span>
12
+ <span class='path-path'> {{ api.path }} </span>
13
+ </div>
14
14
  <div class="name">{{ api.schema.name }}</div>
15
15
  <p class='description'>{{ api.schema.description }}</p>
16
16
  <h4 class='parameters-title'>Parameter</h4>
17
17
  <div class="table-wrapper">
18
- <table class='table'>
19
- <thead>
20
- <tr>
21
- <th width='20%'>Name</th>
22
- <th width='20%'>Type</th>
23
- <th width='25%'>More Info</th>
24
- <th>Description</th>
25
- </tr>
26
- </thead>
27
- <tbody>
28
- <tr ng-repeat='(key, value) in api.schema.params.properties'>
29
- <td><span>{{ key }}
30
- <span class="label label-primary" ng-show='isRequired(api.schema.params, key)'>must</span>
31
- <span class="label label-default" ng-hide='isRequired(api.schema.params, key)'>optional</span>
32
- </td>
33
- <td>{{ value.type }}</td>
34
- <td class='more-info'>{{ moreInfo(value) }}</td>
35
- <td>{{ value.description }}</td>
36
- </tr>
37
- </tbody>
38
- </table>
18
+ <json-schema schema='api.schema.params'></json-schema>
39
19
  </div><!-- .table-wrapper -->
40
20
 
41
21
  <h4 class='return-title'>Return</h4>
22
+ <p class='description'>{{ api.schema.return.description }}</p>
42
23
  <div class="table-wrapper">
43
- <table class='table'>
44
- <thead>
45
- <tr>
46
- <th width='20%'>Name</th>
47
- <th width='20%'>Type</th>
48
- <th width='25%'>More Info</th>
49
- <th>Description</th>
50
- </tr>
51
- </thead>
52
- <tbody>
53
- <tr ng-repeat='(key, value) in api.schema.return.properties'>
54
- <td><span>{{ key }}
55
- <span class="label label-primary" ng-show='isRequired(api.schema.return, key)'>must</span>
56
- <span class="label label-default" ng-hide='isRequired(api.schema.return, key)'>optional</span>
57
- </td>
58
- <td>{{ value.type }}</td>
59
- <td class='more-info'>{{ moreInfo(value) }}</td>
60
- <td>{{ value.description }}</td>
61
- </tr>
62
- </tbody>
63
- </table>
24
+ <json-schema schema='api.schema.return'></json-schema>
64
25
  </div><!-- .table-wrapper -->
65
26
  </li>
66
27
  </ul>
@@ -0,0 +1,16 @@
1
+ Description:
2
+ Creates API controller and action(s) to your application.
3
+
4
+ Example:
5
+ rails generate lina:api Posts index show
6
+
7
+ This will create:
8
+ create app/controllers/posts_controller.rb
9
+ route get 'posts/show'
10
+ route get 'posts/index'
11
+ invoke test_unit
12
+ create test/controllers/posts_controller_test.rb
13
+ invoke jbuilder
14
+ create app/views/posts
15
+ create app/views/posts/index.json.jbuilder
16
+ create app/views/posts/show.json.jbuilder
@@ -0,0 +1,60 @@
1
+ module Lina
2
+ module Generators
3
+ class ApiGenerator < Rails::Generators::NamedBase # :nodoc:
4
+ source_root File.expand_path("../templates", __FILE__)
5
+
6
+ argument :actions, type: :array, default: [], banner: "action1 action2"
7
+ check_class_collision suffix: "Controller"
8
+
9
+ def create_controller_files
10
+ template 'controller.rb', File.join('app/controllers', class_path, "#{file_name}_controller.rb")
11
+ end
12
+
13
+ def add_routes
14
+ actions.reverse.each do |action|
15
+ route generate_routing_code(action)
16
+ end
17
+ end
18
+
19
+ hook_for :test_framework, as: :controller
20
+
21
+ if Lina.generate_views
22
+ hook_for :view, default: true
23
+ end
24
+
25
+ private
26
+
27
+ # This method creates nested route entry for namespaced resources.
28
+ # For eg. rails g controller foo/bar/baz index
29
+ # Will generate -
30
+ # namespace :foo do
31
+ # namespace :bar do
32
+ # get 'baz/index'
33
+ # end
34
+ # end
35
+ def generate_routing_code(action)
36
+ depth = regular_class_path.length
37
+ # Create 'namespace' ladder
38
+ # namespace :foo do
39
+ # namespace :bar do
40
+ namespace_ladder = regular_class_path.each_with_index.map do |ns, i|
41
+ indent("namespace :#{ns} do\n", i * 2)
42
+ end.join
43
+
44
+ # Create route
45
+ # get 'baz/index'
46
+ route = indent(%{get '#{file_name}/#{action}'\n}, depth * 2)
47
+
48
+ # Create `end` ladder
49
+ # end
50
+ # end
51
+ end_ladder = (1..depth).reverse_each.map do |i|
52
+ indent("end\n", i * 2)
53
+ end.join
54
+
55
+ # Combine the 3 parts to generate complete route entry
56
+ namespace_ladder + route + end_ladder
57
+ end
58
+ end
59
+ end
60
+ end
@@ -5,12 +5,12 @@ require_dependency "<%= namespaced_path %>/application_controller"
5
5
  <% module_namespacing do -%>
6
6
  class <%= class_name %>Controller < Lina::ApplicationController
7
7
  <% actions.each do |action| -%>
8
+ # def <%= action %>
8
9
  define_action :<%= action %>, {
9
10
  name: '<%= action %>',
10
11
  description: '',
11
12
  params: {
12
13
  type: 'object',
13
- required: [],
14
14
  properties: {
15
15
  }
16
16
  },
@@ -1,8 +1,10 @@
1
1
  module Lina
2
2
  module Generators
3
3
  class InstallGenerator < Rails::Generators::Base
4
- source_root File.expand_path("../../templates", __FILE__)
4
+ source_root File.expand_path("../templates", __FILE__)
5
+
5
6
  desc "Create a lina initializer"
7
+
6
8
  def copy_initializer
7
9
  template "lina.rb", "config/initializers/lina.rb"
8
10
  end
@@ -0,0 +1,2 @@
1
+ json.name '<%= class_name %>#<%= @action %>'
2
+ json.path 'Find me in <%= @path %>'