comparison libervia/web/server/tasks/implicit/task_sass.py @ 1518:eb00d593801d

refactoring: rename `libervia` to `libervia.web` + update imports following backend changes
author Goffi <goffi@goffi.org>
date Fri, 02 Jun 2023 16:49:28 +0200
parents libervia/server/tasks/implicit/task_sass.py@106bae41f5c8
children 54ba0f74a488
comparison
equal deleted inserted replaced
1517:b8ed9726525b 1518:eb00d593801d
1 #!/ur/bin/env python3
2
3 import json
4 from libervia.backend.core.log import getLogger
5 from libervia.backend.core import exceptions
6 from libervia.web.server.tasks import task
7
8
9 log = getLogger(__name__)
10
11 SASS_SUFFIXES = ('.sass', '.scss')
12
13
14 class Task(task.Task):
15 """Compile .sass and .scss files found in themes browser paths"""
16 AFTER = ['js_modules']
17
18 async def prepare(self):
19 # we look for any Sass file, and cancel this task if none is found
20 sass_dirs = set()
21 for browser_path in self.resource.browser_modules.get('themes_browser_paths', []):
22 for p in browser_path.iterdir():
23 if p.suffix in SASS_SUFFIXES:
24 sass_dirs.add(browser_path)
25 break
26
27 if not sass_dirs:
28 raise exceptions.CancelError("No Sass file found")
29
30 # we have some Sass files, we need to install the compiler
31 d_path = self.resource.dev_build_path
32 package_path = d_path / "package.json"
33 try:
34 with package_path.open() as f:
35 package = json.load(f)
36 except FileNotFoundError:
37 package = {}
38 except Exception as e:
39 log.error(f"Unexepected exception while parsing package.json: {e}")
40
41 if 'node-sass' not in package.setdefault('dependencies', {}):
42 package['dependencies']['node-sass'] = 'latest'
43 with package_path.open('w') as f:
44 json.dump(package, f, indent=4)
45
46 cmd = self.find_command('yarnpkg', 'yarn')
47 await self.runCommand(cmd, 'install', path=str(d_path))
48
49 self.WATCH_DIRS = list(sass_dirs)
50
51 async def on_dir_event(self, host, filepath, flags):
52 if filepath.suffix in SASS_SUFFIXES:
53 await self.manager.run_task_instance(self)
54
55 async def start(self):
56 d_path = self.resource.dev_build_path
57 node_sass = d_path / 'node_modules' / 'node-sass' / 'bin' / 'node-sass'
58 for browser_path in self.resource.browser_modules['themes_browser_paths']:
59 for p in browser_path.iterdir():
60 if p.suffix not in SASS_SUFFIXES:
61 continue
62 await self.runCommand(
63 str(node_sass),
64 "--omit-source-map-url",
65 "--output-style", "compressed",
66 "--output", str(self.build_path),
67 str(p),
68 path=str(self.build_path)
69 )