Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 25 additions & 12 deletions templates/generate.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,15 +45,19 @@ def load_config(config_path):
raise

def compile_document(policy_name, module_list, variables, modules_dir, output_dir):
"""Compile a single document from its constituent modules"""
"""Compile a single document from its constituent modules.

Returns True if the document was generated, False otherwise
(missing policy/module, template error).
"""
logger = logging.getLogger("openworkdocs")

# Handle industry documents (single files, not modules)
if policy_name.startswith('industries/'):
industry_file = os.path.join(modules_dir, f"{policy_name}.md")
if not os.path.exists(industry_file):
logger.warning(f"Industry document {industry_file} not found, skipping")
return
return False

# Set up Jinja environment
env = Environment(loader=FileSystemLoader(modules_dir))
Expand All @@ -63,10 +67,10 @@ def compile_document(policy_name, module_list, variables, modules_dir, output_di
rendered_content = template.render(**variables)
except jinja2.exceptions.TemplateSyntaxError as e:
logger.error(f"Template syntax error in {policy_name}: Line {e.lineno}: {e.message}")
return
return False
except Exception as e:
logger.error(f"Error rendering {policy_name}: {e}")
return
return False

# Create output directory if it doesn't exist
os.makedirs(output_dir, exist_ok=True)
Expand All @@ -78,15 +82,15 @@ def compile_document(policy_name, module_list, variables, modules_dir, output_di
f.write(rendered_content)

logger.info(f"Generated {output_path}")
return
return True

# Original logic for regular policy documents
policy_dir = os.path.join(modules_dir, policy_name)

# Check if policy directory exists
if not os.path.exists(policy_dir):
logger.warning(f"Policy directory {policy_dir} not found, skipping")
return
return False

# Collect content from all modules
combined_content = ""
Expand All @@ -96,7 +100,7 @@ def compile_document(policy_name, module_list, variables, modules_dir, output_di

if not os.path.exists(module_path):
logger.warning(f"Module {module_path} not found, skipping")
continue
return False

logger.debug(f"Loading module {module_path}")
with open(module_path, 'r') as f:
Expand All @@ -112,15 +116,15 @@ def compile_document(policy_name, module_list, variables, modules_dir, output_di
logger.debug(f"Template for {policy_name} compiled successfully")
except jinja2.exceptions.TemplateSyntaxError as e:
logger.error(f"Template syntax error in {policy_name}: Line {e.lineno}: {e.message}")
return
return False

# Render the template with the company variables
try:
logger.debug(f"Rendering template for {policy_name}")
rendered_content = template.render(**variables)
except Exception as e:
logger.error(f"Error rendering {policy_name}: {e}")
return
return False

# Create output directory if it doesn't exist
os.makedirs(output_dir, exist_ok=True)
Expand All @@ -131,6 +135,7 @@ def compile_document(policy_name, module_list, variables, modules_dir, output_di
f.write(rendered_content)

logger.info(f"Generated {output_path}")
return True

def main():
parser = argparse.ArgumentParser(description='Generate company documents from templates')
Expand Down Expand Up @@ -164,10 +169,12 @@ def main():
logger.info(f"Using base commit: {base_commit}")
# Here you would implement git operations to checkout the specified commit

# Process each policy
# Process each policy, tracking whether any document failed to generate
any_failed = False
for policy_name, modules in config['policies'].items():
logger.debug(f"Processing policy: {policy_name} with modules: {modules}")
compile_document(policy_name, modules, config.get('variables', {}), args.modules_dir, args.output)
if not compile_document(policy_name, modules, config.get('variables', {}), args.modules_dir, args.output):
any_failed = True

# Process industry-specific documents
industry = config.get('industry')
Expand All @@ -180,9 +187,15 @@ def main():
doc_name = filename[:-3] # Remove .md extension
industry_path = f"industries/{industry}/{doc_name}"
logger.debug(f"Processing industry document: {industry_path}")
compile_document(industry_path, [], config.get('variables', {}), args.modules_dir, args.output)
if not compile_document(industry_path, [], config.get('variables', {}), args.modules_dir, args.output):
any_failed = True
else:
logger.warning(f"Industry directory {industry_dir} not found")
any_failed = True

if any_failed:
logger.error("Document generation finished with errors: some configured documents could not be generated (see warnings above)")
sys.exit(1)

logger.info(f"Document generation complete. Files written to {args.output}/")
except Exception as e:
Expand Down