path_utils.py 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. # -*- coding:utf-8 -*-
  2. """
  3. DataX 入口侧的路径拼接工具(纯函数,无副作用)。
  4. 集中点:
  5. - job_name_from_ini: ini 路径 → job 名(去目录、去 .ini 扩展)
  6. - json_output_path: ini → json 作业配置输出绝对路径(扁平化 conf/datax-json/{job_name}.json)
  7. - log_path: 日志路径统一模板 {LOG_ROOT_DIR}/{module}/{dt}/{job_name}.log
  8. 对齐 kb/90 §2.5(JSON 路径扁平化)和 §7.2.1(日志路径)。
  9. """
  10. import os
  11. def job_name_from_ini(ini_path: str) -> str:
  12. """
  13. 从 ini 路径提取 job 名(basename 去 .ini 扩展)。
  14. >>> job_name_from_ini('/a/b/c/app_user_cert_info.ini')
  15. 'app_user_cert_info'
  16. >>> job_name_from_ini('jobs/raw/usr/xxx.ini')
  17. 'xxx'
  18. """
  19. basename = os.path.basename(ini_path)
  20. if basename.endswith('.ini'):
  21. basename = basename[:-len('.ini')]
  22. return basename
  23. def json_output_path(base_dir: str, ini_path: str,
  24. start_date: str = None, stop_date: str = None) -> str:
  25. """
  26. 按 ini + 日期区间推导 DataX json 作业配置的输出绝对路径。
  27. 扁平化:{base_dir}/conf/datax-json/{job_name}_{start_date}_{stop_date}.json。
  28. 日期后缀防同 ini 不同 [start, stop) 段并发跑时 json 互相覆盖(DS 同时触发
  29. 多个 backfill / 手动 + 调度并发等场景)。同 ini 同 [start, stop) 并发仍冲突,
  30. 属真正重复任务,按业务约定应让其中一个失败而非容忍。
  31. 缺省 start_date/stop_date 时退回老格式(仅用于 cli gen-json 单文件查看 / 测试)。
  32. """
  33. job = job_name_from_ini(ini_path)
  34. if start_date and stop_date:
  35. suffix = '_{}_{}'.format(start_date, stop_date)
  36. else:
  37. suffix = ''
  38. return os.path.join(base_dir, 'conf', 'datax-json', job + suffix + '.json')
  39. def log_path(log_root_dir: str, module: str, dt: str, job_name: str) -> str:
  40. """
  41. 日志路径:{log_root_dir}/{module}/{dt}/{job_name}.log
  42. """
  43. return os.path.join(log_root_dir, module, dt, job_name + '.log')