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.
- checksums.yaml +5 -5
- data/MIT-LICENSE +20 -0
- data/README.md +334 -269
- data/Rakefile +21 -7
- data/app/assets/config/templet_rails_manifest.js +2 -0
- data/app/assets/javascripts/templet_rails/application.js +15 -0
- data/app/assets/stylesheets/templet_rails/application.css +15 -0
- data/app/controllers/templet/json_rendering_helpers.rb +12 -0
- data/app/controllers/templet/rendering_helpers.rb +53 -0
- data/app/controllers/templet/viewer_call_string.rb +144 -0
- data/app/controllers/templet/viewer_call_string_class.rb +65 -0
- data/app/controllers/templet/viewer_responders.rb +121 -0
- data/app/controllers/templet_rails/application_controller.rb +5 -0
- data/app/helpers/templet/constants.rb +54 -0
- data/app/helpers/templet/forms/bs_form.rb +73 -0
- data/app/helpers/templet/forms/bs_form_errors.rb +38 -0
- data/app/helpers/templet/forms/bs_form_field.rb +114 -0
- data/app/helpers/templet/forms/bs_form_group.rb +115 -0
- data/app/helpers/templet/layouts/html_rails.rb +36 -0
- data/app/helpers/templet/links.rb +28 -0
- data/app/helpers/templet/links/bs_btn_class.rb +61 -0
- data/app/helpers/templet/links/bs_link_set_base.rb +168 -0
- data/app/helpers/templet/links/bs_link_set_collection.rb +21 -0
- data/app/helpers/templet/links/bs_link_set_navigation.rb +62 -0
- data/app/helpers/templet/links/rest_link_procs.rb +163 -0
- data/app/helpers/templet/links/rest_link_procs_parent.rb +39 -0
- data/app/helpers/templet/links/rest_link_procs_sets.rb +30 -0
- data/app/helpers/templet/links/rest_link_text.rb +102 -0
- data/app/helpers/templet/links/rest_path.rb +90 -0
- data/app/helpers/templet/mixins.rb +9 -0
- data/app/helpers/templet/mixins/bs.rb +11 -0
- data/app/helpers/templet/mixins/bs/grid.rb +53 -0
- data/app/helpers/templet/mixins/bs/lists.rb +77 -0
- data/app/helpers/templet/mixins/field_procs.rb +140 -0
- data/app/helpers/templet/mixins/html_presenters.rb +82 -0
- data/app/helpers/templet/require_all.rb +45 -0
- data/app/helpers/templet/utils/html_search_form.rb +53 -0
- data/app/helpers/templet/utils/link_set_factory.rb +46 -0
- data/app/helpers/templet/utils/link_set_factory_wrapper.rb +53 -0
- data/app/helpers/templet/utils/list_model_parents.rb +27 -0
- data/app/helpers/templet/utils/navbar_form.rb +26 -0
- data/app/helpers/templet/utils/selected_wrapper.rb +40 -0
- data/app/helpers/templet/viewer.rb +11 -0
- data/app/helpers/templet/viewer/meta_model.rb +66 -0
- data/app/helpers/templet/viewer/meta_model_defaults.rb +56 -0
- data/app/helpers/templet/viewer/presenters.rb +44 -0
- data/app/helpers/templet/viewer/rest_actions.rb +24 -0
- data/app/helpers/templet/viewer_base.rb +111 -0
- data/app/helpers/templet/viewer_rest.rb +144 -0
- data/app/helpers/templet_helper.rb +10 -0
- data/app/helpers/templet_rails/application_helper.rb +4 -0
- data/app/jobs/templet_rails/application_job.rb +4 -0
- data/app/mailers/templet_rails/application_mailer.rb +6 -0
- data/app/models/templet_rails/application_record.rb +5 -0
- data/app/views/layouts/templet_rails/application.html.erb +16 -0
- data/config/routes.rb +2 -0
- data/lib/generators/templet/controller/controller_generator.rb +70 -68
- data/lib/generators/templet/core_install/USAGE +14 -0
- data/lib/generators/templet/core_install/core_install_generator.rb +77 -0
- data/lib/generators/templet/core_rspec/USAGE +5 -8
- data/lib/generators/templet/core_rspec/core_rspec_generator.rb +32 -47
- data/lib/generators/templet/destroy/USAGE +1 -1
- data/lib/generators/templet/destroy/destroy_generator.rb +87 -84
- data/lib/generators/templet/install/USAGE +16 -0
- data/lib/generators/templet/install/install_generator.rb +103 -0
- data/lib/generators/templet/routes/routes_generator.rb +43 -41
- data/lib/generators/templet/rspec/rspec_generator.rb +1 -0
- data/lib/generators/templet/scaffold/scaffold_generator.rb +66 -64
- data/lib/generators/templet/shared/core_helpers.rb +10 -0
- data/lib/generators/templet/shared/model_fields.rb +2 -2
- data/lib/generators/templet/templates/core/app/base_viewer.rb +1 -1
- data/lib/generators/templet/templates/core/app/{panel → layouts}/layout_base.rb +3 -3
- data/lib/generators/templet/templates/core/app/{panel → layouts}/layout_header.rb +3 -1
- data/lib/generators/templet/templates/core/app/{panel → layouts}/layout_header_sidebar.rb +2 -1
- data/lib/generators/templet/templates/core/app/{panel/nav.rb → layouts/navbar.rb} +2 -2
- data/lib/generators/templet/templates/core/app/layouts/navbar_args_option.rb +32 -0
- data/lib/generators/templet/templates/core/app/{link_sets/navbar.rb → layouts/navbar_links.rb} +2 -2
- data/lib/generators/templet/templates/core/app/{panel → layouts}/options_config.rb +3 -3
- data/lib/generators/templet/templates/core/app/layouts/panel/flash_messages.rb +35 -0
- data/lib/generators/templet/templates/core/app/layouts/panel/show_parents_option.rb +24 -0
- data/lib/generators/templet/templates/core/app/layouts/panel/sidebar_links_option.rb +26 -0
- data/lib/generators/templet/templates/core/spec/layouts/flash_messages_spec.rb +18 -0
- data/lib/generators/templet/templates/core/spec/layouts/navbar_spec.rb +19 -0
- data/lib/generators/templet/templates/core/spec/support/apis/api_helper.rb +2 -0
- data/lib/generators/templet/templates/core/spec/support/apis/shared_examples_a_json_controller.rb +1 -1
- data/lib/generators/templet/templates/core/spec/support/{viewer → shared}/partial_test_helpers.rb +0 -0
- data/lib/generators/templet/templates/core/templet/viewer_base.rb +3 -3
- data/lib/generators/templet/viewer/viewer_generator.rb +60 -58
- data/lib/tasks/templet_rails_tasks.rake +4 -0
- data/lib/templet_rails.rb +1 -1
- data/lib/templet_rails/engine.rb +5 -0
- data/lib/templet_rails/version.rb +1 -1
- data/spec/dummy/Rakefile +6 -0
- data/spec/dummy/app/assets/config/manifest.js +4 -0
- data/spec/dummy/app/assets/javascripts/application.js +15 -0
- data/spec/dummy/app/assets/javascripts/cable.js +13 -0
- data/spec/dummy/app/assets/stylesheets/application.css +15 -0
- data/spec/dummy/app/channels/application_cable/channel.rb +4 -0
- data/spec/dummy/app/channels/application_cable/connection.rb +4 -0
- data/spec/dummy/app/controllers/answers_controller.rb +86 -0
- data/spec/dummy/app/controllers/application_controller.rb +2 -0
- data/spec/dummy/app/controllers/categories_controller.rb +80 -0
- data/spec/dummy/app/controllers/questions_controller.rb +86 -0
- data/spec/dummy/app/helpers/app.rb +4 -0
- data/spec/dummy/app/helpers/app/answer_viewer.rb +21 -0
- data/spec/dummy/app/helpers/app/base_viewer.rb +7 -0
- data/spec/dummy/app/helpers/app/category_viewer.rb +26 -0
- data/spec/dummy/app/helpers/app/layouts/layout_base.rb +40 -0
- data/spec/dummy/app/helpers/app/layouts/layout_header.rb +24 -0
- data/spec/dummy/app/helpers/app/layouts/layout_header_sidebar.rb +19 -0
- data/spec/dummy/app/helpers/app/layouts/navbar.rb +55 -0
- data/spec/dummy/app/helpers/app/layouts/navbar_args_option.rb +32 -0
- data/spec/dummy/app/helpers/app/layouts/navbar_links.rb +12 -0
- data/spec/dummy/app/helpers/app/layouts/options_config.rb +19 -0
- data/spec/dummy/app/helpers/app/layouts/panel/flash_messages.rb +35 -0
- data/spec/dummy/app/helpers/app/layouts/panel/show_parents_option.rb +24 -0
- data/spec/dummy/app/helpers/app/layouts/panel/sidebar_links_option.rb +26 -0
- data/spec/dummy/app/helpers/app/question_viewer.rb +26 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/jobs/application_job.rb +2 -0
- data/spec/dummy/app/mailers/application_mailer.rb +4 -0
- data/spec/dummy/app/models/answer.rb +12 -0
- data/spec/dummy/app/models/application_record.rb +3 -0
- data/spec/dummy/app/models/category.rb +11 -0
- data/spec/dummy/app/models/question.rb +15 -0
- data/spec/dummy/app/views/layouts/application.html.erb +15 -0
- data/spec/dummy/app/views/layouts/mailer.html.erb +13 -0
- data/spec/dummy/app/views/layouts/mailer.text.erb +1 -0
- data/spec/dummy/bin/bundle +3 -0
- data/spec/dummy/bin/rails +4 -0
- data/spec/dummy/bin/rake +4 -0
- data/spec/dummy/bin/setup +36 -0
- data/spec/dummy/bin/update +31 -0
- data/spec/dummy/bin/yarn +11 -0
- data/spec/dummy/config.ru +5 -0
- data/spec/dummy/config/application.rb +30 -0
- data/spec/dummy/config/boot.rb +5 -0
- data/spec/dummy/config/cable.yml +10 -0
- data/spec/dummy/config/database.yml +25 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +61 -0
- data/spec/dummy/config/environments/production.rb +94 -0
- data/spec/dummy/config/environments/test.rb +46 -0
- data/spec/dummy/config/initializers/application_controller_renderer.rb +8 -0
- data/spec/dummy/config/initializers/assets.rb +14 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/content_security_policy.rb +25 -0
- data/spec/dummy/config/initializers/cookies_serializer.rb +5 -0
- data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/spec/dummy/config/initializers/inflections.rb +16 -0
- data/spec/dummy/config/initializers/mime_types.rb +4 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy/config/locales/en.yml +33 -0
- data/spec/dummy/config/puma.rb +34 -0
- data/spec/dummy/config/routes.rb +9 -0
- data/spec/dummy/config/spring.rb +6 -0
- data/spec/dummy/config/storage.yml +34 -0
- data/spec/dummy/db/development.sqlite3 +0 -0
- data/spec/dummy/db/migrate/20190709192619_create_categories.rb +9 -0
- data/spec/dummy/db/migrate/20190709192656_create_questions.rb +12 -0
- data/spec/dummy/db/migrate/20190709192737_create_answers.rb +13 -0
- data/spec/dummy/db/schema.rb +42 -0
- data/spec/dummy/db/test.sqlite3 +0 -0
- data/spec/dummy/log/development.log +64 -0
- data/spec/dummy/log/test.log +40792 -0
- data/spec/dummy/package.json +5 -0
- data/spec/dummy/public/404.html +67 -0
- data/spec/dummy/public/422.html +67 -0
- data/spec/dummy/public/500.html +66 -0
- data/{lib/generators/templet/templates/core/controllers/.keep → spec/dummy/public/apple-touch-icon-precomposed.png} +0 -0
- data/spec/dummy/public/apple-touch-icon.png +0 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/dummy/spec/apis/answers_controller_spec.rb +17 -0
- data/spec/dummy/spec/apis/categories_controller_spec.rb +13 -0
- data/spec/dummy/spec/apis/questions_controller_spec.rb +15 -0
- data/spec/dummy/spec/helpers/app/answer_viewer_spec.rb +18 -0
- data/spec/dummy/spec/helpers/app/category_viewer_spec.rb +14 -0
- data/spec/dummy/spec/helpers/app/layouts/flash_messages_spec.rb +18 -0
- data/spec/dummy/spec/helpers/app/layouts/navbar_spec.rb +19 -0
- data/spec/dummy/spec/helpers/app/question_viewer_spec.rb +16 -0
- data/spec/dummy/spec/support/apis/api_helper.rb +15 -0
- data/spec/dummy/spec/support/apis/shared_examples_a_json_controller.rb +196 -0
- data/spec/dummy/spec/support/templet/partial_test_helpers.rb +32 -0
- data/spec/dummy/spec/support/templet/shared_examples_a_viewer.rb +105 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/-6/-6-48LISBeQVJvpEXNgFstDrCriEFNmvje6XhidzlV4.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/-D/-DLE9y_1ICajcEaHcprHYBO8vjXpHySH_56FSb0SLOs.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/-Y/-YJ1ILDQvu3hOKkF0VR9K_z04e2-EVHglO0MAFS8gpQ.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/-_/-_7FgdEon9WttcnvoyQAysmonCHN7FxsrcuDa5OTUJQ.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/0u/0u-iWymOJvpggI1uY7Na3322xwcjNY7egB-czjV96m4.cache +2 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/0x/0xArd189AygdGItqWO0_5BfinFQjLZjwyVsAGWqOgKg.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/2S/2SfjLWkOp2BGM0OzwsshKpnXI8rlJFOV6ZJsIszRn6k.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/3h/3hFAACevvXtDja9zz3rMK6gA1MD1I7_puWyRRkV7sLk.cache +2 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/4o/4oNwzIrltWrfajciBz7JHd5RT5_XVv04L6NdaBGN794.cache +3 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/7F/7F3o6QQqoI0bDk6-A5qMN8LCZQALddlu23KiRWBxtWk.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Af/AfFBDeKpi4wSUc7rcjxfjPbEgV6GOGXTjeZhHrfDX48.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Bf/BfD6ZVgFq-kWDMMVb2EE5ZAKgsgn1VUR9oVxD0hHVMI.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Bo/Bogjbc_D5J-6_m5KEgeXt_GHc-IbUt1_FDWP4PHV0P8.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/DF/DF3HgsSD9LO1Bz8d3GJi_G6wBExmsnBJ6b1pvZEGE7w.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/DO/DO8Gqh32jK2GrO9uIlH7qvDkelVw0VM8CTSOUj6iUEo.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/GC/GCNwk_ABiY0z51bz8iC8tqLLWKhQwxW4-JLNKv-SRe0.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Gl/Gls_Zud1kxq7p08FGBfzalbaLMlLBl28bOYebh7Ljrg.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Gm/GmHHk4YNC0G2V_5gQZp0U6mKFPxGSgL7fwWI3_fajrk.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Gr/GreB3WHN8MyWMDFGNyqJJcxGblgo-5XepsEHvdJSQGI.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/HC/HCDOUd7-S45aJ_PjVAC_Vmjyud3i1aQv4cE3t9_Z3Dw.cache +2 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Hd/HdvsElcHSt7aKjG9jocgIQJEvBjBbeSZ8HntI1pc38o.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Iv/IvR5RxSTQkxfGWSoy5S2s7wO5u5qwCJ5mNAhqNJtJDY.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/JS/JSYyQZJzLNqpmVR--ZDUW6PY7_HflyFFHDAOLenxlP4.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Jx/JxJXzSistcpH4S_9CbGx_wyjVTaE77ZDDfOc4uTfvdM.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/MH/MHCZUSVJq62YPmcVVkfjp2B5uH_nDL7snLl4yqvlSJY.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/MY/MY5theanttko1gCnW9vKb0Z1GkJn8Ofk149HwOt0UAM.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Mn/MnGg5XDll2jo-E_CTC1htiNc0hOY6z80_bwGCvpYTXk.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Nt/NtYu5CjAvU5ZHxSOn6Q4LPukD3hBE-3vYe30d_uSBzM.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Nu/NuIepb7qomZzBDAJMUROsshKo8TJxdmFR4yOe64W58w.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/R7/R7ngeIqpdwSWkbjbxxzh6B-KczkWMcxYMIkj5inxrV8.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/S9/S9MhILnM64qd2M9Z92TrNMtw7VUWZxf3H367OO8rlhs.cache +2 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/SI/SIZUy2mtjUm_G1YIulRCovzgkCwV1eoR2NLiYcsR1Ws.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Sl/SlECThrSAExfICiFGVi-zu240BVDaUldaRs4qcj354U.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/St/St6dTA4niiCDLnnArKZV38uZNFf6MbEZ_jHGC-Upft0.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/T6/T6p-BnPmMCmpJdaqrjWmLMsBW8SNJpSW6w-Azc3XGVk.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Vs/VsZPCEai1GtOT-vHjxMS8kAP9ASG5i_2O_EP76uI7Qs.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Vv/Vv6dack32HV3tIZ_6F4BF8Mrrnb7wZEG4VlEKumQ6L0.cache +2 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Wp/WpV6mJwJX9dwIFJGLoJoa-gXNe1-ZHusE9SwvnWysa8.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Wy/Wya0wl0Q2nXYb5-bC5Fbo0sDZfKb3415AjtSjld7fQI.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/b7/b7j7TIOE1nnqvMku0QePWFrwCkaKkNpxkiWST6PAplo.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ck/ckDOh-FroVE8r1fwUNWmnRconIREuVdmkZEFkaP9KfU.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/eN/eNQPQP-9gB3xzxJBsG7soV6Ie0YZ3gxIS97PgYtZVT8.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/gb/gbUMPMF8S0OQVsFHyAjHpHVEg-3iZzTVIQZDmfq-ycE.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/if/ifyb5SlIS8vkACz_6P0uTOGijMB4C5TyFWmrMq3DYIg.cache +2 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/jg/jg-s5YLdnojCtHqzfDTsvcy6UHewDRl1X09qlGyvyag.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ko/koPyQus8Oqrx18bnLj-5nJrKvFf6FDDQbv2qEa7Bl7M.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/lG/lGRRazgrFErFx1PkfDlca6r-0MGQR40i0tq0Wgm2FNU.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/lS/lStvx9Beg2l4s8L-QdTSKuc5_qQPQAZPnIcRI7JkpPE.cache +2 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/lZ/lZIacHrJV5bDohEHsVOXDGIDrUH2h4YvwV9g-MWmh3k.cache +3 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/lq/lqM4-wfprvp5FEBp1pSm88Jwx-Vb2oJab2rjLtUcIyM.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/n_/n_xYqQYhwEMQknb3jFQnjlxxBE9TzMNHCdJ-bEyZFIw.cache +2 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/nx/nxTv3sKVUQZADJyM3dPaVmUA78MIsMLD_K279yN_GsI.cache +2 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ps/psGFyjvQcs8JpIV8BDeCqQfHaLYgIgSAi86n4RrFpFs.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/r1/r1IIabhuPhgB3n8V3ZMRN0SqIsXJ8bH0ABTRzHTG1SU.cache +2 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/vt/vtskp0QTt72oDQNM6mYZ8pCclh2HICHeYZ1QtDvC5xo.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/wi/win_v0ZNu-l7AoRx8w3ls1xcy0mUExLBVMCSr5oaJFc.cache +2 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/yo/yoggubxI12fIM1o5TtxUialrUN-LWOfRaV_tqc1HAC4.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/zH/zHnHpZP25wEHaF3mI_M9RGH1zeCApf6mwhLB3Lku1zs.cache +3 -0
- data/spec/dummy/tmp/development_secret.txt +1 -0
- data/spec/factories/answers.rb +10 -0
- data/spec/factories/categories.rb +5 -0
- data/spec/factories/questions.rb +8 -0
- data/spec/helpers/templet/forms/bs_form_errors_spec.rb +18 -0
- data/spec/helpers/templet/forms/bs_form_spec.rb +58 -0
- data/spec/helpers/templet/layout/html_rails_spec.rb +64 -0
- data/spec/helpers/templet/links/bs_link_set_collection_spec.rb +79 -0
- data/spec/helpers/templet/links/rest_link_procs_params_spec.rb +68 -0
- data/spec/helpers/templet/links/rest_link_procs_parents_spec.rb +78 -0
- data/spec/helpers/templet/links/rest_link_procs_spec.rb +140 -0
- data/spec/models/answer_spec.rb +9 -0
- data/spec/models/category_spec.rb +9 -0
- data/spec/models/question_spec.rb +9 -0
- data/spec/rails_helper.rb +61 -0
- data/spec/spec_helper.rb +108 -0
- data/spec/support/templet/model_parent_helpers.rb +36 -0
- data/spec/support/templet/partial_test_helpers.rb +32 -0
- data/spec/support/templet/rest_link_procs_assignments.rb +43 -0
- data/spec/support/templet/rest_link_procs_helpers.rb +15 -0
- metadata +470 -38
- data/.gitignore +0 -8
- data/.travis.yml +0 -5
- data/Gemfile +0 -6
- data/LICENSE.txt +0 -21
- data/bin/console +0 -14
- data/bin/setup +0 -8
- data/lib/generators/templet/core/USAGE +0 -23
- data/lib/generators/templet/core/core_generator.rb +0 -128
- data/lib/generators/templet/templates/core/app/panel/flash_messages.rb +0 -33
- data/lib/generators/templet/templates/core/app/panel/nav_args_option.rb +0 -30
- data/lib/generators/templet/templates/core/app/panel/show_parents_option.rb +0 -22
- data/lib/generators/templet/templates/core/app/panel/sidebar_links_option.rb +0 -24
- data/templet_rails.gemspec +0 -36
data/Rakefile
CHANGED
@@ -1,10 +1,24 @@
|
|
1
|
-
|
2
|
-
require
|
1
|
+
begin
|
2
|
+
require 'bundler/setup'
|
3
|
+
rescue LoadError
|
4
|
+
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
5
|
+
end
|
6
|
+
|
7
|
+
require 'rdoc/task'
|
3
8
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
9
|
+
RDoc::Task.new(:rdoc) do |rdoc|
|
10
|
+
rdoc.rdoc_dir = 'rdoc'
|
11
|
+
rdoc.title = 'TempletRails'
|
12
|
+
rdoc.options << '--line-numbers'
|
13
|
+
rdoc.rdoc_files.include('README.md')
|
14
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
8
15
|
end
|
9
16
|
|
10
|
-
|
17
|
+
APP_RAKEFILE = File.expand_path("spec/dummy/Rakefile", __dir__)
|
18
|
+
load 'rails/tasks/engine.rake'
|
19
|
+
|
20
|
+
load 'rails/tasks/statistics.rake'
|
21
|
+
|
22
|
+
require 'bundler/gem_tasks'
|
23
|
+
|
24
|
+
#task default: :rspec
|
@@ -0,0 +1,15 @@
|
|
1
|
+
// This is a manifest file that'll be compiled into application.js, which will include all the files
|
2
|
+
// listed below.
|
3
|
+
//
|
4
|
+
// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
|
5
|
+
// or any plugin's vendor/assets/javascripts directory can be referenced here using a relative path.
|
6
|
+
//
|
7
|
+
// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
|
8
|
+
// compiled file. JavaScript code in this file should be added after the last require_* statement.
|
9
|
+
//
|
10
|
+
// Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details
|
11
|
+
// about supported directives.
|
12
|
+
//
|
13
|
+
//= require rails-ujs
|
14
|
+
//= require activestorage
|
15
|
+
//= require_tree .
|
@@ -0,0 +1,15 @@
|
|
1
|
+
/*
|
2
|
+
* This is a manifest file that'll be compiled into application.css, which will include all the files
|
3
|
+
* listed below.
|
4
|
+
*
|
5
|
+
* Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
|
6
|
+
* or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path.
|
7
|
+
*
|
8
|
+
* You're free to add application-wide styles to this file and they'll appear at the bottom of the
|
9
|
+
* compiled file so the styles you add here take precedence over styles defined in any other CSS/SCSS
|
10
|
+
* files in this directory. Styles in this file should be added after the last require_* statement.
|
11
|
+
* It is generally better to create a new file per style scope.
|
12
|
+
*
|
13
|
+
*= require_tree .
|
14
|
+
*= require_self
|
15
|
+
*/
|
@@ -0,0 +1,12 @@
|
|
1
|
+
|
2
|
+
# Produces output for all JSON requests
|
3
|
+
module Templet::JsonRenderingHelpers
|
4
|
+
private
|
5
|
+
|
6
|
+
def json_for(model, status: :ok, in_error: false)
|
7
|
+
model, status = model.errors, :unprocessable_entity if in_error
|
8
|
+
|
9
|
+
{ json: model, status: status, location: "#{controller_name}/#{action_name}" }
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
@@ -0,0 +1,53 @@
|
|
1
|
+
|
2
|
+
# Helper methods used in controller actions to render views
|
3
|
+
module Templet::RenderingHelpers
|
4
|
+
include ActionView::Helpers::JavaScriptHelper
|
5
|
+
|
6
|
+
private
|
7
|
+
|
8
|
+
# Calls a Viewer class
|
9
|
+
def viewer(action, model_name=nil, **options)
|
10
|
+
options = viewer_options.merge(options)
|
11
|
+
|
12
|
+
model_name ||= options.delete(:model_name) || model_name()
|
13
|
+
|
14
|
+
Templet::ViewerCallString.new(action, model_name, **options)
|
15
|
+
end
|
16
|
+
|
17
|
+
# For JS requests
|
18
|
+
def viewer_to_s(*args, **options)
|
19
|
+
options.reverse_merge! wrapper: render_target
|
20
|
+
|
21
|
+
render_to_string inline viewer(*args, **options)
|
22
|
+
end
|
23
|
+
def js(html, target=nil)
|
24
|
+
target ||= "#panel-#{render_target}"
|
25
|
+
|
26
|
+
{ js: "$('#{target}').html('#{escape_javascript html}')" }
|
27
|
+
end
|
28
|
+
|
29
|
+
# Invokes the Rails-supplied render option
|
30
|
+
def inline(ruby_code, has_layout=false)
|
31
|
+
{ inline: "<%= (#{ruby_code}).html_safe %>", layout: has_layout }
|
32
|
+
end
|
33
|
+
|
34
|
+
# The following methods are defaults that can be overridden in the controller
|
35
|
+
|
36
|
+
# Used by the Viewer extensively, it points to the main instance variable,
|
37
|
+
# is shown in default headings, etc.
|
38
|
+
def model_name
|
39
|
+
controller_name.singularize
|
40
|
+
end
|
41
|
+
|
42
|
+
# Default options passed into the Viewer by each controller action
|
43
|
+
# You can specify the name of a controller's parent model here
|
44
|
+
def viewer_options
|
45
|
+
{ controller: params[:controller] }
|
46
|
+
end
|
47
|
+
|
48
|
+
# The HTML id (within the panel) into which JS (remote) output is inserted
|
49
|
+
def render_target
|
50
|
+
:outer
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
@@ -0,0 +1,144 @@
|
|
1
|
+
|
2
|
+
module Templet
|
3
|
+
# Constructs a string of Ruby that, when executed, returns a string of HTML.
|
4
|
+
#
|
5
|
+
# It calls a method, named by the given +action+ parameter, on an instance
|
6
|
+
# of the type: Templet::ViewerRest.
|
7
|
+
#
|
8
|
+
# The resultant code statement is executed within the view context
|
9
|
+
# i.e. as if it's called from the inside of an ERb partial.
|
10
|
+
#
|
11
|
+
# It takes this circuitous route to pass various items from the controller
|
12
|
+
# to the view e.g. instance variables, model names, link set controls.
|
13
|
+
class ViewerCallString
|
14
|
+
attr_accessor :action, :controller, :model_name, :parent,
|
15
|
+
:models, :use_model_name,
|
16
|
+
:grand_parent, :variables, :wrapper
|
17
|
+
|
18
|
+
attr_accessor :viewer_class
|
19
|
+
#
|
20
|
+
# +action+:: The REST action, i.e. the controller method name
|
21
|
+
#
|
22
|
+
# +controller+:: The name without the suffix 'Controller', but may be prefixed with a scope/namespace
|
23
|
+
#
|
24
|
+
# +model_name+:: The model name, mirroring the model's instance variable
|
25
|
+
#
|
26
|
+
# +parent+:: An actual instance of a model's dependent, i.e. the belongs_to
|
27
|
+
#
|
28
|
+
# +models+:: A list of models, used in the index action, it names the instance variable
|
29
|
+
#
|
30
|
+
# +use_model_name+:: If true, no instance variable of the model is defined, e.g. in index and new
|
31
|
+
#
|
32
|
+
# +use_base+:: If true, it will render the view using the superclass, Templet::ApplicationRestViewer
|
33
|
+
#
|
34
|
+
# +class_name+:: The name of the Viewer class
|
35
|
+
#
|
36
|
+
# +module_name+:: The name of the Viewer module
|
37
|
+
#
|
38
|
+
# +grand_parent+:: The name of the parent's parent, for 'Back' buttons
|
39
|
+
#
|
40
|
+
# +variables+:: A list of instance variables to be passed into the view (no @ prefix)
|
41
|
+
#
|
42
|
+
# +wrapper+:: For specifying an HTML id, i.e. the target of a JS request
|
43
|
+
#
|
44
|
+
def initialize(action, model_name, controller: nil,
|
45
|
+
parent: nil,
|
46
|
+
models: nil,
|
47
|
+
use_model_name: nil,
|
48
|
+
use_base: false,
|
49
|
+
class_name: nil,
|
50
|
+
module_name: nil,
|
51
|
+
grand_parent: nil,
|
52
|
+
variables: [],
|
53
|
+
wrapper: nil)
|
54
|
+
self.action = action
|
55
|
+
|
56
|
+
self.controller = controller
|
57
|
+
|
58
|
+
self.model_name = model_name
|
59
|
+
|
60
|
+
self.parent = parent
|
61
|
+
|
62
|
+
self.models = models
|
63
|
+
|
64
|
+
# Specify a model name as opposed to an instance in an instance variable
|
65
|
+
# It's because there is no model in the actions 'index' and 'new'
|
66
|
+
self.use_model_name = if use_model_name.nil?
|
67
|
+
models ? true : false
|
68
|
+
else
|
69
|
+
use_model_name
|
70
|
+
end
|
71
|
+
|
72
|
+
self.grand_parent = grand_parent
|
73
|
+
|
74
|
+
self.variables = variables
|
75
|
+
|
76
|
+
self.wrapper = wrapper
|
77
|
+
|
78
|
+
self.viewer_class = ViewerCallStringClass.new(controller, model_name,
|
79
|
+
use_base,
|
80
|
+
class_name, module_name)
|
81
|
+
end
|
82
|
+
|
83
|
+
def call(action=action())
|
84
|
+
"#{viewer_class}.new(#{args}#{opts}).#{action}"
|
85
|
+
end
|
86
|
+
|
87
|
+
alias to_s call
|
88
|
+
|
89
|
+
private
|
90
|
+
|
91
|
+
# Arguments
|
92
|
+
|
93
|
+
def args
|
94
|
+
"self" << model_arg << parent_arg
|
95
|
+
end
|
96
|
+
|
97
|
+
def model_arg
|
98
|
+
prefix = use_model_name ? ':' : '@'
|
99
|
+
|
100
|
+
to_arg(model_name, prefix)
|
101
|
+
end
|
102
|
+
|
103
|
+
def parent_arg
|
104
|
+
to_arg(parent, '@')
|
105
|
+
end
|
106
|
+
|
107
|
+
def to_arg(value_name, value_prefix='')
|
108
|
+
value_name ? ", #{value_prefix}#{value_name}" : ''
|
109
|
+
end
|
110
|
+
|
111
|
+
# Options
|
112
|
+
|
113
|
+
def opts
|
114
|
+
opts = controller_opt << models_opt << grand_parent_opt << wrapper_opt
|
115
|
+
|
116
|
+
variables.reduce(opts) {|acca, variable| acca << to_opt(variable) }
|
117
|
+
end
|
118
|
+
|
119
|
+
def controller_opt
|
120
|
+
controller ? to_opt("'#{controller}'", :controller, '') : ''
|
121
|
+
end
|
122
|
+
|
123
|
+
def models_opt
|
124
|
+
to_opt(models, :models, models.to_s.start_with?('@') ? '' : '@')
|
125
|
+
end
|
126
|
+
|
127
|
+
def grand_parent_opt
|
128
|
+
to_opt(grand_parent, :grand_parent)
|
129
|
+
end
|
130
|
+
|
131
|
+
def wrapper_opt
|
132
|
+
to_opt((wrapper == false ? :none : wrapper), :wrapper)
|
133
|
+
end
|
134
|
+
|
135
|
+
def to_opt(value_name, key_name=nil, value_prefix=nil)
|
136
|
+
value_prefix ||= key_name ? ':' : '@'
|
137
|
+
|
138
|
+
key_name ||= value_name
|
139
|
+
|
140
|
+
value_name ? ", #{key_name}: #{value_prefix}#{value_name}" : ''
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
@@ -0,0 +1,65 @@
|
|
1
|
+
|
2
|
+
module Templet
|
3
|
+
# Returns the name (as a string) of the Viewer class
|
4
|
+
# It's used internally by ViewerCallString
|
5
|
+
class ViewerCallStringClass < Struct.new(:controller, :model_name,
|
6
|
+
:use_base, :class_name,
|
7
|
+
:module_name)
|
8
|
+
APP_MODULE = 'App' # Base namespace of the application subclasses
|
9
|
+
|
10
|
+
VIEWER_CLASS_SUFFIX = "Viewer"
|
11
|
+
|
12
|
+
VIEWER_BASE_CLASS = APP_MODULE + '::Base' + VIEWER_CLASS_SUFFIX
|
13
|
+
|
14
|
+
def call
|
15
|
+
if use_base
|
16
|
+
VIEWER_BASE_CLASS
|
17
|
+
elsif String === class_name
|
18
|
+
class_name
|
19
|
+
else
|
20
|
+
subclass_name
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
alias to_s call
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
# Reverts to the base class if there is no Viewer class that is either
|
29
|
+
# explicitly given or is implicitly derived, e.g. from the controller's name
|
30
|
+
def subclass_name
|
31
|
+
subclass_name = application_subclass
|
32
|
+
|
33
|
+
if (subclass_name.constantize rescue false)
|
34
|
+
subclass_name
|
35
|
+
else
|
36
|
+
VIEWER_BASE_CLASS
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def application_subclass
|
41
|
+
APP_MODULE + controller_module +
|
42
|
+
(class_name || controller_name || model_name).to_s.classify +
|
43
|
+
VIEWER_CLASS_SUFFIX
|
44
|
+
end
|
45
|
+
|
46
|
+
def controller_name
|
47
|
+
if controller
|
48
|
+
controller.to_s.split('/').last
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def controller_module
|
53
|
+
if module_name
|
54
|
+
"#{module_name.to_s.classify}::"
|
55
|
+
elsif controller
|
56
|
+
controller.to_s.split('/')[0..-2].reduce('') do |acca, name|
|
57
|
+
acca << '::' << name.classify
|
58
|
+
end << '::'
|
59
|
+
else
|
60
|
+
'::'
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
@@ -0,0 +1,121 @@
|
|
1
|
+
|
2
|
+
# Used in controller actions to dispatch the HTML, JS & JSON formats
|
3
|
+
module Templet::ViewerResponders
|
4
|
+
include Templet::RenderingHelpers
|
5
|
+
|
6
|
+
include Templet::JsonRenderingHelpers
|
7
|
+
|
8
|
+
private
|
9
|
+
|
10
|
+
def respond_to_index(models_name=nil, models=nil, **options)
|
11
|
+
models_name ||= model_name.to_s.pluralize
|
12
|
+
|
13
|
+
respond_to do |format|
|
14
|
+
format.html do
|
15
|
+
render inline viewer(:index, **merge_models(options, models_name))
|
16
|
+
end
|
17
|
+
|
18
|
+
format.js do
|
19
|
+
render js viewer_to_s(:index, **merge_models(options, models_name))
|
20
|
+
end
|
21
|
+
|
22
|
+
format.json do
|
23
|
+
render json_for(models || instance_var(models_name))
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def respond_to_action(action, model=nil, **options)
|
29
|
+
respond_to do |format|
|
30
|
+
format.html { render inline viewer(action, **options) }
|
31
|
+
|
32
|
+
format.js { render js viewer_to_s(action, **options) }
|
33
|
+
|
34
|
+
format.json { render json_for(model || instance_var(model_name)) }
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def respond_to_show(*args)
|
39
|
+
respond_to_action :show, *args
|
40
|
+
end
|
41
|
+
def respond_to_new(*args)
|
42
|
+
respond_to_action :new, *args
|
43
|
+
end
|
44
|
+
def respond_to_edit(*args)
|
45
|
+
respond_to_action :edit, *args
|
46
|
+
end
|
47
|
+
|
48
|
+
def respond_to_save_success(model, redirect=model, status=nil,
|
49
|
+
notice=nil, **options)
|
50
|
+
status ||= model.id_previously_changed? ? :created : :ok
|
51
|
+
|
52
|
+
notice ||= default_notice(model)
|
53
|
+
|
54
|
+
respond_to do |format|
|
55
|
+
format.html do
|
56
|
+
redirect_to redirect, notice: notice
|
57
|
+
end
|
58
|
+
|
59
|
+
format.js do
|
60
|
+
set_message(notice)
|
61
|
+
|
62
|
+
render js viewer_to_s(:show, **options)
|
63
|
+
end
|
64
|
+
|
65
|
+
format.json { render json_for(model, status: status) }
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def respond_to_save_failure(action, model, **options)
|
70
|
+
respond_to do |format|
|
71
|
+
format.html { render inline viewer(action, **options) }
|
72
|
+
|
73
|
+
format.js { render js viewer_to_s(action, **options) }
|
74
|
+
|
75
|
+
format.json { render json_for(model, in_error: true) }
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
def respond_to_destroy(model, redirect=model, notice=nil)
|
80
|
+
notice ||= default_notice(model, "deleted")
|
81
|
+
|
82
|
+
respond_to do |format|
|
83
|
+
format.html { redirect_to redirect, notice: notice }
|
84
|
+
|
85
|
+
format.js do
|
86
|
+
set_message(notice)
|
87
|
+
|
88
|
+
index
|
89
|
+
end
|
90
|
+
|
91
|
+
format.json { head :no_content }
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
def merge_models(options, models_name)
|
96
|
+
options.merge models: to_iv(models_name)
|
97
|
+
end
|
98
|
+
|
99
|
+
def instance_var(name)
|
100
|
+
instance_variable_get to_iv(name)
|
101
|
+
end
|
102
|
+
|
103
|
+
def to_iv(name)
|
104
|
+
name.to_s.start_with?('@') ? name : "@#{name}".to_sym
|
105
|
+
end
|
106
|
+
|
107
|
+
def default_notice(model, suffix=nil, prefix=nil)
|
108
|
+
"#{prefix || notice_prefix} #{model} #{suffix || notice_suffix}."
|
109
|
+
end
|
110
|
+
def notice_prefix
|
111
|
+
model_name.to_s.capitalize
|
112
|
+
end
|
113
|
+
def notice_suffix
|
114
|
+
action_name + 'd'
|
115
|
+
end
|
116
|
+
|
117
|
+
def set_message(text, key=:notice)
|
118
|
+
flash.now[key] = text
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|