templet_rails 0.1.0 → 0.2.0

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 (276) hide show
  1. checksums.yaml +5 -5
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +334 -269
  4. data/Rakefile +21 -7
  5. data/app/assets/config/templet_rails_manifest.js +2 -0
  6. data/app/assets/javascripts/templet_rails/application.js +15 -0
  7. data/app/assets/stylesheets/templet_rails/application.css +15 -0
  8. data/app/controllers/templet/json_rendering_helpers.rb +12 -0
  9. data/app/controllers/templet/rendering_helpers.rb +53 -0
  10. data/app/controllers/templet/viewer_call_string.rb +144 -0
  11. data/app/controllers/templet/viewer_call_string_class.rb +65 -0
  12. data/app/controllers/templet/viewer_responders.rb +121 -0
  13. data/app/controllers/templet_rails/application_controller.rb +5 -0
  14. data/app/helpers/templet/constants.rb +54 -0
  15. data/app/helpers/templet/forms/bs_form.rb +73 -0
  16. data/app/helpers/templet/forms/bs_form_errors.rb +38 -0
  17. data/app/helpers/templet/forms/bs_form_field.rb +114 -0
  18. data/app/helpers/templet/forms/bs_form_group.rb +115 -0
  19. data/app/helpers/templet/layouts/html_rails.rb +36 -0
  20. data/app/helpers/templet/links.rb +28 -0
  21. data/app/helpers/templet/links/bs_btn_class.rb +61 -0
  22. data/app/helpers/templet/links/bs_link_set_base.rb +168 -0
  23. data/app/helpers/templet/links/bs_link_set_collection.rb +21 -0
  24. data/app/helpers/templet/links/bs_link_set_navigation.rb +62 -0
  25. data/app/helpers/templet/links/rest_link_procs.rb +163 -0
  26. data/app/helpers/templet/links/rest_link_procs_parent.rb +39 -0
  27. data/app/helpers/templet/links/rest_link_procs_sets.rb +30 -0
  28. data/app/helpers/templet/links/rest_link_text.rb +102 -0
  29. data/app/helpers/templet/links/rest_path.rb +90 -0
  30. data/app/helpers/templet/mixins.rb +9 -0
  31. data/app/helpers/templet/mixins/bs.rb +11 -0
  32. data/app/helpers/templet/mixins/bs/grid.rb +53 -0
  33. data/app/helpers/templet/mixins/bs/lists.rb +77 -0
  34. data/app/helpers/templet/mixins/field_procs.rb +140 -0
  35. data/app/helpers/templet/mixins/html_presenters.rb +82 -0
  36. data/app/helpers/templet/require_all.rb +45 -0
  37. data/app/helpers/templet/utils/html_search_form.rb +53 -0
  38. data/app/helpers/templet/utils/link_set_factory.rb +46 -0
  39. data/app/helpers/templet/utils/link_set_factory_wrapper.rb +53 -0
  40. data/app/helpers/templet/utils/list_model_parents.rb +27 -0
  41. data/app/helpers/templet/utils/navbar_form.rb +26 -0
  42. data/app/helpers/templet/utils/selected_wrapper.rb +40 -0
  43. data/app/helpers/templet/viewer.rb +11 -0
  44. data/app/helpers/templet/viewer/meta_model.rb +66 -0
  45. data/app/helpers/templet/viewer/meta_model_defaults.rb +56 -0
  46. data/app/helpers/templet/viewer/presenters.rb +44 -0
  47. data/app/helpers/templet/viewer/rest_actions.rb +24 -0
  48. data/app/helpers/templet/viewer_base.rb +111 -0
  49. data/app/helpers/templet/viewer_rest.rb +144 -0
  50. data/app/helpers/templet_helper.rb +10 -0
  51. data/app/helpers/templet_rails/application_helper.rb +4 -0
  52. data/app/jobs/templet_rails/application_job.rb +4 -0
  53. data/app/mailers/templet_rails/application_mailer.rb +6 -0
  54. data/app/models/templet_rails/application_record.rb +5 -0
  55. data/app/views/layouts/templet_rails/application.html.erb +16 -0
  56. data/config/routes.rb +2 -0
  57. data/lib/generators/templet/controller/controller_generator.rb +70 -68
  58. data/lib/generators/templet/core_install/USAGE +14 -0
  59. data/lib/generators/templet/core_install/core_install_generator.rb +77 -0
  60. data/lib/generators/templet/core_rspec/USAGE +5 -8
  61. data/lib/generators/templet/core_rspec/core_rspec_generator.rb +32 -47
  62. data/lib/generators/templet/destroy/USAGE +1 -1
  63. data/lib/generators/templet/destroy/destroy_generator.rb +87 -84
  64. data/lib/generators/templet/install/USAGE +16 -0
  65. data/lib/generators/templet/install/install_generator.rb +103 -0
  66. data/lib/generators/templet/routes/routes_generator.rb +43 -41
  67. data/lib/generators/templet/rspec/rspec_generator.rb +1 -0
  68. data/lib/generators/templet/scaffold/scaffold_generator.rb +66 -64
  69. data/lib/generators/templet/shared/core_helpers.rb +10 -0
  70. data/lib/generators/templet/shared/model_fields.rb +2 -2
  71. data/lib/generators/templet/templates/core/app/base_viewer.rb +1 -1
  72. data/lib/generators/templet/templates/core/app/{panel → layouts}/layout_base.rb +3 -3
  73. data/lib/generators/templet/templates/core/app/{panel → layouts}/layout_header.rb +3 -1
  74. data/lib/generators/templet/templates/core/app/{panel → layouts}/layout_header_sidebar.rb +2 -1
  75. data/lib/generators/templet/templates/core/app/{panel/nav.rb → layouts/navbar.rb} +2 -2
  76. data/lib/generators/templet/templates/core/app/layouts/navbar_args_option.rb +32 -0
  77. data/lib/generators/templet/templates/core/app/{link_sets/navbar.rb → layouts/navbar_links.rb} +2 -2
  78. data/lib/generators/templet/templates/core/app/{panel → layouts}/options_config.rb +3 -3
  79. data/lib/generators/templet/templates/core/app/layouts/panel/flash_messages.rb +35 -0
  80. data/lib/generators/templet/templates/core/app/layouts/panel/show_parents_option.rb +24 -0
  81. data/lib/generators/templet/templates/core/app/layouts/panel/sidebar_links_option.rb +26 -0
  82. data/lib/generators/templet/templates/core/spec/layouts/flash_messages_spec.rb +18 -0
  83. data/lib/generators/templet/templates/core/spec/layouts/navbar_spec.rb +19 -0
  84. data/lib/generators/templet/templates/core/spec/support/apis/api_helper.rb +2 -0
  85. data/lib/generators/templet/templates/core/spec/support/apis/shared_examples_a_json_controller.rb +1 -1
  86. data/lib/generators/templet/templates/core/spec/support/{viewer → shared}/partial_test_helpers.rb +0 -0
  87. data/lib/generators/templet/templates/core/templet/viewer_base.rb +3 -3
  88. data/lib/generators/templet/viewer/viewer_generator.rb +60 -58
  89. data/lib/tasks/templet_rails_tasks.rake +4 -0
  90. data/lib/templet_rails.rb +1 -1
  91. data/lib/templet_rails/engine.rb +5 -0
  92. data/lib/templet_rails/version.rb +1 -1
  93. data/spec/dummy/Rakefile +6 -0
  94. data/spec/dummy/app/assets/config/manifest.js +4 -0
  95. data/spec/dummy/app/assets/javascripts/application.js +15 -0
  96. data/spec/dummy/app/assets/javascripts/cable.js +13 -0
  97. data/spec/dummy/app/assets/stylesheets/application.css +15 -0
  98. data/spec/dummy/app/channels/application_cable/channel.rb +4 -0
  99. data/spec/dummy/app/channels/application_cable/connection.rb +4 -0
  100. data/spec/dummy/app/controllers/answers_controller.rb +86 -0
  101. data/spec/dummy/app/controllers/application_controller.rb +2 -0
  102. data/spec/dummy/app/controllers/categories_controller.rb +80 -0
  103. data/spec/dummy/app/controllers/questions_controller.rb +86 -0
  104. data/spec/dummy/app/helpers/app.rb +4 -0
  105. data/spec/dummy/app/helpers/app/answer_viewer.rb +21 -0
  106. data/spec/dummy/app/helpers/app/base_viewer.rb +7 -0
  107. data/spec/dummy/app/helpers/app/category_viewer.rb +26 -0
  108. data/spec/dummy/app/helpers/app/layouts/layout_base.rb +40 -0
  109. data/spec/dummy/app/helpers/app/layouts/layout_header.rb +24 -0
  110. data/spec/dummy/app/helpers/app/layouts/layout_header_sidebar.rb +19 -0
  111. data/spec/dummy/app/helpers/app/layouts/navbar.rb +55 -0
  112. data/spec/dummy/app/helpers/app/layouts/navbar_args_option.rb +32 -0
  113. data/spec/dummy/app/helpers/app/layouts/navbar_links.rb +12 -0
  114. data/spec/dummy/app/helpers/app/layouts/options_config.rb +19 -0
  115. data/spec/dummy/app/helpers/app/layouts/panel/flash_messages.rb +35 -0
  116. data/spec/dummy/app/helpers/app/layouts/panel/show_parents_option.rb +24 -0
  117. data/spec/dummy/app/helpers/app/layouts/panel/sidebar_links_option.rb +26 -0
  118. data/spec/dummy/app/helpers/app/question_viewer.rb +26 -0
  119. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  120. data/spec/dummy/app/jobs/application_job.rb +2 -0
  121. data/spec/dummy/app/mailers/application_mailer.rb +4 -0
  122. data/spec/dummy/app/models/answer.rb +12 -0
  123. data/spec/dummy/app/models/application_record.rb +3 -0
  124. data/spec/dummy/app/models/category.rb +11 -0
  125. data/spec/dummy/app/models/question.rb +15 -0
  126. data/spec/dummy/app/views/layouts/application.html.erb +15 -0
  127. data/spec/dummy/app/views/layouts/mailer.html.erb +13 -0
  128. data/spec/dummy/app/views/layouts/mailer.text.erb +1 -0
  129. data/spec/dummy/bin/bundle +3 -0
  130. data/spec/dummy/bin/rails +4 -0
  131. data/spec/dummy/bin/rake +4 -0
  132. data/spec/dummy/bin/setup +36 -0
  133. data/spec/dummy/bin/update +31 -0
  134. data/spec/dummy/bin/yarn +11 -0
  135. data/spec/dummy/config.ru +5 -0
  136. data/spec/dummy/config/application.rb +30 -0
  137. data/spec/dummy/config/boot.rb +5 -0
  138. data/spec/dummy/config/cable.yml +10 -0
  139. data/spec/dummy/config/database.yml +25 -0
  140. data/spec/dummy/config/environment.rb +5 -0
  141. data/spec/dummy/config/environments/development.rb +61 -0
  142. data/spec/dummy/config/environments/production.rb +94 -0
  143. data/spec/dummy/config/environments/test.rb +46 -0
  144. data/spec/dummy/config/initializers/application_controller_renderer.rb +8 -0
  145. data/spec/dummy/config/initializers/assets.rb +14 -0
  146. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  147. data/spec/dummy/config/initializers/content_security_policy.rb +25 -0
  148. data/spec/dummy/config/initializers/cookies_serializer.rb +5 -0
  149. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  150. data/spec/dummy/config/initializers/inflections.rb +16 -0
  151. data/spec/dummy/config/initializers/mime_types.rb +4 -0
  152. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  153. data/spec/dummy/config/locales/en.yml +33 -0
  154. data/spec/dummy/config/puma.rb +34 -0
  155. data/spec/dummy/config/routes.rb +9 -0
  156. data/spec/dummy/config/spring.rb +6 -0
  157. data/spec/dummy/config/storage.yml +34 -0
  158. data/spec/dummy/db/development.sqlite3 +0 -0
  159. data/spec/dummy/db/migrate/20190709192619_create_categories.rb +9 -0
  160. data/spec/dummy/db/migrate/20190709192656_create_questions.rb +12 -0
  161. data/spec/dummy/db/migrate/20190709192737_create_answers.rb +13 -0
  162. data/spec/dummy/db/schema.rb +42 -0
  163. data/spec/dummy/db/test.sqlite3 +0 -0
  164. data/spec/dummy/log/development.log +64 -0
  165. data/spec/dummy/log/test.log +40792 -0
  166. data/spec/dummy/package.json +5 -0
  167. data/spec/dummy/public/404.html +67 -0
  168. data/spec/dummy/public/422.html +67 -0
  169. data/spec/dummy/public/500.html +66 -0
  170. data/{lib/generators/templet/templates/core/controllers/.keep → spec/dummy/public/apple-touch-icon-precomposed.png} +0 -0
  171. data/spec/dummy/public/apple-touch-icon.png +0 -0
  172. data/spec/dummy/public/favicon.ico +0 -0
  173. data/spec/dummy/spec/apis/answers_controller_spec.rb +17 -0
  174. data/spec/dummy/spec/apis/categories_controller_spec.rb +13 -0
  175. data/spec/dummy/spec/apis/questions_controller_spec.rb +15 -0
  176. data/spec/dummy/spec/helpers/app/answer_viewer_spec.rb +18 -0
  177. data/spec/dummy/spec/helpers/app/category_viewer_spec.rb +14 -0
  178. data/spec/dummy/spec/helpers/app/layouts/flash_messages_spec.rb +18 -0
  179. data/spec/dummy/spec/helpers/app/layouts/navbar_spec.rb +19 -0
  180. data/spec/dummy/spec/helpers/app/question_viewer_spec.rb +16 -0
  181. data/spec/dummy/spec/support/apis/api_helper.rb +15 -0
  182. data/spec/dummy/spec/support/apis/shared_examples_a_json_controller.rb +196 -0
  183. data/spec/dummy/spec/support/templet/partial_test_helpers.rb +32 -0
  184. data/spec/dummy/spec/support/templet/shared_examples_a_viewer.rb +105 -0
  185. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/-6/-6-48LISBeQVJvpEXNgFstDrCriEFNmvje6XhidzlV4.cache +1 -0
  186. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/-D/-DLE9y_1ICajcEaHcprHYBO8vjXpHySH_56FSb0SLOs.cache +0 -0
  187. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/-Y/-YJ1ILDQvu3hOKkF0VR9K_z04e2-EVHglO0MAFS8gpQ.cache +1 -0
  188. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/-_/-_7FgdEon9WttcnvoyQAysmonCHN7FxsrcuDa5OTUJQ.cache +1 -0
  189. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/0u/0u-iWymOJvpggI1uY7Na3322xwcjNY7egB-czjV96m4.cache +2 -0
  190. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/0x/0xArd189AygdGItqWO0_5BfinFQjLZjwyVsAGWqOgKg.cache +1 -0
  191. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/2S/2SfjLWkOp2BGM0OzwsshKpnXI8rlJFOV6ZJsIszRn6k.cache +1 -0
  192. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/3h/3hFAACevvXtDja9zz3rMK6gA1MD1I7_puWyRRkV7sLk.cache +2 -0
  193. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/4o/4oNwzIrltWrfajciBz7JHd5RT5_XVv04L6NdaBGN794.cache +3 -0
  194. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/7F/7F3o6QQqoI0bDk6-A5qMN8LCZQALddlu23KiRWBxtWk.cache +0 -0
  195. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Af/AfFBDeKpi4wSUc7rcjxfjPbEgV6GOGXTjeZhHrfDX48.cache +0 -0
  196. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Bf/BfD6ZVgFq-kWDMMVb2EE5ZAKgsgn1VUR9oVxD0hHVMI.cache +0 -0
  197. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Bo/Bogjbc_D5J-6_m5KEgeXt_GHc-IbUt1_FDWP4PHV0P8.cache +1 -0
  198. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/DF/DF3HgsSD9LO1Bz8d3GJi_G6wBExmsnBJ6b1pvZEGE7w.cache +1 -0
  199. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/DO/DO8Gqh32jK2GrO9uIlH7qvDkelVw0VM8CTSOUj6iUEo.cache +1 -0
  200. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/GC/GCNwk_ABiY0z51bz8iC8tqLLWKhQwxW4-JLNKv-SRe0.cache +1 -0
  201. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Gl/Gls_Zud1kxq7p08FGBfzalbaLMlLBl28bOYebh7Ljrg.cache +0 -0
  202. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Gm/GmHHk4YNC0G2V_5gQZp0U6mKFPxGSgL7fwWI3_fajrk.cache +1 -0
  203. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Gr/GreB3WHN8MyWMDFGNyqJJcxGblgo-5XepsEHvdJSQGI.cache +1 -0
  204. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/HC/HCDOUd7-S45aJ_PjVAC_Vmjyud3i1aQv4cE3t9_Z3Dw.cache +2 -0
  205. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Hd/HdvsElcHSt7aKjG9jocgIQJEvBjBbeSZ8HntI1pc38o.cache +1 -0
  206. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Iv/IvR5RxSTQkxfGWSoy5S2s7wO5u5qwCJ5mNAhqNJtJDY.cache +0 -0
  207. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/JS/JSYyQZJzLNqpmVR--ZDUW6PY7_HflyFFHDAOLenxlP4.cache +1 -0
  208. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Jx/JxJXzSistcpH4S_9CbGx_wyjVTaE77ZDDfOc4uTfvdM.cache +0 -0
  209. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/MH/MHCZUSVJq62YPmcVVkfjp2B5uH_nDL7snLl4yqvlSJY.cache +1 -0
  210. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/MY/MY5theanttko1gCnW9vKb0Z1GkJn8Ofk149HwOt0UAM.cache +0 -0
  211. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Mn/MnGg5XDll2jo-E_CTC1htiNc0hOY6z80_bwGCvpYTXk.cache +1 -0
  212. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Nt/NtYu5CjAvU5ZHxSOn6Q4LPukD3hBE-3vYe30d_uSBzM.cache +1 -0
  213. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Nu/NuIepb7qomZzBDAJMUROsshKo8TJxdmFR4yOe64W58w.cache +1 -0
  214. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/R7/R7ngeIqpdwSWkbjbxxzh6B-KczkWMcxYMIkj5inxrV8.cache +1 -0
  215. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/S9/S9MhILnM64qd2M9Z92TrNMtw7VUWZxf3H367OO8rlhs.cache +2 -0
  216. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/SI/SIZUy2mtjUm_G1YIulRCovzgkCwV1eoR2NLiYcsR1Ws.cache +0 -0
  217. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Sl/SlECThrSAExfICiFGVi-zu240BVDaUldaRs4qcj354U.cache +0 -0
  218. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/St/St6dTA4niiCDLnnArKZV38uZNFf6MbEZ_jHGC-Upft0.cache +0 -0
  219. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/T6/T6p-BnPmMCmpJdaqrjWmLMsBW8SNJpSW6w-Azc3XGVk.cache +1 -0
  220. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Vs/VsZPCEai1GtOT-vHjxMS8kAP9ASG5i_2O_EP76uI7Qs.cache +0 -0
  221. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Vv/Vv6dack32HV3tIZ_6F4BF8Mrrnb7wZEG4VlEKumQ6L0.cache +2 -0
  222. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Wp/WpV6mJwJX9dwIFJGLoJoa-gXNe1-ZHusE9SwvnWysa8.cache +0 -0
  223. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Wy/Wya0wl0Q2nXYb5-bC5Fbo0sDZfKb3415AjtSjld7fQI.cache +1 -0
  224. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/b7/b7j7TIOE1nnqvMku0QePWFrwCkaKkNpxkiWST6PAplo.cache +1 -0
  225. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ck/ckDOh-FroVE8r1fwUNWmnRconIREuVdmkZEFkaP9KfU.cache +1 -0
  226. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/eN/eNQPQP-9gB3xzxJBsG7soV6Ie0YZ3gxIS97PgYtZVT8.cache +0 -0
  227. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/gb/gbUMPMF8S0OQVsFHyAjHpHVEg-3iZzTVIQZDmfq-ycE.cache +1 -0
  228. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/if/ifyb5SlIS8vkACz_6P0uTOGijMB4C5TyFWmrMq3DYIg.cache +2 -0
  229. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/jg/jg-s5YLdnojCtHqzfDTsvcy6UHewDRl1X09qlGyvyag.cache +1 -0
  230. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ko/koPyQus8Oqrx18bnLj-5nJrKvFf6FDDQbv2qEa7Bl7M.cache +0 -0
  231. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/lG/lGRRazgrFErFx1PkfDlca6r-0MGQR40i0tq0Wgm2FNU.cache +1 -0
  232. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/lS/lStvx9Beg2l4s8L-QdTSKuc5_qQPQAZPnIcRI7JkpPE.cache +2 -0
  233. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/lZ/lZIacHrJV5bDohEHsVOXDGIDrUH2h4YvwV9g-MWmh3k.cache +3 -0
  234. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/lq/lqM4-wfprvp5FEBp1pSm88Jwx-Vb2oJab2rjLtUcIyM.cache +1 -0
  235. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/n_/n_xYqQYhwEMQknb3jFQnjlxxBE9TzMNHCdJ-bEyZFIw.cache +2 -0
  236. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/nx/nxTv3sKVUQZADJyM3dPaVmUA78MIsMLD_K279yN_GsI.cache +2 -0
  237. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ps/psGFyjvQcs8JpIV8BDeCqQfHaLYgIgSAi86n4RrFpFs.cache +1 -0
  238. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/r1/r1IIabhuPhgB3n8V3ZMRN0SqIsXJ8bH0ABTRzHTG1SU.cache +2 -0
  239. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/vt/vtskp0QTt72oDQNM6mYZ8pCclh2HICHeYZ1QtDvC5xo.cache +1 -0
  240. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/wi/win_v0ZNu-l7AoRx8w3ls1xcy0mUExLBVMCSr5oaJFc.cache +2 -0
  241. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/yo/yoggubxI12fIM1o5TtxUialrUN-LWOfRaV_tqc1HAC4.cache +0 -0
  242. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/zH/zHnHpZP25wEHaF3mI_M9RGH1zeCApf6mwhLB3Lku1zs.cache +3 -0
  243. data/spec/dummy/tmp/development_secret.txt +1 -0
  244. data/spec/factories/answers.rb +10 -0
  245. data/spec/factories/categories.rb +5 -0
  246. data/spec/factories/questions.rb +8 -0
  247. data/spec/helpers/templet/forms/bs_form_errors_spec.rb +18 -0
  248. data/spec/helpers/templet/forms/bs_form_spec.rb +58 -0
  249. data/spec/helpers/templet/layout/html_rails_spec.rb +64 -0
  250. data/spec/helpers/templet/links/bs_link_set_collection_spec.rb +79 -0
  251. data/spec/helpers/templet/links/rest_link_procs_params_spec.rb +68 -0
  252. data/spec/helpers/templet/links/rest_link_procs_parents_spec.rb +78 -0
  253. data/spec/helpers/templet/links/rest_link_procs_spec.rb +140 -0
  254. data/spec/models/answer_spec.rb +9 -0
  255. data/spec/models/category_spec.rb +9 -0
  256. data/spec/models/question_spec.rb +9 -0
  257. data/spec/rails_helper.rb +61 -0
  258. data/spec/spec_helper.rb +108 -0
  259. data/spec/support/templet/model_parent_helpers.rb +36 -0
  260. data/spec/support/templet/partial_test_helpers.rb +32 -0
  261. data/spec/support/templet/rest_link_procs_assignments.rb +43 -0
  262. data/spec/support/templet/rest_link_procs_helpers.rb +15 -0
  263. metadata +470 -38
  264. data/.gitignore +0 -8
  265. data/.travis.yml +0 -5
  266. data/Gemfile +0 -6
  267. data/LICENSE.txt +0 -21
  268. data/bin/console +0 -14
  269. data/bin/setup +0 -8
  270. data/lib/generators/templet/core/USAGE +0 -23
  271. data/lib/generators/templet/core/core_generator.rb +0 -128
  272. data/lib/generators/templet/templates/core/app/panel/flash_messages.rb +0 -33
  273. data/lib/generators/templet/templates/core/app/panel/nav_args_option.rb +0 -30
  274. data/lib/generators/templet/templates/core/app/panel/show_parents_option.rb +0 -22
  275. data/lib/generators/templet/templates/core/app/panel/sidebar_links_option.rb +0 -24
  276. data/templet_rails.gemspec +0 -36
