nitweb: use model filters
authorAlexandre Terrasa <alexandre@moz-code.org>
Thu, 19 Oct 2017 00:23:53 +0000 (20:23 -0400)
committerAlexandre Terrasa <alexandre@moz-code.org>
Fri, 10 Nov 2017 17:29:12 +0000 (12:29 -0500)
Also introduce new options to control filters

Signed-off-by: Alexandre Terrasa <alexandre@moz-code.org>

src/nitweb.nit
src/web/api_graph.nit
src/web/api_model.nit
src/web/web_base.nit

index 370e2a2..2b61ab7 100644 (file)
@@ -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)
index 13a2177..33ff7f8 100644 (file)
@@ -46,6 +46,8 @@ end
 class InheritanceGraph
        super ModelVisitor
 
+       autoinit center, view, filter
+
        # MEntity at the center of this graph
        var center: MEntity
 
index 8dafca9..b7c35c0 100644 (file)
@@ -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)
index 7e6250e..4aad814 100644 (file)
@@ -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`.