@@ -104,33 +104,36 @@ class BuildEnvironment(object):
104
104
# --------- ENVIRONMENT PERSISTENCE ----------------------------------------
105
105
106
106
@staticmethod
107
- def load (f , srcdir = None , config = None ):
108
- # type: (IO, unicode, Config ) -> BuildEnvironment
107
+ def load (f , app = None ):
108
+ # type: (IO, Sphinx ) -> BuildEnvironment
109
109
env = pickle .load (f )
110
110
if env .version != ENV_VERSION :
111
111
raise IOError ('build environment version not current' )
112
- if srcdir and env .srcdir != srcdir :
113
- raise IOError ('source directory has changed' )
114
- if config :
115
- env .config .values = config .values
112
+ if app :
113
+ env .app = app
114
+ env .config .values = app .config .values
115
+ if env .srcdir != app .srcdir :
116
+ raise IOError ('source directory has changed' )
116
117
return env
117
118
118
119
@classmethod
119
- def loads (cls , string , srcdir = None , config = None ):
120
- # type: (unicode, unicode, Config ) -> BuildEnvironment
120
+ def loads (cls , string , app = None ):
121
+ # type: (unicode, Sphinx ) -> BuildEnvironment
121
122
io = StringIO (string )
122
- return cls .load (io )
123
+ return cls .load (io , app )
123
124
124
125
@classmethod
125
- def frompickle (cls , srcdir , config , filename ):
126
- # type: (unicode, Config, unicode ) -> BuildEnvironment
126
+ def frompickle (cls , filename , app ):
127
+ # type: (unicode, Sphinx ) -> BuildEnvironment
127
128
with open (filename , 'rb' ) as f :
128
- return cls .load (f , srcdir , config )
129
+ return cls .load (f , app )
129
130
130
131
@staticmethod
131
132
def dump (env , f ):
132
133
# type: (BuildEnvironment, IO) -> None
133
134
# remove unpicklable attributes
135
+ app = env .app
136
+ del env .app
134
137
values = env .config .values
135
138
del env .config .values
136
139
domains = env .domains
@@ -146,6 +149,7 @@ def dump(env, f):
146
149
# reset attributes
147
150
env .domains = domains
148
151
env .config .values = values
152
+ env .app = app
149
153
150
154
@classmethod
151
155
def dumps (cls , env ):
@@ -161,19 +165,17 @@ def topickle(self, filename):
161
165
162
166
# --------- ENVIRONMENT INITIALIZATION -------------------------------------
163
167
164
- def __init__ (self , srcdir , doctreedir , config ):
165
- # type: (unicode, unicode, Config) -> None
166
- self .doctreedir = doctreedir
167
- self .srcdir = srcdir # type: unicode
168
- self .config = config # type: Config
168
+ def __init__ (self , app ):
169
+ # type: (Sphinx) -> None
170
+ self .app = app
171
+ self .doctreedir = app .doctreedir
172
+ self .srcdir = app .srcdir
173
+ self .config = app .config
169
174
170
175
# the method of doctree versioning; see set_versioning_method
171
176
self .versioning_condition = None # type: Union[bool, Callable]
172
177
self .versioning_compare = None # type: bool
173
178
174
- # the application object; only set while update() runs
175
- self .app = None # type: Sphinx
176
-
177
179
# all the registered domains, set by the application
178
180
self .domains = {}
179
181
@@ -490,8 +492,8 @@ def get_outdated_files(self, config_changed):
490
492
491
493
return added , changed , removed
492
494
493
- def update (self , config , srcdir , doctreedir , app ):
494
- # type: (Config, unicode, unicode, Sphinx ) -> List[unicode]
495
+ def update (self , config , srcdir , doctreedir ):
496
+ # type: (Config, unicode, unicode) -> List[unicode]
495
497
"""(Re-)read all files new or changed since last update.
496
498
497
499
Store all environment docnames in the canonical format (ie using SEP as
@@ -519,7 +521,7 @@ def update(self, config, srcdir, doctreedir, app):
519
521
# the source and doctree directories may have been relocated
520
522
self .srcdir = srcdir
521
523
self .doctreedir = doctreedir
522
- self .find_files (config , app .buildername )
524
+ self .find_files (config , self . app .buildername )
523
525
self .config = config
524
526
525
527
# this cache also needs to be updated every time
@@ -530,7 +532,7 @@ def update(self, config, srcdir, doctreedir, app):
530
532
added , changed , removed = self .get_outdated_files (config_changed )
531
533
532
534
# allow user intervention as well
533
- for docs in app .emit ('env-get-outdated' , self , added , changed , removed ):
535
+ for docs in self . app .emit ('env-get-outdated' , self , added , changed , removed ):
534
536
changed .update (set (docs ) & self .found_docs )
535
537
536
538
# if files were added or removed, all documents with globbed toctrees
@@ -543,23 +545,21 @@ def update(self, config, srcdir, doctreedir, app):
543
545
len (removed ))
544
546
logger .info (msg )
545
547
546
- self .app = app
547
-
548
548
# clear all files no longer present
549
549
for docname in removed :
550
- app .emit ('env-purge-doc' , self , docname )
550
+ self . app .emit ('env-purge-doc' , self , docname )
551
551
self .clear_doc (docname )
552
552
553
553
# read all new and changed files
554
554
docnames = sorted (added | changed )
555
555
# allow changing and reordering the list of docs to read
556
- app .emit ('env-before-read-docs' , self , docnames )
556
+ self . app .emit ('env-before-read-docs' , self , docnames )
557
557
558
558
# check if we should do parallel or serial read
559
559
par_ok = False
560
- if parallel_available and len (docnames ) > 5 and app .parallel > 1 :
560
+ if parallel_available and len (docnames ) > 5 and self . app .parallel > 1 :
561
561
par_ok = True
562
- for extname , md in app ._extension_metadata .items ():
562
+ for extname , md in self . app ._extension_metadata .items ():
563
563
ext_ok = md .get ('parallel_read_safe' )
564
564
if ext_ok :
565
565
continue
@@ -575,17 +575,15 @@ def update(self, config, srcdir, doctreedir, app):
575
575
par_ok = False
576
576
break
577
577
if par_ok :
578
- self ._read_parallel (docnames , app , nproc = app .parallel )
578
+ self ._read_parallel (docnames , self . app , nproc = self . app .parallel )
579
579
else :
580
- self ._read_serial (docnames , app )
580
+ self ._read_serial (docnames , self . app )
581
581
582
582
if config .master_doc not in self .all_docs :
583
583
raise SphinxError ('master file %s not found' %
584
584
self .doc2path (config .master_doc ))
585
585
586
- self .app = None
587
-
588
- for retval in app .emit ('env-updated' , self ):
586
+ for retval in self .app .emit ('env-updated' , self ):
589
587
if retval is not None :
590
588
docnames .extend (retval )
591
589
@@ -608,20 +606,17 @@ def _read_parallel(self, docnames, app, nproc):
608
606
self .clear_doc (docname )
609
607
610
608
def read_process (docs ):
611
- # type: (List[unicode]) -> BuildEnvironment
609
+ # type: (List[unicode]) -> unicode
612
610
self .app = app
613
611
for docname in docs :
614
612
self .read_doc (docname , app )
615
613
# allow pickling self to send it back
616
- del self .app
617
- del self .domains
618
- del self .config .values
619
- del self .config
620
- return self
614
+ return BuildEnvironment .dumps (self )
621
615
622
616
def merge (docs , otherenv ):
623
- # type: (List[unicode], BuildEnvironment) -> None
624
- self .merge_info_from (docs , otherenv , app )
617
+ # type: (List[unicode], unicode) -> None
618
+ env = BuildEnvironment .loads (otherenv )
619
+ self .merge_info_from (docs , env , app )
625
620
626
621
tasks = ParallelTasks (nproc )
627
622
chunks = make_chunks (docnames , nproc )
0 commit comments