lina 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +33 -14
- data/app/assets/javascripts/lina/abn_tree_directive.js +2 -2
- data/app/assets/javascripts/lina/apidoc_controller.js +0 -15
- data/app/assets/javascripts/lina/json_parse_directive.js.erb +119 -0
- data/app/assets/javascripts/templates/lina/schema.html +83 -0
- data/app/assets/stylesheets/lina/{apidoc.css.scss → apidoc.scss} +47 -4
- data/app/views/lina/apidoc/index.html.erb +11 -50
- data/lib/generators/lina/api/USAGE +16 -0
- data/lib/generators/lina/api/api_generator.rb +60 -0
- data/lib/generators/{templates → lina/api/templates}/controller.rb +1 -1
- data/lib/generators/lina/{install_generator.rb → install/install_generator.rb} +3 -1
- data/lib/generators/{templates → lina/install/templates}/lina.rb +0 -0
- data/lib/generators/lina/view/templates/view.json.jbuilder +2 -0
- data/lib/generators/lina/view/view_generator.rb +17 -0
- data/lib/lina/error.rb +6 -0
- data/lib/lina/schema.rb +11 -1
- data/lib/lina/version.rb +1 -1
- data/test/controllers/lina/schema_controller_test.rb +29 -4
- data/test/dummy/app/controllers/arrays_controller.rb +133 -0
- data/test/dummy/app/controllers/desks_controller.rb +20 -0
- data/test/dummy/app/controllers/posts_controller.rb +2 -0
- data/test/dummy/config/routes.rb +15 -1
- data/test/dummy/log/development.log +12346 -0
- data/test/dummy/log/test.log +6415 -0
- data/test/dummy/test/controllers/arrays_controller_test.rb +14 -0
- data/test/dummy/test/controllers/desks_controller_test.rb +5 -1
- data/test/dummy/tmp/cache/assets/development/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_alerts.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_badges.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_breadcrumbs.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_button-groups.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_buttons.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_carousel.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_close.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_code.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_component-animations.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_dropdowns.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_forms.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_glyphicons.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_grid.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_input-groups.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_jumbotron.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_labels.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_list-group.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_media.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_mixins.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_modals.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_navbar.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_navs.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_normalize.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_pager.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_pagination.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_panels.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_popovers.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_print.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_progress-bars.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_responsive-embed.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_responsive-utilities.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_scaffolding.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_tables.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_thumbnails.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_tooltip.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_type.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_utilities.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_variables.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_wells.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/31f62b379790380fb7c14342e6a18bd5f1f962b5/apidoc.css.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/31f62b379790380fb7c14342e6a18bd5f1f962b5/apidoc.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/53a32fd0cf48f407b2d4f9ed7db422c6981fc426/_bootstrap-sprockets.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/53a32fd0cf48f407b2d4f9ed7db422c6981fc426/_bootstrap.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/59128e3c9d0de44abe4a6b4e668b47538a90769b/abn_tree.cssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/59128e3c9d0de44abe4a6b4e668b47538a90769b/apidoc.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/59128e3c9d0de44abe4a6b4e668b47538a90769b/application.css.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/76cdb9703e11b00861473eddaceac644b134d566/_alerts.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/76cdb9703e11b00861473eddaceac644b134d566/_background-variant.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/76cdb9703e11b00861473eddaceac644b134d566/_border-radius.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/76cdb9703e11b00861473eddaceac644b134d566/_buttons.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/76cdb9703e11b00861473eddaceac644b134d566/_center-block.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/76cdb9703e11b00861473eddaceac644b134d566/_clearfix.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/76cdb9703e11b00861473eddaceac644b134d566/_forms.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/76cdb9703e11b00861473eddaceac644b134d566/_gradients.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/76cdb9703e11b00861473eddaceac644b134d566/_grid-framework.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/76cdb9703e11b00861473eddaceac644b134d566/_grid.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/76cdb9703e11b00861473eddaceac644b134d566/_hide-text.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/76cdb9703e11b00861473eddaceac644b134d566/_image.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/76cdb9703e11b00861473eddaceac644b134d566/_labels.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/76cdb9703e11b00861473eddaceac644b134d566/_list-group.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/76cdb9703e11b00861473eddaceac644b134d566/_nav-divider.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/76cdb9703e11b00861473eddaceac644b134d566/_nav-vertical-align.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/76cdb9703e11b00861473eddaceac644b134d566/_opacity.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/76cdb9703e11b00861473eddaceac644b134d566/_pagination.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/76cdb9703e11b00861473eddaceac644b134d566/_panels.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/76cdb9703e11b00861473eddaceac644b134d566/_progress-bar.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/76cdb9703e11b00861473eddaceac644b134d566/_reset-filter.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/76cdb9703e11b00861473eddaceac644b134d566/_resize.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/76cdb9703e11b00861473eddaceac644b134d566/_responsive-visibility.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/76cdb9703e11b00861473eddaceac644b134d566/_size.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/76cdb9703e11b00861473eddaceac644b134d566/_tab-focus.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/76cdb9703e11b00861473eddaceac644b134d566/_table-row.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/76cdb9703e11b00861473eddaceac644b134d566/_text-emphasis.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/76cdb9703e11b00861473eddaceac644b134d566/_text-overflow.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sass/76cdb9703e11b00861473eddaceac644b134d566/_vendor-prefixes.scssc +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/00c0697c7f3d2183c5054b6d38c61f85 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/025d3a514dee2fa6c61e1a8ddf8a811d +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/02a3514578e42443fe85977b2fa33999 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/04611c51cd5b7bf26e6244fa19a5bfbd +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/0b7428701b735623bbe7e6ff4342e7d6 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/1577d2d6ed493aa41d8a0f599887e3ef +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/3251c44fa643b7b625c6c05cb11eeca4 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/33d68f21fb49b60aed8ccf2fc84a8588 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/37174a1556289cff8371d738701222ad +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/3778e1b875202b71d8638dd8123c5f89 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/56215ed95a30ca742697e6460294e93a +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/60da8e2105fc458c2af620764edd5dbf +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/76933b790c46e6a92d7cd635de614eaf +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/816bfd11725a6e3a206bfed45256be5a +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/86a50a0819617ecca8256b7ae7cc96af +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/a4dee2e02e8ce21babef0bbc5c84923e +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/adc20d6f5970149f252754b46e2217df +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/af31938f2dc1a756d4b68c68f0c90955 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/be482a8ab680e404d9e36ad99f5d9ca2 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/c1a8fdbd07c6b685d2ac56f87b47138d +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/f4e4f7b077370875d66bd890b0ba36d3 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/f5f15562a56635717efb1b395c3de2a6 +0 -0
- data/test/dummy/tmp/cache/assets/development/sprockets/f794aa494de85bff62b026a35b9194f9 +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_alerts.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_badges.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_breadcrumbs.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_button-groups.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_buttons.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_carousel.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_close.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_code.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_component-animations.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_dropdowns.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_forms.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_glyphicons.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_grid.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_input-groups.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_jumbotron.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_labels.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_list-group.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_media.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_mixins.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_modals.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_navbar.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_navs.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_normalize.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_pager.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_pagination.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_panels.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_popovers.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_print.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_progress-bars.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_responsive-embed.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_responsive-utilities.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_scaffolding.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_tables.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_thumbnails.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_tooltip.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_type.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_utilities.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_variables.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/15ab9d99cac4b7465a7d6d51c18f3078c1f2a81f/_wells.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/53a32fd0cf48f407b2d4f9ed7db422c6981fc426/_bootstrap-sprockets.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/53a32fd0cf48f407b2d4f9ed7db422c6981fc426/_bootstrap.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/59128e3c9d0de44abe4a6b4e668b47538a90769b/abn_tree.cssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/59128e3c9d0de44abe4a6b4e668b47538a90769b/apidoc.css.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/59128e3c9d0de44abe4a6b4e668b47538a90769b/apidoc.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/59128e3c9d0de44abe4a6b4e668b47538a90769b/application.css.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/76cdb9703e11b00861473eddaceac644b134d566/_alerts.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/76cdb9703e11b00861473eddaceac644b134d566/_background-variant.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/76cdb9703e11b00861473eddaceac644b134d566/_border-radius.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/76cdb9703e11b00861473eddaceac644b134d566/_buttons.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/76cdb9703e11b00861473eddaceac644b134d566/_center-block.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/76cdb9703e11b00861473eddaceac644b134d566/_clearfix.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/76cdb9703e11b00861473eddaceac644b134d566/_forms.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/76cdb9703e11b00861473eddaceac644b134d566/_gradients.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/76cdb9703e11b00861473eddaceac644b134d566/_grid-framework.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/76cdb9703e11b00861473eddaceac644b134d566/_grid.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/76cdb9703e11b00861473eddaceac644b134d566/_hide-text.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/76cdb9703e11b00861473eddaceac644b134d566/_image.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/76cdb9703e11b00861473eddaceac644b134d566/_labels.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/76cdb9703e11b00861473eddaceac644b134d566/_list-group.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/76cdb9703e11b00861473eddaceac644b134d566/_nav-divider.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/76cdb9703e11b00861473eddaceac644b134d566/_nav-vertical-align.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/76cdb9703e11b00861473eddaceac644b134d566/_opacity.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/76cdb9703e11b00861473eddaceac644b134d566/_pagination.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/76cdb9703e11b00861473eddaceac644b134d566/_panels.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/76cdb9703e11b00861473eddaceac644b134d566/_progress-bar.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/76cdb9703e11b00861473eddaceac644b134d566/_reset-filter.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/76cdb9703e11b00861473eddaceac644b134d566/_resize.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/76cdb9703e11b00861473eddaceac644b134d566/_responsive-visibility.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/76cdb9703e11b00861473eddaceac644b134d566/_size.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/76cdb9703e11b00861473eddaceac644b134d566/_tab-focus.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/76cdb9703e11b00861473eddaceac644b134d566/_table-row.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/76cdb9703e11b00861473eddaceac644b134d566/_text-emphasis.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/76cdb9703e11b00861473eddaceac644b134d566/_text-overflow.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sass/76cdb9703e11b00861473eddaceac644b134d566/_vendor-prefixes.scssc +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/04611c51cd5b7bf26e6244fa19a5bfbd +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/0b7428701b735623bbe7e6ff4342e7d6 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/1577d2d6ed493aa41d8a0f599887e3ef +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/3251c44fa643b7b625c6c05cb11eeca4 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/33d68f21fb49b60aed8ccf2fc84a8588 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/37174a1556289cff8371d738701222ad +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/3778e1b875202b71d8638dd8123c5f89 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/76933b790c46e6a92d7cd635de614eaf +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/816bfd11725a6e3a206bfed45256be5a +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/86a50a0819617ecca8256b7ae7cc96af +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/a4dee2e02e8ce21babef0bbc5c84923e +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/be482a8ab680e404d9e36ad99f5d9ca2 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/c1a8fdbd07c6b685d2ac56f87b47138d +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/f4e4f7b077370875d66bd890b0ba36d3 +0 -0
- data/test/dummy/tmp/cache/assets/test/sprockets/f794aa494de85bff62b026a35b9194f9 +0 -0
- data/test/dummy/tmp/pids/server.pid +1 -1
- data/test/lib/generators/lina/lina/api_generator_test.rb +16 -0
- data/test/lib/generators/lina/lina/view_generator_test.rb +16 -0
- metadata +351 -10
- data/lib/generators/lina/api_generator.rb +0 -59
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 42f21ae8ee02bcd29bc7d4b5fcf92f00473db66f
|
4
|
+
data.tar.gz: 524f10fe12b14452afcdaa4e3ee75e94ebe77c56
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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 开发框架,
|
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
|
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`
|
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
|
-
|
82
|
+
你可以使用 Lina API 生成器 `rails g lina:api posts index show` 来快速生成代码.
|
71
83
|
|
72
|
-
`Lina`
|
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`, 请到这里查看更多写法: [
|
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
|
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
|
-
|
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:
|
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
|
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="
|
1
|
+
<div class="apidoc-page" ng-controller='ApidocController' ng-init="setData('<%= lina.data_path %>')">
|
2
2
|
|
3
|
-
<div class="
|
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="
|
7
|
+
<div class="api-contents ng-cloak">
|
8
8
|
<ul class='list-unstyled'>
|
9
|
-
<li ng-repeat='api in currentApi'>
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
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
|
-
|
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
|
-
|
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("
|
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
|
File without changes
|