lina 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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 %>'