1 # This file is part of NIT ( http://www.nitlanguage.org ).
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
7 # http://www.apache.org/licenses/LICENSE-2.0
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
15 # Runs a webserver based on nitcorn that render things from model.
21 redef class ToolContext
23 # Path to app config file.
24 var opt_config
= new OptionString("Path to app config file", "--config")
26 # Host name to bind on (will overwrite the config one).
27 var opt_host
= new OptionString("Host to bind the server on", "--host")
29 # Port number to bind on (will overwrite the config one).
30 var opt_port
= new OptionInt("Port number to use", -1, "--port")
33 var opt_no_private
= new OptionBool("Do not show private entities", "--no-private")
36 var opt_no_fictive
= new OptionBool("Do not show fictive entities", "--no-fictive")
39 var opt_no_test
= new OptionBool("Do not show test related entities", "--no-test")
42 var opt_no_attribute
= new OptionBool("Do not show attributes", "--no-attribute")
45 var opt_no_empty_doc
= new OptionBool("Do not undocumented entities", "--no-empty-doc")
47 # Web rendering phase.
48 var webphase
: Phase = new NitwebPhase(self, null)
52 option_context
.add_option
(opt_config
, opt_host
, opt_port
, opt_no_private
,
53 opt_no_fictive
, opt_no_test
, opt_no_attribute
, opt_no_empty_doc
)
57 # Phase that builds the model and wait for http request to serve pages.
58 private class NitwebPhase
61 # Build the nitweb config from `toolcontext` options.
62 fun build_config
(toolcontext
: ToolContext, mainmodule
: MModule): NitwebConfig do
64 var model
= toolcontext
.modelbuilder
.model
66 var filter
= new ModelFilter(
67 if toolcontext
.opt_no_private
.value
then protected_visibility
else private_visibility
,
68 accept_fictive
= not toolcontext
.opt_no_fictive
.value
,
69 accept_empty_doc
= not toolcontext
.opt_no_empty_doc
.value
,
70 accept_test
= not toolcontext
.opt_no_test
.value
,
71 accept_attribute
= not toolcontext
.opt_no_attribute
.value
74 var catalog
= build_catalog
(toolcontext
.modelbuilder
, filter
)
76 var config
= new NitwebConfig(model
, mainmodule
, toolcontext
.modelbuilder
, filter
, catalog
)
77 var config_file
= toolcontext
.opt_config
.value
78 if config_file
== null then config
.default_config_file
= "nitweb.ini"
79 config
.parse_options
(args
)
80 var opt_host
= toolcontext
.opt_host
.value
81 if opt_host
!= null then config
.ini
["app.host"] = opt_host
82 var opt_port
= toolcontext
.opt_port
.value
83 if opt_port
>= 0 then config
.ini
["app.port"] = opt_port
.to_s
87 redef fun process_mainmodule
(mainmodule
, mmodules
)
89 var config
= build_config
(toolcontext
, mainmodule
)
90 config
.model
.index
# pre load model index
91 config
.model
.nitdoc_md_processor
= config
.md_processor
95 app
.use_before
("/*", new SessionInit)
96 app
.use_before
("/*", new RequestClock)
97 app
.use
("/api", new APIRouter(config
))
98 app
.use
("/login", new GithubLogin(config
.github_client_id
))
99 app
.use
("/oauth", new GithubOAuthCallBack(config
.github_client_id
, config
.github_client_secret
))
100 app
.use
("/logout", new GithubLogout)
101 app
.use
("/*", new StaticHandler(toolcontext
.share_dir
/ "nitweb", "index.html"))
102 app
.use_after
("/*", new PopLogger(info_level
))
104 app
.listen
(config
.app_host
, config
.app_port
)
109 # This method should be called at nitweb startup.
110 fun build_catalog
(modelbuilder
: ModelBuilder, filter
: nullable ModelFilter): Catalog do
111 var catalog
= new Catalog(modelbuilder
)
112 var mpackages
= modelbuilder
.model
.collect_mpackages
(filter
)
114 for p
in mpackages
do
117 modelbuilder
.scan_group
(g
)
119 catalog
.deps
.add_node
(p
)
120 for gg
in p
.mgroups
do for m
in gg
.mmodules
do
121 for im
in m
.in_importation
.direct_greaters
do
123 if ip
== null or ip
== p
then continue
124 catalog
.deps
.add_edge
(p
, ip
)
129 for mpackage
in mpackages
do
130 catalog
.package_page
(mpackage
)
131 catalog
.git_info
(mpackage
)
132 catalog
.mpackage_stats
(mpackage
)
140 var toolcontext
= new ToolContext
141 var tpl
= new Template
142 tpl
.add
"Usage: nitweb [OPTION]... <file.nit>...\n"
143 tpl
.add
"Run a webserver based on nitcorn that serves pages about model."
144 toolcontext
.tooldescription
= tpl
.write_to_string
147 toolcontext
.process_options
(args
)
148 var arguments
= toolcontext
.option_context
.rest
151 var model
= new Model
152 var mbuilder
= new ModelBuilder(model
, toolcontext
)
153 var mmodules
= mbuilder
.parse_full
(arguments
)
156 if mmodules
.is_empty
then return
158 toolcontext
.run_global_phases
(mmodules
)