1414# You should have received a copy of the GNU Affero General Public License
1515# along with this program. If not, see <https://www.gnu.org/licenses/>.
1616
17+ import os
1718import sys
19+ import json
1820import asyncio
1921import traceback
2022import logging
2325from watchdog .observers import Observer
2426from watchdog .events import FileSystemEventHandler
2527from .loader import load_node
26- from .broker import BrokerClient
27- from solid_node .core .refactor import RefactorRequest
2828from solid_node .node .base import StlRenderStart
2929
3030
3131logger = logging .getLogger ('core.builder' )
3232
3333
34+ def get_build_dir ():
35+ """Get the base build directory from environment or default"""
36+ return os .environ .get ('SOLID_BUILD_DIR' , '_build' )
37+
38+
39+ def get_errors_file ():
40+ """Get the path to the errors.json file in the build directory"""
41+ return os .path .join (get_build_dir (), 'errors.json' )
42+
43+
44+ def clear_errors ():
45+ """Clear any existing error file"""
46+ errors_file = get_errors_file ()
47+ if os .path .exists (errors_file ):
48+ os .remove (errors_file )
49+
50+
51+ def write_error (error_message ):
52+ """Write build error to file for WebViewer to read"""
53+ errors_file = get_errors_file ()
54+ os .makedirs (os .path .dirname (errors_file ), exist_ok = True )
55+ with open (errors_file , 'w' ) as f :
56+ json .dump ({
57+ 'error' : error_message ,
58+ 'tstamp' : time .time (),
59+ }, f )
60+
61+
3462class Builder (FileSystemEventHandler ):
3563 """Monitors .py files. On any change, generate STLs and exit"""
3664 def __init__ (self , path ):
@@ -48,7 +76,6 @@ def start(self):
4876
4977 async def _start (self ):
5078 logger .info ('START' )
51- self .broker = BrokerClient ()
5279
5380 try :
5481 self .node = load_node (self .path )
@@ -58,10 +85,11 @@ async def _start(self):
5885 await self .report_error (error_message )
5986 sys .exit (0 )
6087
88+ # Clear any previous errors on successful load
89+ clear_errors ()
90+
6191 try :
6292 self .node .assemble ()
63- except RefactorRequest as request :
64- await self .execute_refactor (request )
6593 except Exception as e :
6694 error_message = traceback .format_exc ()
6795 logger .error (error_message )
@@ -75,8 +103,6 @@ async def _start(self):
75103
76104 try :
77105 await self .generate_stl ()
78- except RefactorRequest as request :
79- await self .execute_refactor (request )
80106 except Exception as e :
81107 error_message = traceback .format_exc ()
82108 logger .error (error_message )
@@ -100,10 +126,7 @@ async def generate_stl(self):
100126 sys .exit (0 )
101127
102128 async def report_error (self , error_message ):
103- await self .broker .put ('build_error' , {
104- 'error' : error_message ,
105- 'tstamp' : time .time (),
106- })
129+ write_error (error_message )
107130 await self .file_changed
108131 sys .exit (0 )
109132
@@ -114,15 +137,3 @@ def on_modified(self, event):
114137 return
115138 logging .info (f'{ event .src_path } changed, reloading' )
116139 self .loop .call_soon_threadsafe (self .file_changed .set_result , True )
117-
118- async def execute_refactor (self , request ):
119- """Experimental: refactor requests are special exceptions injected in scope
120- that trigger the builder to refactor nodes. Make sure you commit your changes
121- before using it."""
122- try :
123- request .refactor ()
124- sys .exit (0 )
125- except Exception as e :
126- error_message = traceback .format_exc ()
127- logger .error (error_message )
128- await self .report_error (f"Could not execute refactor\n \n { error_message } " )
0 commit comments