wowool-lingware-build 1.1.3.dev6__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- wowool/lingware/build/build.py +88 -0
- wowool/lingware/build/domain/__init__.py +11 -0
- wowool/lingware/build/domain/build.py +455 -0
- wowool/lingware/build/domain/templates.py +70 -0
- wowool/lingware/build/git.py +34 -0
- wowool/lingware/build/language/__init__.py +1 -0
- wowool/lingware/build/language/build.py +196 -0
- wowool/lingware/build/language/templates.py +19 -0
- wowool/lingware/build/lid/__init__.py +1 -0
- wowool/lingware/build/lid/build.py +110 -0
- wowool/lingware/build/lid/templates.py +19 -0
- wowool/lingware/build/pytask.py +235 -0
- wowool/lingware/build/templates.py +67 -0
- wowool/lingware/build/tools/afst/__main__.py +20 -0
- wowool/lingware/build/tools/convert_domain_info/__init__.py +1 -0
- wowool/lingware/build/tools/convert_domain_info/__main__.py +51 -0
- wowool/lingware/build/tools/convert_domain_info/convert.py +31 -0
- wowool/lingware/build/tools/convert_language_info/__main__.py +44 -0
- wowool/lingware/build/utilities.py +120 -0
- wowool/lingware/unittest/__init__.py +1 -0
- wowool/lingware/unittest/unittest.py +437 -0
- wowool_lingware_build-1.1.3.dev6.dist-info/METADATA +12 -0
- wowool_lingware_build-1.1.3.dev6.dist-info/RECORD +26 -0
- wowool_lingware_build-1.1.3.dev6.dist-info/WHEEL +5 -0
- wowool_lingware_build-1.1.3.dev6.dist-info/entry_points.txt +4 -0
- wowool_lingware_build-1.1.3.dev6.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
from pathlib import Path
|
|
2
|
+
import logging
|
|
3
|
+
from wowool.lingware.build.git import get_version
|
|
4
|
+
from wowool.lingware.build.utilities import clean_python_build_folders, resolve_template, PREFIX_DO_NOT_EDIT
|
|
5
|
+
from wowool.lingware.build.templates import PACKAGE_SETUP_TEMPLATE, PACKAGE_PYPROJECT_TEMPLATE, README_TEMPLATE
|
|
6
|
+
import json
|
|
7
|
+
|
|
8
|
+
logger = logging.getLogger(__name__)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def generate_package_setupfile(package_folder: Path, language: str, output_folder: Path):
|
|
12
|
+
wowool_module = "wowool.lxware.wowool"
|
|
13
|
+
package_name = language
|
|
14
|
+
logger.debug(f"Template variables: {wowool_module=}{package_name=}")
|
|
15
|
+
setup_fn = output_folder / "setup.py"
|
|
16
|
+
# eot_namespace_dash = eot_namespace.replace("-", "_")
|
|
17
|
+
repo_version = get_version()
|
|
18
|
+
|
|
19
|
+
setup_py_install_requirement = ""
|
|
20
|
+
# setup_dependencies = [f"{eot_namespace_dash}_language_{language}_basic=={repo_version}"]
|
|
21
|
+
# if "dependencies" in jo_domain_info:
|
|
22
|
+
# dom_info_dependencies = jo_domain_info["dependencies"]
|
|
23
|
+
# setup_dependencies.extend([f"{eot_namespace_dash}_domain_{dep}=={repo_version}".replace("-", "_") for dep in dom_info_dependencies])
|
|
24
|
+
|
|
25
|
+
clean_python_build_folders(package_folder)
|
|
26
|
+
# !! do not remove it's used to resolve
|
|
27
|
+
# setup_py_install_requirement = f"install_requires={json.dumps(setup_dependencies)}"
|
|
28
|
+
# logger.debug(f"Template variables: {setup_py_install_requirement=}")
|
|
29
|
+
|
|
30
|
+
setup_filename = package_folder / setup_fn
|
|
31
|
+
try:
|
|
32
|
+
with open(setup_filename, "w") as fp_mf:
|
|
33
|
+
fp_mf.write(resolve_template(PACKAGE_SETUP_TEMPLATE, globals(), locals()))
|
|
34
|
+
return setup_fn
|
|
35
|
+
except Exception as ex:
|
|
36
|
+
logger.exception(ex)
|
|
37
|
+
setup_filename.unlink(missing_ok=True)
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
import re
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def strip_version(component_name: str) -> str:
|
|
44
|
+
return re.sub("""(.*)@(?:dev\\d*|[0-9\\.]+[\\d]+)(\\.(?:language|dom))?""", "\\1\\2", component_name)
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def generate_pyproject_file(package_folder: Path, language: str, output_folder: Path):
|
|
48
|
+
|
|
49
|
+
wowool_module = "wowool.lxware.wowool"
|
|
50
|
+
package_name = language
|
|
51
|
+
logger.debug(f"Template variables: {wowool_module=}{package_name=}")
|
|
52
|
+
pyproject_fn = output_folder / "pyproject.toml"
|
|
53
|
+
repo_version = get_version()
|
|
54
|
+
lxware = output_folder / "src/wowool/lxware/wowool"
|
|
55
|
+
domains_ = []
|
|
56
|
+
for fn in lxware.glob("*.dom_info"):
|
|
57
|
+
dom_info = json.loads(fn.read_text())
|
|
58
|
+
print("dom_info----->>>>>>", dom_info)
|
|
59
|
+
name = strip_version(fn.name)
|
|
60
|
+
dom_text = f"### {name}\n"
|
|
61
|
+
|
|
62
|
+
dom_text += """\n| Entity | Description | Sample |"""
|
|
63
|
+
dom_text += """\n| ------ | ----------- | ------ |"""
|
|
64
|
+
for sample in dom_info["examples"]:
|
|
65
|
+
dom_text += f"""\n| {sample['concept']} |{sample['desc']} | {sample['sample']} |"""
|
|
66
|
+
dom_text += "\n\n"
|
|
67
|
+
domains_.append(dom_text)
|
|
68
|
+
|
|
69
|
+
domains = "\n".join(domains_)
|
|
70
|
+
|
|
71
|
+
readme_fn = output_folder / "README.md"
|
|
72
|
+
readme_fn.write_text(resolve_template(README_TEMPLATE, globals(), locals()))
|
|
73
|
+
|
|
74
|
+
setup_py_install_requirement = ""
|
|
75
|
+
|
|
76
|
+
clean_python_build_folders(output_folder)
|
|
77
|
+
# !! do not remove it's used to resolve
|
|
78
|
+
# setup_py_install_requirement = f"install_requires={json.dumps(setup_dependencies)}"
|
|
79
|
+
# logger.debug(f"Template variables: {setup_py_install_requirement=}")
|
|
80
|
+
|
|
81
|
+
filename = package_folder / pyproject_fn
|
|
82
|
+
try:
|
|
83
|
+
with open(filename, "w") as fp_mf:
|
|
84
|
+
fp_mf.write(resolve_template(PACKAGE_PYPROJECT_TEMPLATE, globals(), locals()))
|
|
85
|
+
return pyproject_fn
|
|
86
|
+
except Exception as ex:
|
|
87
|
+
logger.exception(ex)
|
|
88
|
+
filename.unlink(missing_ok=True)
|
|
@@ -0,0 +1,455 @@
|
|
|
1
|
+
import json
|
|
2
|
+
from subprocess import run
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
import shutil
|
|
5
|
+
import logging
|
|
6
|
+
from wowool.lingware.build.git import get_version
|
|
7
|
+
import json
|
|
8
|
+
import os
|
|
9
|
+
from wowool.lingware.build.utilities import (
|
|
10
|
+
resolve_template,
|
|
11
|
+
PREFIX_DO_NOT_EDIT,
|
|
12
|
+
eot_namespace,
|
|
13
|
+
wowool_module,
|
|
14
|
+
get_filename_version,
|
|
15
|
+
get_stage_folder,
|
|
16
|
+
get_stage_lxware_folder,
|
|
17
|
+
get_lxcommon,
|
|
18
|
+
get_language,
|
|
19
|
+
clean_python_build_folders,
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
logger = logging.getLogger(__name__)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def domains(folder: Path):
|
|
26
|
+
for domain in folder.glob("domains/*"):
|
|
27
|
+
if domain.is_dir():
|
|
28
|
+
yield domain
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def get_nrof_threads() -> int:
|
|
32
|
+
return int(os.environ["WOWOOL_NROF_THREADS"]) if "WOWOOL_NROF_THREADS" in os.environ else 1
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def get_variable(domain_project_fn, jo, varname, ext, location=None, prefix=""):
|
|
36
|
+
if varname in jo:
|
|
37
|
+
formatted_string = "f'''" + jo[varname] + "'''"
|
|
38
|
+
fn = eval(formatted_string)
|
|
39
|
+
else:
|
|
40
|
+
if location:
|
|
41
|
+
language = None
|
|
42
|
+
if "language" in jo:
|
|
43
|
+
language = jo["language"]
|
|
44
|
+
else:
|
|
45
|
+
try:
|
|
46
|
+
language = Path(domain_project_fn).parts[-4]
|
|
47
|
+
except Exception as ex:
|
|
48
|
+
logger.warning(
|
|
49
|
+
f"ACHTUNG :-# could not extract language from path {domain_project_fn}, name {varname}\n{jo}\n, ex: {ex}"
|
|
50
|
+
)
|
|
51
|
+
pass
|
|
52
|
+
if language:
|
|
53
|
+
fn = Path(location, f"""{prefix}{language}-{jo['name']}{ext}""")
|
|
54
|
+
else:
|
|
55
|
+
fn = Path(location, f"""{prefix}{jo['name']}{ext}""")
|
|
56
|
+
logger.warning(f"ACHTUNG :-# language not found in the config file {domain_project_fn}, name {varname} using {fn} \n{jo}")
|
|
57
|
+
|
|
58
|
+
else:
|
|
59
|
+
fn = Path(domain_project_fn)
|
|
60
|
+
fn = fn.with_suffix(ext)
|
|
61
|
+
return fn
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def generate_package_info(domain_folder, dom_file_target, config_file_target, additional_package_files_list):
|
|
65
|
+
with open(domain_folder / "package.json", "w") as fh_pi:
|
|
66
|
+
jpi = {"files": [str(dom_file_target), str(config_file_target)]}
|
|
67
|
+
if additional_package_files_list:
|
|
68
|
+
for additional_package_file in additional_package_files_list:
|
|
69
|
+
jpi["files"].append(str(additional_package_file))
|
|
70
|
+
json.dump(jpi, fh_pi, indent=2)
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def generate_domain_makefile(folder: Path, domain_folder: Path):
|
|
74
|
+
nrof_threads = get_nrof_threads()
|
|
75
|
+
version = get_version()
|
|
76
|
+
filename_version = get_filename_version(version)
|
|
77
|
+
addsign_filename_version = f"@{filename_version}"
|
|
78
|
+
|
|
79
|
+
# !! do not remove any , it use in a f-string
|
|
80
|
+
# ----------------------------------------------------
|
|
81
|
+
domain_project_fn = domain_folder / "project.json"
|
|
82
|
+
assert domain_project_fn.exists(), f"Missing project file {domain_project_fn}"
|
|
83
|
+
lxcommon_pth = get_lxcommon(folder)
|
|
84
|
+
lxcommon = str(lxcommon_pth)
|
|
85
|
+
repo = folder
|
|
86
|
+
# ----------------------------------------------------
|
|
87
|
+
|
|
88
|
+
STAGE_DIR = get_stage_folder(folder)
|
|
89
|
+
lxware = get_stage_lxware_folder(folder)
|
|
90
|
+
|
|
91
|
+
if "WOC_EXEC" in os.environ:
|
|
92
|
+
woc_app = os.environ["WOC_EXEC"]
|
|
93
|
+
|
|
94
|
+
else:
|
|
95
|
+
executable = Path(STAGE_DIR, "bin").resolve()
|
|
96
|
+
woc_app = f"{executable}/woc"
|
|
97
|
+
if not Path(woc_app).exists():
|
|
98
|
+
woc_app = "woc"
|
|
99
|
+
|
|
100
|
+
lxware_eot = lxware / "wowool"
|
|
101
|
+
|
|
102
|
+
compiler_options = ""
|
|
103
|
+
with open(domain_project_fn) as fp:
|
|
104
|
+
jo = json.load(fp)
|
|
105
|
+
|
|
106
|
+
# Add additional topics information.
|
|
107
|
+
additional_package_files = ""
|
|
108
|
+
|
|
109
|
+
cwd = Path(domain_project_fn).parent
|
|
110
|
+
name = Path(domain_project_fn).stem
|
|
111
|
+
if "name" in jo:
|
|
112
|
+
name = jo["name"]
|
|
113
|
+
else:
|
|
114
|
+
if name == "project":
|
|
115
|
+
name = Path(cwd).stem
|
|
116
|
+
jo["name"] = name
|
|
117
|
+
|
|
118
|
+
makefile_fn = domain_folder / "makefile._mk"
|
|
119
|
+
|
|
120
|
+
language = None
|
|
121
|
+
language = jo["language"] if "language" in jo else get_language(folder)
|
|
122
|
+
language_filename_version = f"{language}@{filename_version}"
|
|
123
|
+
woc_options = ""
|
|
124
|
+
if "WOC_OPTIONS" in os.environ:
|
|
125
|
+
woc_options += f"{os.environ['WOC_OPTIONS']} "
|
|
126
|
+
|
|
127
|
+
woc_options = jo["woc_options"] if "woc_options" in jo else woc_options
|
|
128
|
+
if "$WOC_OPTIONS" in woc_options and "WOC_OPTIONS" in os.environ:
|
|
129
|
+
woc_options = woc_options.replace("$WOC_OPTIONS", os.environ["WOC_OPTIONS"])
|
|
130
|
+
|
|
131
|
+
dom_info_file_source = f"{language}-{name}.di" if language else f"{name}.di"
|
|
132
|
+
dom_info_file_source = Path(dom_info_file_source)
|
|
133
|
+
dom_info_file_target = Path(f"{dom_info_file_source.stem}@{filename_version}.dom_info")
|
|
134
|
+
dom_info_file_source = Path(cwd, dom_info_file_source)
|
|
135
|
+
dom_info_file_target = Path(lxware_eot, dom_info_file_target)
|
|
136
|
+
if "target_config" in jo:
|
|
137
|
+
formatted_string = "f''' " + jo["target_config"] + "'''"
|
|
138
|
+
dom_info_file_target = eval(formatted_string)
|
|
139
|
+
if not Path(dom_info_file_target).exists():
|
|
140
|
+
print("target_config file not found!!! in {domain_project_fn}")
|
|
141
|
+
exit(-1)
|
|
142
|
+
|
|
143
|
+
domain_description = f"{language}-{name}" if language else f"{name}"
|
|
144
|
+
package_name = f"domain-{domain_description}"
|
|
145
|
+
domain_name = f"{domain_description}@{filename_version}.dom"
|
|
146
|
+
dom_file_target = Path(lxware_eot, domain_name)
|
|
147
|
+
domain_name_dash = domain_description.replace("-", "_")
|
|
148
|
+
package_name_dash = package_name.replace("-", "_")
|
|
149
|
+
|
|
150
|
+
if "target" in jo:
|
|
151
|
+
formatted_string = "f''' " + jo["target"] + "'''"
|
|
152
|
+
dom_file_target = eval(formatted_string)
|
|
153
|
+
|
|
154
|
+
project = folder
|
|
155
|
+
sources = """\\\n"""
|
|
156
|
+
|
|
157
|
+
for file in jo["sources"]:
|
|
158
|
+
formatted_string = "f'''\t" + file + """ \\\\\n'''"""
|
|
159
|
+
resolved_fn = eval(formatted_string)
|
|
160
|
+
sources += eval(formatted_string)
|
|
161
|
+
formatted_string = "f'''" + file + "'''"
|
|
162
|
+
fn = eval(formatted_string)
|
|
163
|
+
|
|
164
|
+
thread_option = f" -j {nrof_threads} " if nrof_threads > 0 else " "
|
|
165
|
+
additional_package_build_statements = ""
|
|
166
|
+
additional_package_files_list = []
|
|
167
|
+
if "plugins" in jo and "topics" in jo["plugins"]:
|
|
168
|
+
topic_model_file_target = Path(dom_file_target).parent / f"{language}@{filename_version}.topic_model"
|
|
169
|
+
additional_package_files += f" {topic_model_file_target}"
|
|
170
|
+
additional_package_files_list.append(topic_model_file_target)
|
|
171
|
+
additional_package_build_statements = f"""
|
|
172
|
+
{topic_model_file_target}: $(DOM_DOM)
|
|
173
|
+
\ttoc -l {language}{addsign_filename_version} -f {repo}/semantics/topics/training_data -o $@ --lxware {lxware}
|
|
174
|
+
|
|
175
|
+
"""
|
|
176
|
+
|
|
177
|
+
logger.debug(f"Generate: {makefile_fn}")
|
|
178
|
+
|
|
179
|
+
with open(makefile_fn, "w") as fp_mf:
|
|
180
|
+
from wowool.lingware.build.domain.templates import DOMAIN_MAKEFILE_TEMPLATE
|
|
181
|
+
|
|
182
|
+
fp_mf.write(resolve_template(DOMAIN_MAKEFILE_TEMPLATE, globals(), locals()))
|
|
183
|
+
|
|
184
|
+
# write a file with package info this the files requred to use in the setup
|
|
185
|
+
generate_package_info(domain_folder, dom_file_target, dom_info_file_target, additional_package_files_list)
|
|
186
|
+
|
|
187
|
+
return makefile_fn
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
def get_sorted_projects(folder: Path):
|
|
191
|
+
fns = []
|
|
192
|
+
|
|
193
|
+
for domain_folder in domains(folder):
|
|
194
|
+
domain = domain_folder.name
|
|
195
|
+
project_fn = folder / f"domains/{domain}/project.json"
|
|
196
|
+
assert project_fn.exists(), f"Missing project.json in {domain_folder}"
|
|
197
|
+
|
|
198
|
+
fns.append(domain_folder)
|
|
199
|
+
|
|
200
|
+
postponed_builds = []
|
|
201
|
+
language = get_language(folder)
|
|
202
|
+
for idx, fn in enumerate(fns):
|
|
203
|
+
domain_dir_name = fn.name
|
|
204
|
+
domain_folder = fn
|
|
205
|
+
dom_info_fn = domain_folder / f"{language}-{domain_dir_name}.di"
|
|
206
|
+
logger.debug(f"Check dom_info file: {dom_info_fn}")
|
|
207
|
+
assert dom_info_fn.exists(), f" ! Missing domain info file: {dom_info_fn}"
|
|
208
|
+
if domain_folder.name == "topics":
|
|
209
|
+
postponed_builds.append({"idx": idx, "project_fn": fn})
|
|
210
|
+
|
|
211
|
+
for postponed_build in postponed_builds:
|
|
212
|
+
del fns[postponed_build["idx"]]
|
|
213
|
+
|
|
214
|
+
postponed_builds = [item["project_fn"] for item in postponed_builds]
|
|
215
|
+
return {"paralell": fns, "postponed": postponed_builds}
|
|
216
|
+
|
|
217
|
+
|
|
218
|
+
def build_domain(folder: Path, domain_folder: Path):
|
|
219
|
+
"""build a domain."""
|
|
220
|
+
print("Building: ", folder, domain_folder)
|
|
221
|
+
makefile_fn = generate_domain_makefile(folder, domain_folder)
|
|
222
|
+
compile_paralell(folder, [makefile_fn])
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
def compile_paralell(folder: Path, makefiles, target=""):
|
|
226
|
+
from subprocess import run
|
|
227
|
+
|
|
228
|
+
makefile_all_fn = folder / "MakeAll._mk"
|
|
229
|
+
with open(makefile_all_fn, "w") as fh:
|
|
230
|
+
fh.write("all:")
|
|
231
|
+
for makefile in makefiles:
|
|
232
|
+
fh.write(f"{makefile.parent.stem}_make ")
|
|
233
|
+
fh.write("\n")
|
|
234
|
+
for makefile in makefiles:
|
|
235
|
+
fh.write(f"{makefile.parent.stem}_make:\n")
|
|
236
|
+
fh.write(f"\t cd {makefile.parent} ; make -f {makefile.name} {target}\n\n")
|
|
237
|
+
|
|
238
|
+
compiler_options_fn = folder / "woc_options.json"
|
|
239
|
+
if compiler_options_fn.exists():
|
|
240
|
+
with open(compiler_options_fn) as fh:
|
|
241
|
+
woc_jo = json.load(fh)
|
|
242
|
+
if "WOC_OPTIONS" in woc_jo:
|
|
243
|
+
args = woc_jo["WOC_OPTIONS"]
|
|
244
|
+
os.environ["WOC_OPTIONS"] = args
|
|
245
|
+
print("SETTING: WOC_OPTIONS", os.environ["WOC_OPTIONS"])
|
|
246
|
+
|
|
247
|
+
threads = get_nrof_threads()
|
|
248
|
+
cmd = f"make -f {makefile_all_fn} -j {threads}"
|
|
249
|
+
logger.debug(f"paralell: {cmd=}")
|
|
250
|
+
run(cmd, shell=True, check=True)
|
|
251
|
+
|
|
252
|
+
|
|
253
|
+
def build_domains(folder):
|
|
254
|
+
"""build all the domains."""
|
|
255
|
+
|
|
256
|
+
build_type = get_sorted_projects(folder)
|
|
257
|
+
|
|
258
|
+
makefiles = []
|
|
259
|
+
for domain_folder in build_type["paralell"]:
|
|
260
|
+
makefile_fn = generate_domain_makefile(folder, domain_folder)
|
|
261
|
+
makefiles.append(makefile_fn)
|
|
262
|
+
|
|
263
|
+
if makefiles:
|
|
264
|
+
compile_paralell(folder, makefiles)
|
|
265
|
+
|
|
266
|
+
makefiles = []
|
|
267
|
+
for domain_folder in build_type["postponed"]:
|
|
268
|
+
makefile_fn = generate_domain_makefile(folder, domain_folder)
|
|
269
|
+
makefiles.append(makefile_fn)
|
|
270
|
+
|
|
271
|
+
if makefiles:
|
|
272
|
+
compile_paralell(folder, makefiles)
|
|
273
|
+
|
|
274
|
+
|
|
275
|
+
def get_project_info(domain_folder: Path):
|
|
276
|
+
package_json_fn = domain_folder / "project.json"
|
|
277
|
+
if package_json_fn.exists():
|
|
278
|
+
with open(package_json_fn) as fh:
|
|
279
|
+
return json.load(fh)
|
|
280
|
+
return {}
|
|
281
|
+
|
|
282
|
+
|
|
283
|
+
def get_package_info(domain_folder: Path):
|
|
284
|
+
package_json_fn = domain_folder / "package.json"
|
|
285
|
+
if package_json_fn.exists():
|
|
286
|
+
with open(package_json_fn) as fh:
|
|
287
|
+
return json.load(fh)
|
|
288
|
+
return {}
|
|
289
|
+
|
|
290
|
+
|
|
291
|
+
def get_dom_info(domain_folder: Path):
|
|
292
|
+
di_fn = [fn for fn in domain_folder.glob("*.di")][0]
|
|
293
|
+
with open(di_fn) as fh:
|
|
294
|
+
return json.load(fh)
|
|
295
|
+
return {}
|
|
296
|
+
|
|
297
|
+
|
|
298
|
+
def clean_domain(folder: Path, domain_folder: Path):
|
|
299
|
+
package_info = get_package_info(domain_folder)
|
|
300
|
+
if "files" in package_info:
|
|
301
|
+
for fn in package_info["files"]:
|
|
302
|
+
Path(fn).unlink(missing_ok=True)
|
|
303
|
+
Path(domain_folder / "makefile._mk").unlink(missing_ok=True)
|
|
304
|
+
Path(domain_folder / "package.json").unlink(missing_ok=True)
|
|
305
|
+
clean_python_build_folders(domain_folder)
|
|
306
|
+
shutil.rmtree(f"{domain_folder}/wowool", ignore_errors=True)
|
|
307
|
+
for egg_info in domain_folder.glob("*.egg-info"):
|
|
308
|
+
shutil.rmtree(egg_info, ignore_errors=True)
|
|
309
|
+
Path(f"{folder}/setup.py").unlink(missing_ok=True)
|
|
310
|
+
|
|
311
|
+
|
|
312
|
+
def clean_domains(folder):
|
|
313
|
+
for domain_folder in domains(folder):
|
|
314
|
+
clean_domain(folder, domain_folder)
|
|
315
|
+
|
|
316
|
+
|
|
317
|
+
def generate_domain_setupfile(domain_folder: Path, jo_domain_info, package_name, language):
|
|
318
|
+
eot_namespace = "wowool-lxware"
|
|
319
|
+
wowool_module = "wowool.lxware.wowool"
|
|
320
|
+
lxware_namespace = "wowool-lxware"
|
|
321
|
+
logger.debug(f"Template variables: {eot_namespace=}{wowool_module=}{lxware_namespace=}")
|
|
322
|
+
setup_fn = "setup.py"
|
|
323
|
+
eot_namespace_dash = eot_namespace.replace("-", "_")
|
|
324
|
+
repo_version = get_version()
|
|
325
|
+
|
|
326
|
+
setup_py_install_requirement = ""
|
|
327
|
+
setup_dependencies = [f"{eot_namespace_dash}_language_{language}_basic=={repo_version}"]
|
|
328
|
+
if "dependencies" in jo_domain_info:
|
|
329
|
+
dom_info_dependencies = jo_domain_info["dependencies"]
|
|
330
|
+
setup_dependencies.extend([f"{eot_namespace_dash}_domain_{dep}=={repo_version}".replace("-", "_") for dep in dom_info_dependencies])
|
|
331
|
+
|
|
332
|
+
clean_python_build_folders(domain_folder)
|
|
333
|
+
# !! do not remove it's used to resolve
|
|
334
|
+
setup_py_install_requirement = f"install_requires={json.dumps(setup_dependencies)}"
|
|
335
|
+
logger.debug(f"Template variables: {setup_py_install_requirement=}")
|
|
336
|
+
|
|
337
|
+
setup_filename = domain_folder / setup_fn
|
|
338
|
+
try:
|
|
339
|
+
with open(setup_filename, "w") as fp_mf:
|
|
340
|
+
from wowool.lingware.build.domain.templates import DOMAIN_SETUP_TEMPLATE
|
|
341
|
+
|
|
342
|
+
fp_mf.write(resolve_template(DOMAIN_SETUP_TEMPLATE, globals(), locals()))
|
|
343
|
+
return setup_fn
|
|
344
|
+
except Exception as ex:
|
|
345
|
+
logger.exception(ex)
|
|
346
|
+
setup_filename.unlink(missing_ok=True)
|
|
347
|
+
|
|
348
|
+
|
|
349
|
+
def package_domain(folder: Path, domain_folder: Path, package_lxware_wowool: Path | None = None, run_setup: bool = True):
|
|
350
|
+
package_info = get_package_info(domain_folder)
|
|
351
|
+
assert "files" in package_info, "missing the file section in the package.json of {domain_folder}"
|
|
352
|
+
if package_lxware_wowool is None:
|
|
353
|
+
dst_folder = domain_folder / "wowool/lxware/wowool"
|
|
354
|
+
else:
|
|
355
|
+
dst_folder = package_lxware_wowool
|
|
356
|
+
shutil.rmtree(domain_folder / "wowool", ignore_errors=True)
|
|
357
|
+
dst_folder.mkdir(parents=True, exist_ok=True)
|
|
358
|
+
for fn in package_info["files"]:
|
|
359
|
+
shutil.copy(fn, dst_folder)
|
|
360
|
+
|
|
361
|
+
jo_domain_info = get_dom_info(domain_folder)
|
|
362
|
+
language = get_language(folder)
|
|
363
|
+
name = domain_folder.name
|
|
364
|
+
domain_description = f"{language}-{name}" if language else f"{name}"
|
|
365
|
+
|
|
366
|
+
package_name = f"domain-{domain_description}"
|
|
367
|
+
|
|
368
|
+
if run_setup:
|
|
369
|
+
generate_domain_setupfile(domain_folder, jo_domain_info, package_name, language)
|
|
370
|
+
logger.debug(f"Run setup.py in {domain_folder}")
|
|
371
|
+
run("python setup.py bdist_wheel", cwd=domain_folder, shell=True)
|
|
372
|
+
|
|
373
|
+
|
|
374
|
+
def package_domains(folder: Path, package_lxware_wowool: Path | None = None, run_setup: bool = True):
|
|
375
|
+
for domain_folder in domains(folder):
|
|
376
|
+
package_domain(folder, domain_folder, package_lxware_wowool=package_lxware_wowool, run_setup=run_setup)
|
|
377
|
+
|
|
378
|
+
|
|
379
|
+
def upload_domain(folder: Path, domain_folder: Path):
|
|
380
|
+
from wowool.build.codeartifact import upload_pypi
|
|
381
|
+
|
|
382
|
+
upload_pypi(domain_folder)
|
|
383
|
+
|
|
384
|
+
|
|
385
|
+
def upload_domains(folder: Path):
|
|
386
|
+
for domain_folder in domains(folder):
|
|
387
|
+
upload_domain(folder, domain_folder)
|
|
388
|
+
|
|
389
|
+
|
|
390
|
+
def load_domain_tasks(folder, collection_name=None):
|
|
391
|
+
code = """
|
|
392
|
+
from wowool.lingware.build.domain.build import build_domain, clean_domain, package_domain, upload_domain
|
|
393
|
+
|
|
394
|
+
"""
|
|
395
|
+
|
|
396
|
+
for domain_folder in domains(folder):
|
|
397
|
+
domain_name = domain_folder.name
|
|
398
|
+
domain_function_name = domain_name.replace("-", "_")
|
|
399
|
+
code += f"""
|
|
400
|
+
|
|
401
|
+
|
|
402
|
+
@task(name = '{domain_function_name}/build' )
|
|
403
|
+
def build_{domain_function_name}( context ):
|
|
404
|
+
\"\"\" Build the '{domain_name}' Domain. \"\"\"
|
|
405
|
+
from wowool.lingware.build.domain.build import build_domain
|
|
406
|
+
build_domain( Path.cwd(), Path("{domain_folder}") )
|
|
407
|
+
|
|
408
|
+
if {collection_name}:
|
|
409
|
+
{collection_name}.add_task(build_{domain_function_name})
|
|
410
|
+
|
|
411
|
+
@task(name = '{domain_function_name}/clean' )
|
|
412
|
+
def clean_{domain_function_name}( context ):
|
|
413
|
+
\"\"\" Clean the '{domain_name}' Domain. \"\"\"
|
|
414
|
+
from wowool.lingware.build.domain.build import clean_domain
|
|
415
|
+
clean_domain( Path.cwd(), Path("{domain_folder}") )
|
|
416
|
+
|
|
417
|
+
if {collection_name}:
|
|
418
|
+
{collection_name}.add_task(clean_{domain_function_name})
|
|
419
|
+
|
|
420
|
+
@task(name = '{domain_function_name}/package' )
|
|
421
|
+
def package_{domain_function_name}( context ):
|
|
422
|
+
\"\"\" Package the '{domain_name}' Domain. (setup.py) \"\"\"
|
|
423
|
+
THIS_DIR = Path(__file__).parent
|
|
424
|
+
from wowool.lingware.build.domain.build import package_domain
|
|
425
|
+
package_domain( THIS_DIR, Path("{domain_folder}") )
|
|
426
|
+
|
|
427
|
+
if {collection_name}:
|
|
428
|
+
{collection_name}.add_task(package_{domain_function_name})
|
|
429
|
+
|
|
430
|
+
@task(name = '{domain_function_name}/upload' )
|
|
431
|
+
def upload_{domain_function_name}( context ):
|
|
432
|
+
\"\"\" Upload the '{domain_name}' Domain to nexus \"\"\"
|
|
433
|
+
THIS_DIR = Path(__file__).parent
|
|
434
|
+
from wowool.lingware.build.domain.build import upload_domain
|
|
435
|
+
upload_domain( THIS_DIR, Path("{domain_folder}") )
|
|
436
|
+
|
|
437
|
+
if {collection_name}:
|
|
438
|
+
{collection_name}.add_task(upload_{domain_function_name})
|
|
439
|
+
|
|
440
|
+
|
|
441
|
+
|
|
442
|
+
"""
|
|
443
|
+
|
|
444
|
+
# @task(name = '{domain_function_name}' )
|
|
445
|
+
# def action_{domain_function_name}( context , action ):
|
|
446
|
+
# THIS_DIR = Path(__file__).parent
|
|
447
|
+
# if action == "test":
|
|
448
|
+
# lingware_tasks.unittest_folder(context, THIS_DIR, verbose=False, diff="meld", overwrite=False, pattern="**/*.txt")
|
|
449
|
+
# elif action == "test_dictionaries":
|
|
450
|
+
# lingware_tasks.unittest_folder(context, THIS_DIR, verbose=False, diff="meld", overwrite=False, pattern="**/*.txt")
|
|
451
|
+
# else:
|
|
452
|
+
# lingware_tasks.build_domains( context, THIS_DIR, "{domain_name}" , target=action )
|
|
453
|
+
|
|
454
|
+
# print(code)
|
|
455
|
+
return code
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
DOMAIN_SETUP_TEMPLATE = """#
|
|
2
|
+
{PREFIX_DO_NOT_EDIT}
|
|
3
|
+
# This file is generated.
|
|
4
|
+
#
|
|
5
|
+
import os
|
|
6
|
+
import shutil
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
import sys
|
|
9
|
+
from setuptools import setup, find_namespace_packages, Extension
|
|
10
|
+
|
|
11
|
+
THIS_DIR = Path(__file__).parent.resolve()
|
|
12
|
+
language = THIS_DIR.name
|
|
13
|
+
|
|
14
|
+
wowool_packages = ["{wowool_module}"]
|
|
15
|
+
|
|
16
|
+
results = setup(
|
|
17
|
+
name="{lxware_namespace}-{package_name}",
|
|
18
|
+
version="{repo_version}",
|
|
19
|
+
packages=wowool_packages,
|
|
20
|
+
author="Wowool",
|
|
21
|
+
author_email = "info@wowool.com",
|
|
22
|
+
description="Wowool NLP {package_name} Package",
|
|
23
|
+
zip_safe=False,
|
|
24
|
+
package_data={{"{wowool_module}": ["*"]}},
|
|
25
|
+
include_package_data=True,
|
|
26
|
+
{setup_py_install_requirement}
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
DOMAIN_MAKEFILE_TEMPLATE = """######################################################################################
|
|
32
|
+
# Generate Makefile to build {name} {language_filename_version} modules:
|
|
33
|
+
# Unpublished Copyright (c) 2020 EyeOnText, All Rights Reserved.
|
|
34
|
+
# NOTICE: All information contained herein is, and remains the property of EyeOnText.
|
|
35
|
+
######################################################################################
|
|
36
|
+
WOC:= {woc_app}
|
|
37
|
+
COMPONENT={name}
|
|
38
|
+
DOM_DOM ={dom_file_target}
|
|
39
|
+
DOM_CONF_SRC={dom_info_file_source}
|
|
40
|
+
DOM_INFO_TARGET={dom_info_file_target}
|
|
41
|
+
FILENAME_VERSION:={filename_version}
|
|
42
|
+
|
|
43
|
+
BUILD_PREP=_build_{name}
|
|
44
|
+
PACKAGE_FILES=$(DOM_DOM) $(DOM_INFO_TARGET) {additional_package_files}
|
|
45
|
+
PACKAGE = $(PACKAGE_FILES)
|
|
46
|
+
|
|
47
|
+
all: $(PACKAGE)
|
|
48
|
+
|
|
49
|
+
SOURCES := {sources}
|
|
50
|
+
|
|
51
|
+
$(DOM_DOM) : $(SOURCES)
|
|
52
|
+
$(WOC) {woc_options} -l wowool/{language_filename_version} {thread_option} -o $(DOM_DOM) $(SOURCES) --lxware {lxware}
|
|
53
|
+
|
|
54
|
+
$(DOM_INFO_TARGET) : $(DOM_CONF_SRC)
|
|
55
|
+
convert_domain_info -f $< --output_file $@ --filename_version $(FILENAME_VERSION)
|
|
56
|
+
|
|
57
|
+
{additional_package_build_statements}
|
|
58
|
+
|
|
59
|
+
ut:
|
|
60
|
+
$(WOC) -t -l wowool/{language_filename_version} -o $(DOM_DOM) $(SOURCES)
|
|
61
|
+
|
|
62
|
+
clean:
|
|
63
|
+
-rm -r $(PACKAGE) dist build *.egg-info
|
|
64
|
+
-rm $(DOM_DOM)_inc
|
|
65
|
+
|
|
66
|
+
clean_deploy:
|
|
67
|
+
-rm -r dist build *.egg-info
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
"""
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
from pathlib import Path
|
|
2
|
+
from wowool.build.git import make_version, get_version_info, _get_repository_path
|
|
3
|
+
from subprocess import run
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def get_version(fp_repo: Path | None = None):
|
|
7
|
+
"""
|
|
8
|
+
Get the version from the git history of the given repository folder
|
|
9
|
+
|
|
10
|
+
:param fp_repo: Optional repository folder. If not provided, the current
|
|
11
|
+
working directory is used
|
|
12
|
+
"""
|
|
13
|
+
fp_repo = _get_repository_path(fp_repo)
|
|
14
|
+
|
|
15
|
+
_git_info = get_version_info(fp_repo)
|
|
16
|
+
|
|
17
|
+
results = run("git diff --stat --exit-code HEAD", shell=True, capture_output=True)
|
|
18
|
+
has_changes = results.returncode != 0
|
|
19
|
+
if has_changes:
|
|
20
|
+
out = results.stdout
|
|
21
|
+
seen_lxcommon_not_changed = False
|
|
22
|
+
only_one_changed = False
|
|
23
|
+
for line in out.decode().split("\n"):
|
|
24
|
+
# if 'lxcommon | 0' in out:
|
|
25
|
+
line = line.strip()
|
|
26
|
+
|
|
27
|
+
if "lxcommon | 0" in line:
|
|
28
|
+
seen_lxcommon_not_changed = True
|
|
29
|
+
if line.startswith("1 file changed"):
|
|
30
|
+
only_one_changed = True
|
|
31
|
+
if only_one_changed and seen_lxcommon_not_changed:
|
|
32
|
+
has_changes = False
|
|
33
|
+
|
|
34
|
+
return make_version(_git_info["tag"], _git_info["nr_commits"], has_changes)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
from .build import make_language, package_languages, upload_languages, languages
|