1. import json
  2. import re
  3. def resolve_form_dependencies(form_definition, available_forms=None, max_memory=1024):
  4. """
  5. Resolves dependencies of web forms for diagnostics with limited memory usage.
  6. Args:
  7. form_definition (dict): Dictionary representing the form definition.
  8. e.g., {'name': 'form1', 'dependencies': ['form2', 'form3']}
  9. available_forms (list): List of available form definitions. If None, a simple
  10. default is created.
  11. max_memory (int): Maximum memory usage in MB (for approximate dependency checking).
  12. Returns:
  13. dict: The resolved form definition with dependencies resolved.
  14. Returns None if a circular dependency is detected.
  15. """
  16. if available_forms is None:
  17. available_forms = {} #default if none provided.
  18. resolved_form = form_definition.copy() #work on a copy
  19. def get_form_definition(form_name):
  20. """Retrieves form definition from available forms."""
  21. if form_name in available_forms:
  22. return available_forms[form_name]
  23. else:
  24. return None
  25. def check_circular_dependency(form_name, visited):
  26. """Detects circular dependencies."""
  27. visited.add(form_name)
  28. form = get_form_definition(form_name)
  29. if form and 'dependencies' in form:
  30. for dependency in form['dependencies']:
  31. if dependency in visited:
  32. return True # Circular dependency detected
  33. if check_circular_dependency(dependency, visited):
  34. return True
  35. return False
  36. def resolve_dependencies_recursive(form_name, visited):
  37. """Recursively resolves dependencies for a form."""
  38. form = get_form_definition(form_name)
  39. if not form:
  40. return
  41. if 'dependencies' in form:
  42. for dependency in form['dependencies']:
  43. if check_circular_dependency(dependency, visited):
  44. return None # Circular dependency
  45. resolved_dependency = resolve_dependencies_recursive(dependency, visited.copy())
  46. if resolved_dependency is None:
  47. return None #propagate the error
  48. form['dependencies'] = [d.replace('form', resolved_dependency['name']) for d in form['dependencies']]
  49. return resolved_form
  50. # Basic size estimation (can be refined for better memory management)
  51. if max_memory < 100:
  52. print("Warning: low memory limit. Dependency resolution may be incomplete.")
  53. resolved_form = resolve_dependencies_recursive(resolved_form['name'], set())
  54. return resolved_form
  55. if __name__ == '__main__':
  56. # Example Usage
  57. form1_def = {'name': 'form1', 'label': 'Form 1', 'dependencies': ['form2']}
  58. form2_def = {'name': 'form2', 'label': 'Form 2', 'dependencies': ['form3']}
  59. form3_def = {'name': 'form3', 'label': 'Form 3'}
  60. form4_def = {'name': 'form4', 'label': 'Form 4', 'dependencies': ['form1']} # circular
  61. available_forms = {
  62. 'form1': form1_def,
  63. 'form2': form2_def,
  64. 'form3': form3_def,
  65. 'form4': form4_def
  66. }
  67. resolved_form = resolve_form_dependencies(form1_def, available_forms)
  68. if resolved_form:
  69. print(json.dumps(resolved_form, indent=4))
  70. else:
  71. print("Circular dependency detected.")

Add your comment