2020 WorksheetInfo ,
2121 json_decode ,
2222)
23+ from pywikitools .pywikibot_io import save_page
2324from pywikitools .resourcesbot .modules .post_processing import LanguagePostProcessor
2425from pywikitools .resourcesbot .modules .write_summary import WriteSummary
2526
3334 "write_sidebar_messages" ,
3435]
3536
37+ SIMULATE_SKIP_MODULES : Final [frozenset [str ]] = frozenset (
38+ {"export_html" , "export_pdf" , "export_repository" }
39+ )
40+
3641
3742def load_module (module_name : str ) -> Callable :
3843 """Load the post-processing module from modules/ and return it
@@ -62,6 +67,7 @@ def __init__(
6267 limit_to_lang : Optional [str ] = None ,
6368 modules : list [str ] = AVAILABLE_MODULES ,
6469 rewrite : Optional [str ] = None ,
70+ simulate : bool = False ,
6571 ):
6672 """
6773 Args:
@@ -72,8 +78,13 @@ def __init__(
7278 limit processing to one language (string with a language code)
7379 modules:
7480 specify which post-processing modules should be executed
81+ simulate:
82+ dry-run: show pywikibot diffs, skip login, writes, and export modules
7583 """
84+ self ._simulate = simulate
7685 self .modules = modules
86+ if simulate :
87+ self .modules = [m for m in self .modules if m not in SIMULATE_SKIP_MODULES ]
7788 # read-only list of download file types
7889 self ._file_types : Final [List [str ]] = ["pdf" , "odt" , "odg" , "printPdf" ]
7990 self ._config = config
@@ -128,6 +139,18 @@ def __init__(
128139 self ._changelog : Dict [str , ChangeLog ] = {}
129140
130141 def run (self ):
142+ previous_simulate = pywikibot .config .simulate
143+ if self ._simulate :
144+ pywikibot .config .simulate = True
145+ self .logger .info (
146+ "Simulate mode: no MediaWiki writes, skipping export modules"
147+ )
148+ try :
149+ self ._run ()
150+ finally :
151+ pywikibot .config .simulate = previous_simulate
152+
153+ def _run (self ):
131154 if self ._read_from_cache :
132155 try :
133156 # List of languages to be read from cache
@@ -175,7 +198,9 @@ def run(self):
175198 # failed with a WARNING from pywikibot:
176199 # "No user is logged in on site 4training:en"-> better check and try
177200 # to log in if necessary
178- if not self .site .logged_in ():
201+ if self ._simulate :
202+ self .logger .info ("Simulate mode: skipping login" )
203+ elif not self .site .logged_in ():
179204 self .logger .info ("We're not logged in. Trying to log in..." )
180205 self .site .login ()
181206 if not self .site .logged_in ():
@@ -208,7 +233,10 @@ def run(self):
208233
209234 for selected_module in self .modules :
210235 module = load_module (selected_module )(
211- self .fortraininglib , self ._config , self .site
236+ self .fortraininglib ,
237+ self ._config ,
238+ self .site ,
239+ simulate = self ._simulate ,
212240 )
213241 for lang in self ._result :
214242 module .run (
@@ -222,7 +250,7 @@ def run(self):
222250
223251 # Now run all GlobalPostProcessors
224252 if not self ._limit_to_lang :
225- write_summary = WriteSummary (self .site )
253+ write_summary = WriteSummary (self .site , simulate = self . _simulate )
226254 write_summary .run (
227255 self ._result ,
228256 self ._changelog ,
@@ -457,8 +485,12 @@ def _sync_and_compare(self, language_info: LanguageInfo) -> ChangeLog:
457485 self .logger .warning (
458486 f"{ page .full_url ()} doesn't seem to exist yet. Creating..."
459487 )
460- page .text = encoded_json
461- page .save ("Created JSON data structure" )
488+ save_page (
489+ page ,
490+ encoded_json ,
491+ "Created JSON data structure" ,
492+ simulate = self ._simulate ,
493+ )
462494 rewrite_json = False
463495 else :
464496 # Load "old" data structure of this language (from previous resourcesbot run)
@@ -481,8 +513,12 @@ def _sync_and_compare(self, language_info: LanguageInfo) -> ChangeLog:
481513
482514 if rewrite_json :
483515 # Write the updated JSON structure
484- page .text = encoded_json
485- page .save ("Updated JSON data structure" )
516+ save_page (
517+ page ,
518+ encoded_json ,
519+ "Updated JSON data structure" ,
520+ simulate = self ._simulate ,
521+ )
486522 self .logger .info (f"Updated 4training:{ lang } .json" )
487523
488524 return changes
@@ -510,8 +546,9 @@ def _save_languages_list(self):
510546 # TODO compare language_list and json.loads(previous_json) to find out if a new
511547 # language was added
512548 if previous_json != encoded_json :
513- page .text = encoded_json
514- page .save ("Updated list of languages" )
549+ save_page (
550+ page , encoded_json , "Updated list of languages" , simulate = self ._simulate
551+ )
515552 self .logger .info ("Updated 4training:languages.json" )
516553
517554 def _save_number_of_languages (self ):
@@ -546,8 +583,12 @@ def _save_number_of_languages(self):
546583
547584 if previous_number_of_languages != number_of_languages :
548585 try :
549- page .text = number_of_languages
550- page .save ("Updated number of languages" )
586+ save_page (
587+ page ,
588+ str (number_of_languages ),
589+ "Updated number of languages" ,
590+ simulate = self ._simulate ,
591+ )
551592 self .logger .info (
552593 f"Updated MediaWiki:Numberoflanguages to { number_of_languages } "
553594 )
0 commit comments