From eb13f6edf106241540eed9aa8c14fce31462d3b7 Mon Sep 17 00:00:00 2001 From: Alexandre Terrasa Date: Wed, 18 Oct 2017 20:23:53 -0400 Subject: [PATCH] nitweb: use model filters Also introduce new options to control filters Signed-off-by: Alexandre Terrasa --- src/nitweb.nit | 36 +++++++++++++++++++++++++++++++----- src/web/api_graph.nit | 2 ++ src/web/api_model.nit | 13 ++++++++++++- src/web/web_base.nit | 19 ++++++------------- 4 files changed, 51 insertions(+), 19 deletions(-) diff --git a/src/nitweb.nit b/src/nitweb.nit index 370e2a2..2b61ab7 100644 --- a/src/nitweb.nit +++ b/src/nitweb.nit @@ -30,12 +30,28 @@ redef class ToolContext # Port number to bind on (will overwrite the config one). var opt_port = new OptionInt("Port number to use", -1, "--port") + # --no-private + var opt_no_private = new OptionBool("Do not show private entities", "--no-private") + + # --no-fictive + var opt_no_fictive = new OptionBool("Do not show fictive entities", "--no-fictive") + + # --no-test + var opt_no_test = new OptionBool("Do not show test related entities", "--no-test") + + # --no-attribute + var opt_no_attribute = new OptionBool("Do not show attributes", "--no-attribute") + + # --no-empty-doc + var opt_no_empty_doc = new OptionBool("Do not undocumented entities", "--no-empty-doc") + # Web rendering phase. var webphase: Phase = new NitwebPhase(self, null) init do super - option_context.add_option(opt_config, opt_host, opt_port) + option_context.add_option(opt_config, opt_host, opt_port, opt_no_private, + opt_no_fictive, opt_no_test, opt_no_attribute, opt_no_empty_doc) end end @@ -45,10 +61,20 @@ private class NitwebPhase # Build the nitweb config from `toolcontext` options. fun build_config(toolcontext: ToolContext, mainmodule: MModule): NitwebConfig do - var config = new NitwebConfig( - toolcontext.modelbuilder.model, - mainmodule, - toolcontext.modelbuilder) + + var model = toolcontext.modelbuilder.model + + var filter = new ModelFilter( + if toolcontext.opt_no_private.value then protected_visibility else private_visibility, + accept_fictive = not toolcontext.opt_no_fictive.value, + accept_empty_doc = not toolcontext.opt_no_empty_doc.value, + accept_test = not toolcontext.opt_no_test.value, + accept_attribute = not toolcontext.opt_no_attribute.value + ) + + var view = new ModelView(model, mainmodule, filter) + + var config = new NitwebConfig(model, mainmodule, toolcontext.modelbuilder, view) var config_file = toolcontext.opt_config.value if config_file == null then config.default_config_file = "nitweb.ini" config.parse_options(args) diff --git a/src/web/api_graph.nit b/src/web/api_graph.nit index 13a2177..33ff7f8 100644 --- a/src/web/api_graph.nit +++ b/src/web/api_graph.nit @@ -46,6 +46,8 @@ end class InheritanceGraph super ModelVisitor + autoinit center, view, filter + # MEntity at the center of this graph var center: MEntity diff --git a/src/web/api_model.nit b/src/web/api_model.nit index 8dafca9..b7c35c0 100644 --- a/src/web/api_model.nit +++ b/src/web/api_model.nit @@ -70,10 +70,19 @@ class APIList return mentities end + # Filter mentities based on the config view filters + fun filter_mentities(req: HttpRequest, mentities: Array[MEntity]): Array[MEntity] do + var res = new Array[MEntity] + for mentity in mentities do + if config.view.filter.accept_mentity(mentity) then res.add mentity + end + return res + end + # Sort mentities by lexicographic order # # TODO choose order from request - fun sort_mentities(req: HttpRequest, mentities: Array[MEntity]) : Array[MEntity] do + fun sort_mentities(req: HttpRequest, mentities: Array[MEntity]): Array[MEntity] do var sorted = mentities.to_a var sorter = new MEntityNameSorter sorter.sort(sorted) @@ -135,6 +144,7 @@ class APIRandom redef fun get(req, res) do var mentities = list_mentities(req) + mentities = filter_mentities(req, mentities) mentities = randomize_mentities(req, mentities) mentities = limit_mentities(req, mentities) res.json new JsonArray.from(mentities) @@ -235,6 +245,7 @@ class APIEntityDefs res.api_error(404, "No definition list for mentity `{mentity.full_name}`") return end + mentities = filter_mentities(req, mentities) mentities = sort_mentities(req, mentities) mentities = limit_mentities(req, mentities) res.json new JsonArray.from(mentities) diff --git a/src/web/web_base.nit b/src/web/web_base.nit index 7e6250e..4aad814 100644 --- a/src/web/web_base.nit +++ b/src/web/web_base.nit @@ -38,18 +38,8 @@ class NitwebConfig # Modelbuilder used to access sources. var modelbuilder: ModelBuilder - # The JSON API does not filter anything by default. - # - # So we can cache the model view. - var view: ModelView is lazy do - var view = new ModelView(model, mainmodule) - view.min_visibility = private_visibility - view.include_fictive = true - view.include_empty_doc = true - view.include_attribute = true - view.include_test = true - return view - end + # ModelView used to access model. + var view: ModelView end # Specific handler for the nitweb API. @@ -62,7 +52,10 @@ abstract class APIHandler # Find the MEntity ` with `full_name`. fun find_mentity(model: ModelView, full_name: nullable String): nullable MEntity do if full_name == null then return null - return model.mentity_by_full_name(full_name.from_percent_encoding) + var mentity = model.mentity_by_full_name(full_name.from_percent_encoding) + if mentity == null then return null + if config.view.accept_mentity(mentity) then return mentity + return null end # Try to load the mentity from uri with `/:id`. -- 1.7.9.5