@@ -0,0 +1,16 @@
1
+ Description:
2
+ This generator creates a new application area, and is to be run just once.
3
+ It creates the directory tree, app/helpers/app/,
4
+ which is where your own (application) code goes underneath.
5
+ The option --include-core-specs (default: false) adds starter tests that
6
+ check the HTML in the supplied view layouts.
7
+
8
+ Example:
9
+ rails generate templet:install --include-layout-specs
10
+
11
+ This will create:
12
+ app/helpers/app.rb # For global settings in your own code
13
+ app/helpers/app/** # Your own (application) code
14
+ spec/support/apis/* # For testing JSON sent from the controller
15
+ spec/support/templet/* # For testing the HTML in the rendered views
16
+ spec/helpers/app/layouts/ # For testing layouts - if requested
@@ -0,0 +1,103 @@
1
+
2
+ require_relative '../shared/core_helpers'
3
+
4
+ module Templet
5
+ class InstallGenerator < Rails::Generators::Base
6
+ include Shared::CoreHelpers
7
+
8
+ CONTROLLER_SUBDIR = 'controllers/'
9
+ APIS_SUBDIR = 'apis/'
10
+
11
+ LAYOUTS = '/layouts'
12
+
13
+ source_root File.expand_path('./', __FILE__)
14
+ desc
15
+
16
+ #DEST_DESC = 'The directory that the app code will be copied beneath'
17
+ #class_option :dest, type: :string, aliases: "-d", default: '', desc: DEST_DESC
18
+ DESC = "Add specs for the layouts (default: false)"
19
+ class_option 'include-layout-specs', type: :boolean, default: false, desc: DESC
20
+
21
+
22
+ def ensure_uninstalled
23
+ if dir = already_installed_at
24
+ puts "Can't install while there are files present in #{dir}"
25
+
26
+ exit
27
+ end
28
+ end
29
+
30
+ def create_app
31
+ create_app_tree
32
+
33
+ create_app_rb
34
+
35
+ mount_engine
36
+ end
37
+
38
+ def create_rspec_support
39
+ if rspec?
40
+ %i(shared viewer).each do |subdir|
41
+ directory spec_support_dir_source(subdir), spec_support_dir_target
42
+ end
43
+
44
+ directory api_support_dir_source, api_support_dir_target
45
+
46
+ create_layout_specs if include_layout_specs?
47
+ end
48
+ end
49
+
50
+ private
51
+
52
+ def create_app_tree
53
+ directory app_dir_source, app_dir_target
54
+ end
55
+
56
+ def create_app_rb
57
+ copy_helper 'app.rb'
58
+ end
59
+
60
+ def create_layout_specs
61
+ layouts_source_dir = SOURCE_ROOT + SPEC_SUBDIR + LAYOUTS
62
+
63
+ layouts_target_dir = SPEC_SUBDIR + HELPERS_SUBDIR + APP_SUBDIR + LAYOUTS
64
+
65
+ directory layouts_source_dir, layouts_target_dir
66
+ end
67
+
68
+ def app_dir_source
69
+ SOURCE_ROOT + APP_SUBDIR
70
+ end
71
+ def app_dir_target
72
+ APP_ROOT + HELPERS_SUBDIR + APP_SUBDIR
73
+ end
74
+
75
+ def spec_support_dir_source(subdir)
76
+ SOURCE_ROOT + spec_support_dir + "#{subdir}/"
77
+ end
78
+ def spec_support_dir_target
79
+ spec_support_dir + TEMPLET_SUBDIR
80
+ end
81
+
82
+ def api_support_dir_source
83
+ SOURCE_ROOT + spec_support_dir + APIS_SUBDIR
84
+ end
85
+ def api_support_dir_target
86
+ spec_support_dir + APIS_SUBDIR
87
+ end
88
+
89
+ def dest_dirs
90
+ [ APP_ROOT + HELPERS_SUBDIR + APP_SUBDIR ]
91
+ end
92
+
93
+ def include_layout_specs?
94
+ options['include-layout-specs']
95
+ end
96
+
97
+ def mount_engine
98
+ mount = "mount TempletRails::Engine, at: '/templet'"
99
+
100
+ route mount unless IO.read('config/routes.rb') =~ /#{mount}/m
101
+ end
102
+ end
103
+ end
@@ -3,62 +3,64 @@ require_relative '../shared/parent_option'
3
3
  require_relative '../shared/add_routes_option'
4
4
  require_relative '../shared/actions_option'
5
5
 
6
- class Templet::RoutesGenerator < Rails::Generators::NamedBase
7
- include Shared::ParentOption
8
- include Shared::AddRoutesOption
9
- include Shared::ActionsOption
6
+ module Templet
7
+ class RoutesGenerator < Rails::Generators::NamedBase
8
+ include Shared::ParentOption
9
+ include Shared::AddRoutesOption
10
+ include Shared::ActionsOption
10
11
 
11
- source_root File.expand_path('.', __FILE__)
12
- desc
12
+ source_root File.expand_path('.', __FILE__)
13
+ desc
13
14
 
14
- def add_routes
15
- routes = route_statement
15
+ def add_routes
16
+ routes = route_statement
16
17
 
17
- if add_routes?
18
- route routes
18
+ if add_routes?
19
+ route routes
19
20
 
20
- puts 'Routes written to config/routes.rb as follows:', routes
21
- else
22
- puts 'If applicable, update your config/routes.rb file with:', routes
21
+ puts 'Routes written to config/routes.rb as follows:', routes
22
+ else
23
+ puts 'If applicable, update your config/routes.rb file with:', routes
24
+ end
23
25
  end
24
- end
25
26
 
26
- private
27
+ private
27
28
 
28
- def route_statement
29
- in_scope { in_parent { resources plural_name, only_actions: true } }
30
- end
29
+ def route_statement
30
+ in_scope { in_parent { resources plural_name, only_actions: true } }
31
+ end
31
32
 
32
- def in_scope
33
- if scope_name
34
- " namespace('#{scope_name}') do\n #{yield}\n end\n"
35
- else
36
- yield
33
+ def in_scope
34
+ if scope_name
35
+ " namespace('#{scope_name}') do\n #{yield}\n end\n"
36
+ else
37
+ yield
38
+ end
37
39
  end
38
- end
39
40
 
40
- def in_parent
41
- if parent
42
- " #{resources parent.pluralize, no_only: true} { #{yield} }"
43
- else
44
- " #{yield}"
41
+ def in_parent
42
+ if parent
43
+ " #{resources parent.pluralize, no_only: true} { #{yield} }"
44
+ else
45
+ " #{yield}"
46
+ end
45
47
  end
46
- end
47
48
 
48
- def resources(name, **options)
49
- "resources(:#{name}#{only_actions **options})"
50
- end
49
+ def resources(name, **options)
50
+ "resources(:#{name}#{only_actions **options})"
51
+ end
51
52
 
52
- ONLY = ', only: '
53
- def only_actions(only_actions: false, no_only: false)
54
- only_actions ? action_syms(ONLY) : no_only ? "#{ONLY}[]" : ''
55
- end
53
+ ONLY = ', only: '
54
+ def only_actions(only_actions: false, no_only: false)
55
+ only_actions ? action_syms(ONLY) : no_only ? "#{ONLY}[]" : ''
56
+ end
56
57
 
57
- def scope_name
58
- elements = file_path.split('/')[0..-2]
58
+ def scope_name
59
+ elements = file_path.split('/')[0..-2]
59
60
 
60
- if elements.any?
61
- elements * '/'
61
+ if elements.any?
62
+ elements * '/'
63
+ end
62
64
  end
63
65
  end
64
66
  end
@@ -109,6 +109,7 @@ end
109
109
 
110
110
  %Q[
111
111
  require "rails_helper"
112
+ require 'rack/test/methods'
112
113
  #{comment}
113
114
  RSpec.describe #{class_name.pluralize}Controller, type: :api do
114
115
  it_behaves_like "a json controller"#{action_syms ', '} do
@@ -7,69 +7,71 @@ require_relative '../shared/add_routes_option'
7
7
  require_relative '../shared/comment_tests_option'
8
8
  require_relative '../shared/actions_option'
9
9
 
10
- class Templet::ScaffoldGenerator < Rails::Generators::NamedBase
11
- include Shared::ModelOption
12
- include Shared::ParentOption
13
- include Shared::GrandParentOption
14
- include Shared::ChildOption
15
- include Shared::CommentTestsOption
16
- include Shared::AddRoutesOption
17
- include Shared::ActionsOption
18
-
19
- source_root File.expand_path('.', __FILE__)
20
- desc
21
-
22
- def create_controller
23
- generate 'templet:controller', args(name, parent_option, model_option,
24
- grand_parent_option, actions_option)
25
- end
26
-
27
- def create_viewer_subclass
28
- generate 'templet:viewer', args(name, child_option, actions_option)
29
- end
30
-
31
- def create_rspec
32
- generate 'templet:rspec', args(name, parent_option, model_option,
33
- grand_parent_option,
34
- comment_tests_option, actions_option)
35
- end
36
-
37
- def create_routes
38
- generate 'templet:routes', args(name, parent_option,
39
- add_routes_option, actions_option)
40
- end
41
-
42
- private
43
-
44
- def args(*options)
45
- options * ' ' + ' '
46
- end
47
-
48
- def parent_option
49
- parent ? "--parent #{parent}" : ''
50
- end
51
-
52
- def model_option
53
- model_name? ? "--model #{model_name}" : ''
54
- end
55
-
56
- def grand_parent_option
57
- grand_parent ? "--grand-parent #{grand_parent}" : ''
58
- end
59
-
60
- def child_option
61
- child? ? "--child #{child}" : ''
62
- end
63
-
64
- def add_routes_option
65
- add_routes? ? "--add-routes" : ''
66
- end
67
-
68
- def comment_tests_option
69
- comment_tests? ? '' : "--no-comment-tests"
70
- end
71
-
72
- def actions_option
73
- actions&.any? ? "--actions #{actions * ' '}" : ''
10
+ module Templet
11
+ class ScaffoldGenerator < Rails::Generators::NamedBase
12
+ include Shared::ModelOption
13
+ include Shared::ParentOption
14
+ include Shared::GrandParentOption
15
+ include Shared::ChildOption
16
+ include Shared::CommentTestsOption
17
+ include Shared::AddRoutesOption
18
+ include Shared::ActionsOption
19
+
20
+ source_root File.expand_path('.', __FILE__)
21
+ desc
22
+
23
+ def create_controller
24
+ generate 'templet:controller', args(name, parent_option, model_option,
25
+ grand_parent_option, actions_option)
26
+ end
27
+
28
+ def create_viewer_subclass
29
+ generate 'templet:viewer', args(name, child_option, actions_option)
30
+ end
31
+
32
+ def create_rspec
33
+ generate 'templet:rspec', args(name, parent_option, model_option,
34
+ grand_parent_option,
35
+ comment_tests_option, actions_option)
36
+ end
37
+
38
+ def create_routes
39
+ generate 'templet:routes', args(name, parent_option,
40
+ add_routes_option, actions_option)
41
+ end
42
+
43
+ private
44
+
45
+ def args(*options)
46
+ options * ' ' + ' '
47
+ end
48
+
49
+ def parent_option
50
+ parent ? "--parent #{parent}" : ''
51
+ end
52
+
53
+ def model_option
54
+ model_name? ? "--model #{model_name}" : ''
55
+ end
56
+
57
+ def grand_parent_option
58
+ grand_parent ? "--grand-parent #{grand_parent}" : ''
59
+ end
60
+
61
+ def child_option
62
+ child? ? "--child #{child}" : ''
63
+ end
64
+
65
+ def add_routes_option
66
+ add_routes? ? "--add-routes" : ''
67
+ end
68
+
69
+ def comment_tests_option
70
+ comment_tests? ? '' : "--no-comment-tests"
71
+ end
72
+
73
+ def actions_option
74
+ actions&.any? ? "--actions #{actions * ' '}" : ''
75
+ end
74
76
  end
75
77
  end
@@ -18,6 +18,10 @@ module Shared
18
18
  puts "#{from}\n => #{to}"
19
19
  end
20
20
 
21
+ def copy_helper(file)
22
+ copy_file helper_dir_source(file), helper_dir_target(file)
23
+ end
24
+
21
25
  #alias copy_file copy
22
26
  #alias directory copy
23
27
 
@@ -25,9 +29,15 @@ module Shared
25
29
  Dir.exists? spec_support_dir
26
30
  end
27
31
 
32
+ def helper_dir_target(file)
33
+ APP_ROOT + HELPERS_SUBDIR + file
34
+ end
28
35
  def spec_support_dir
29
36
  SPEC_SUBDIR + SUPPORT_SUBDIR
30
37
  end
38
+ def helper_dir_source(file)
39
+ SOURCE_ROOT + HELPERS_SUBDIR + file
40
+ end
31
41
 
32
42
  def already_installed_at
33
43
  dest_dirs.each do |dir|
@@ -24,8 +24,8 @@ module Shared
24
24
  def field_with_type(model_name, types)
25
25
  names_to_types = model_types(model_fields model_name)
26
26
 
27
- types.each do |wanted_type|
28
- names_to_types.each do |(name, type)|
27
+ names_to_types.each do |(name, type)|
28
+ types.each do |wanted_type|
29
29
  return name, type if type == wanted_type
30
30
  end
31
31
  end
@@ -1,7 +1,7 @@
1
1
 
2
2
  module App
3
3
  class BaseViewer < Templet::ViewerRest
4
- include Panel::OptionsConfig
4
+ include Layouts::OptionsConfig
5
5
  end
6
6
  end
7
7
 
@@ -1,6 +1,6 @@
1
1
 
2
2
  module App
3
- module Panel
3
+ module Layouts
4
4
  # Renders a navbar, flash messages and yielded content in Bootstrap grid
5
5
  class LayoutBase < Templet::Component::Partial
6
6
  include Templet::Mixins::Bs::Grid
@@ -28,11 +28,11 @@ module App
28
28
  end
29
29
 
30
30
  def messages
31
- FlashMessages.new(renderer).(**bs_column_opts)
31
+ Panel::FlashMessages.new(renderer).(**bs_column_opts)
32
32
  end
33
33
 
34
34
  def navbar(*args)
35
- Nav.new(renderer).(*args)
35
+ Navbar.new(renderer).(*args)
36
36
  end
37
37
  end
38
38
  end
@@ -1,6 +1,6 @@
1
1
 
2
2
  module App
3
- module Panel
3
+ module Layouts
4
4
  # Renders a heading with a title, subtitle and perhaps something on right
5
5
  class LayoutHeader < LayoutBase
6
6
  def call(action, **options)
@@ -9,6 +9,8 @@ module App
9
9
  super { [ header(*args), yield(renderer) ] }
10
10
  end
11
11
 
12
+ private
13
+
12
14
  def header(title, subtitle, on_right)
13
15
  renderer.call do
14
16
  div :page_header do