evolver-tools 34.0.0__tar.gz → 35.0.0__tar.gz

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.
Files changed (318) hide show
  1. {evolver_tools-34.0.0/src/evolver_tools.egg-info → evolver_tools-35.0.0}/PKG-INFO +20 -4
  2. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/README.md +19 -3
  3. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/pyproject.toml +1 -1
  4. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/cli.py +1 -1
  5. evolver_tools-35.0.0/src/evolver_tools/vendor/chrono.py +275 -0
  6. evolver_tools-35.0.0/src/evolver_tools/vendor/csv_schema.py +174 -0
  7. evolver_tools-35.0.0/src/evolver_tools/vendor/diff_lines.py +166 -0
  8. evolver_tools-35.0.0/src/evolver_tools/vendor/merge_json.py +87 -0
  9. evolver_tools-35.0.0/src/evolver_tools/vendor/validate.py +197 -0
  10. {evolver_tools-34.0.0 → evolver_tools-35.0.0/src/evolver_tools.egg-info}/PKG-INFO +20 -4
  11. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools.egg-info/SOURCES.txt +5 -0
  12. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/LICENSE +0 -0
  13. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/setup.cfg +0 -0
  14. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/__init__.py +0 -0
  15. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/__main__.py +0 -0
  16. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/autoreg.py +0 -0
  17. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/__init__.py +0 -0
  18. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/agent_b_tool.py +0 -0
  19. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/ansi_strip.py +0 -0
  20. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/ansi_to_txt.py +0 -0
  21. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/api_tester.py +0 -0
  22. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/ascii_banner.py +0 -0
  23. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/ascii_gen.py +0 -0
  24. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/audit_log.py +0 -0
  25. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/b64/__init__.py +0 -0
  26. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/b64/b64.py +0 -0
  27. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/backup.py +0 -0
  28. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/banner/__init__.py +0 -0
  29. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/banner/banner.py +0 -0
  30. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/base32.py +0 -0
  31. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/base58.py +0 -0
  32. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/bookmark.py +0 -0
  33. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/cal_tool/__init__.py +0 -0
  34. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/cal_tool/cli.py +0 -0
  35. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/calendar_cli.py +0 -0
  36. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/case_convert.py +0 -0
  37. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/cert_check.py +0 -0
  38. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/cert_info.py +0 -0
  39. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/changelog_gen/__init__.py +0 -0
  40. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/changelog_gen/changelog_gen.py +0 -0
  41. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/changelog_gen.py +0 -0
  42. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/chart_cli/__init__.py +0 -0
  43. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/chart_cli/__main__.py +0 -0
  44. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/checksum_dir.py +0 -0
  45. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/clipboard/__init__.py +0 -0
  46. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/clipboard/clipboard.py +0 -0
  47. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/code_auditor.py +0 -0
  48. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/code_review.py +0 -0
  49. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/code_stats.py +0 -0
  50. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/colorize.py +0 -0
  51. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/colors/__init__.py +0 -0
  52. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/colors/__main__.py +0 -0
  53. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/config_validator.py +0 -0
  54. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/config_vault.py +0 -0
  55. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/cowsay.py +0 -0
  56. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/crc_check.py +0 -0
  57. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/cron/__init__.py +0 -0
  58. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/cron/__main__.py +0 -0
  59. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/cron_check.py +0 -0
  60. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/cron_pretty.py +0 -0
  61. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/crontab_helper.py +0 -0
  62. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/crypto_box.py +0 -0
  63. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/crypto_price.py +0 -0
  64. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/csv2json.py +0 -0
  65. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/csv_dedup.py +0 -0
  66. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/csv_filter.py +0 -0
  67. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/csv_head.py +0 -0
  68. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/csv_merge.py +0 -0
  69. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/csv_pretty.py +0 -0
  70. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/csv_slice.py +0 -0
  71. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/csv_sort.py +0 -0
  72. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/csv_stats/__init__.py +0 -0
  73. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/csv_stats/__main__.py +0 -0
  74. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/csv_stats/analyzer.py +0 -0
  75. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/csv_stats/cli.py +0 -0
  76. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/csv_to_table.py +0 -0
  77. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/csv_validate.py +0 -0
  78. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/csv_view.py +0 -0
  79. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/date_diff.py +0 -0
  80. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/db_mate.py +0 -0
  81. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/db_schema.py +0 -0
  82. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/dedup_files.py +0 -0
  83. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/dep_graph.py +0 -0
  84. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/dev_dashboard.py +0 -0
  85. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/dice_roll.py +0 -0
  86. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/diff_csv.py +0 -0
  87. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/diff_files.py +0 -0
  88. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/diff_tool/__init__.py +0 -0
  89. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/diff_tool/__main__.py +0 -0
  90. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/diff_yaml.py +0 -0
  91. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/dirsize/__init__.py +0 -0
  92. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/disk_cleanup.py +0 -0
  93. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/disk_usage/__init__.py +0 -0
  94. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/disk_usage/disk_usage.py +0 -0
  95. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/dns_lookup.py +0 -0
  96. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/docker_helper.py +0 -0
  97. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/dt_convert.py +0 -0
  98. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/emoji_cli.py +0 -0
  99. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/env_diff.py +0 -0
  100. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/env_manager.py +0 -0
  101. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/env_sorter.py +0 -0
  102. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/env_template.py +0 -0
  103. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/envcheck/__init__.py +0 -0
  104. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/epoch.py +0 -0
  105. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/excel2csv.py +0 -0
  106. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/factor.py +0 -0
  107. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/ff/__init__.py +0 -0
  108. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/ff/__main__.py +0 -0
  109. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/figlet_cli.py +0 -0
  110. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/figlet_tool.py +0 -0
  111. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/file_encrypt.py +0 -0
  112. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/file_find.py +0 -0
  113. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/file_joiner.py +0 -0
  114. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/file_patch.py +0 -0
  115. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/file_splitter.py +0 -0
  116. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/file_type.py +0 -0
  117. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/file_watch.py +0 -0
  118. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/find_dups/__init__.py +0 -0
  119. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/find_dups/cli.py +0 -0
  120. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/find_empty.py +0 -0
  121. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/firewall_rule.py +0 -0
  122. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/fmt/__init__.py +0 -0
  123. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/fmt/fmt.py +0 -0
  124. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/fold.py +0 -0
  125. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/geo_ip.py +0 -0
  126. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/git_branch_cleaner.py +0 -0
  127. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/git_log_pretty.py +0 -0
  128. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/git_stats.py +0 -0
  129. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/gzip_cli.py +0 -0
  130. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/hash_check.py +0 -0
  131. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/hash_file.py +0 -0
  132. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/hashsum/__init__.py +0 -0
  133. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/hashsum/__main__.py +0 -0
  134. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/hex_tool.py +0 -0
  135. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/hexdec.py +0 -0
  136. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/hexdump.py +0 -0
  137. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/html2markdown.py +0 -0
  138. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/html2md.py +0 -0
  139. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/html_strip.py +0 -0
  140. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/http_headers.py +0 -0
  141. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/http_live/__init__.py +0 -0
  142. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/http_live/__main__.py +0 -0
  143. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/http_server.py +0 -0
  144. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/http_status.py +0 -0
  145. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/humanize.py +0 -0
  146. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/image_meta.py +0 -0
  147. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/ini2json.py +0 -0
  148. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/ini_parser/__init__.py +0 -0
  149. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/ini_parser/ini_parser.py +0 -0
  150. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/ip_info.py +0 -0
  151. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/ip_location.py +0 -0
  152. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/ipcalc/__init__.py +0 -0
  153. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/ipcalc/__main__.py +0 -0
  154. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/ipinfo/__init__.py +0 -0
  155. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/ipinfo/__main__.py +0 -0
  156. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/join.py +0 -0
  157. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/joke.py +0 -0
  158. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/jq_lite/__init__.py +0 -0
  159. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/jq_lite/__main__.py +0 -0
  160. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/json2csv/__init__.py +0 -0
  161. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/json2csv/__main__.py +0 -0
  162. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/json2ini.py +0 -0
  163. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/json_diff.py +0 -0
  164. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/json_flatten.py +0 -0
  165. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/json_keys.py +0 -0
  166. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/json_merge.py +0 -0
  167. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/json_patch.py +0 -0
  168. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/json_path.py +0 -0
  169. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/json_pretty/__init__.py +0 -0
  170. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/json_pretty/json_pretty.py +0 -0
  171. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/json_schema_validate.py +0 -0
  172. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/json_sort.py +0 -0
  173. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/json_to_table.py +0 -0
  174. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/json_to_yaml.py +0 -0
  175. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/jsonql/__init__.py +0 -0
  176. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/jsonql/__main__.py +0 -0
  177. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/jwt_decode.py +0 -0
  178. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/key_value_store.py +0 -0
  179. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/license.py +0 -0
  180. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/license_cli/__init__.py +0 -0
  181. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/license_cli/__main__.py +0 -0
  182. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/license_cli/cli.py +0 -0
  183. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/link_check.py +0 -0
  184. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/log_analyzer.py +0 -0
  185. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/log_hawk.py +0 -0
  186. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/log_tail.py +0 -0
  187. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/mac_address.py +0 -0
  188. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/macrogen.py +0 -0
  189. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/markdown_check/__init__.py +0 -0
  190. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/markdown_format.py +0 -0
  191. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/markdown_lint.py +0 -0
  192. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/markdown_preview.py +0 -0
  193. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/markdown_to_html.py +0 -0
  194. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/markdown_toc.py +0 -0
  195. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/math_eval.py +0 -0
  196. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/media_studio.py +0 -0
  197. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/morse.py +0 -0
  198. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/nb/__init__.py +0 -0
  199. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/nb/__main__.py +0 -0
  200. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/net_analyzer.py +0 -0
  201. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/net_speed.py +0 -0
  202. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/network_scan.py +0 -0
  203. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/nl.py +0 -0
  204. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/note_taker.py +0 -0
  205. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/otp_gen.py +0 -0
  206. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/passgen/__init__.py +0 -0
  207. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/password_strength.py +0 -0
  208. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/pdf_info.py +0 -0
  209. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/pdf_text.py +0 -0
  210. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/pipe_viewer.py +0 -0
  211. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/pomodoro.py +0 -0
  212. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/port_scan.py +0 -0
  213. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/portcheck/__init__.py +0 -0
  214. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/portcheck/__main__.py +0 -0
  215. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/pr_tool/__init__.py +0 -0
  216. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/pr_tool/pr_tool.py +0 -0
  217. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/process_kill.py +0 -0
  218. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/progress_bar.py +0 -0
  219. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/project_doctor/__init__.py +0 -0
  220. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/project_doctor/__main__.py +0 -0
  221. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/qc_calc.py +0 -0
  222. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/qc_report.py +0 -0
  223. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/qc_sample.py +0 -0
  224. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/qr_cli.py +0 -0
  225. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/qrcode.py +0 -0
  226. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/quote.py +0 -0
  227. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/quote_tool/__init__.py +0 -0
  228. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/quote_tool/quote.py +0 -0
  229. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/rainbow.py +0 -0
  230. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/random.py +0 -0
  231. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/random_cli.py +0 -0
  232. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/random_string.py +0 -0
  233. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/reminder.py +0 -0
  234. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/ren/__init__.py +0 -0
  235. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/ren/__main__.py +0 -0
  236. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/replace_text.py +0 -0
  237. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/restore.py +0 -0
  238. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/rot13.py +0 -0
  239. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/route_trace.py +0 -0
  240. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/scan_open_ports.py +0 -0
  241. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/scan_ports.py +0 -0
  242. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/screen_recorder.py +0 -0
  243. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/screenshot_cli.py +0 -0
  244. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/search_files.py +0 -0
  245. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/search_history.py +0 -0
  246. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/secret_scanner.py +0 -0
  247. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/seq.py +0 -0
  248. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/service_check.py +0 -0
  249. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/shuffle.py +0 -0
  250. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/siege_lite/__init__.py +0 -0
  251. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/siege_lite/__main__.py +0 -0
  252. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/slugify.py +0 -0
  253. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/smellfinder/__init__.py +0 -0
  254. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/smellfinder/__main__.py +0 -0
  255. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/sort/__init__.py +0 -0
  256. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/sort/sort.py +0 -0
  257. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/spinner.py +0 -0
  258. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/split.py +0 -0
  259. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/split_tool/__init__.py +0 -0
  260. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/split_tool/split.py +0 -0
  261. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/sql2csv.py +0 -0
  262. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/sqlite_cli/__init__.py +0 -0
  263. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/sqlite_cli/__main__.py +0 -0
  264. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/ssh_key_gen.py +0 -0
  265. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/ssl_check.py +0 -0
  266. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/stopwatch.py +0 -0
  267. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/subnet.py +0 -0
  268. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/sysmon/__init__.py +0 -0
  269. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/sysmon/__main__.py +0 -0
  270. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/sysmon_pro.py +0 -0
  271. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/system_info.py +0 -0
  272. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/temp_cleaner.py +0 -0
  273. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/template.py +0 -0
  274. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/text_dedent.py +0 -0
  275. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/text_stats.py +0 -0
  276. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/text_wrap.py +0 -0
  277. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/time_duration.py +0 -0
  278. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/timeout.py +0 -0
  279. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/timer/__init__.py +0 -0
  280. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/timer_pro/__init__.py +0 -0
  281. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/timer_pro/timer_pro.py +0 -0
  282. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/timer_pro.py +0 -0
  283. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/todo_cli.py +0 -0
  284. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/toml2json.py +0 -0
  285. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/tr.py +0 -0
  286. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/tree.py +0 -0
  287. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/treedir/__init__.py +0 -0
  288. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/treedir/__main__.py +0 -0
  289. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/tsv2csv.py +0 -0
  290. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/uniq_tool/__init__.py +0 -0
  291. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/uniq_tool/uniq.py +0 -0
  292. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/unit_convert.py +0 -0
  293. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/uri_encode.py +0 -0
  294. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/url_parser.py +0 -0
  295. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/urlparse_tool/__init__.py +0 -0
  296. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/urlparse_tool/cli.py +0 -0
  297. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/uuid_gen.py +0 -0
  298. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/uuid_tool/__init__.py +0 -0
  299. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/uuid_tool/__main__.py +0 -0
  300. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/watch.py +0 -0
  301. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/weather_cli.py +0 -0
  302. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/web_download.py +0 -0
  303. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/web_summary/__init__.py +0 -0
  304. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/web_summary/__main__.py +0 -0
  305. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/whois_lookup.py +0 -0
  306. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/wordcount/__init__.py +0 -0
  307. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/wordcount/__main__.py +0 -0
  308. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/world_clock.py +0 -0
  309. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/xml2json.py +0 -0
  310. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/xml_format.py +0 -0
  311. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/yaml2json/__init__.py +0 -0
  312. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/yaml2json/yaml2json.py +0 -0
  313. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/yaml2toml.py +0 -0
  314. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/yaml_validate.py +0 -0
  315. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools/vendor/yes.py +0 -0
  316. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools.egg-info/dependency_links.txt +0 -0
  317. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools.egg-info/entry_points.txt +0 -0
  318. {evolver_tools-34.0.0 → evolver_tools-35.0.0}/src/evolver_tools.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: evolver-tools
3
- Version: 34.0.0
3
+ Version: 35.0.0
4
4
  Summary: 244 CLI tools + 9 flagship projects — one pip install
5
5
  Author: EVOLVER
6
6
  License-Expression: MIT
@@ -22,9 +22,9 @@ Dynamic: license-file
22
22
 
23
23
  # EVOLVER Tools
24
24
 
25
- **244 CLI tools + 9 flagship projects — one `pip install`.**
25
+ **249 CLI tools + 9 flagship projects — one `pip install`.**
26
26
 
27
- Zero-dependency (240/244), cross-platform, production-ready. Version **34.0.0**.
27
+ Zero-dependency (245/249), cross-platform, production-ready. Version **35.0.0**.
28
28
  Systems ops, data processing, text manipulation, security, dev tooling, and creative utilities.
29
29
  All in a single install — not 239 separate packages.
30
30
 
@@ -32,7 +32,7 @@ All in a single install — not 239 separate packages.
32
32
 
33
33
  ```bash
34
34
  pip install evolver-tools
35
- evtool list # Show all 244 tools
35
+ evtool list # Show all 249 tools
36
36
  evtool sysmon # Launch system monitor
37
37
  evtool ff < data.txt # Fuzzy search through data
38
38
  evtool csv-stats data.csv # Analyze CSV columns
@@ -299,6 +299,22 @@ evolver-tools is **MIT open source** and free forever for all tools.
299
299
 
300
300
  👉 [View full pricing page](https://evolver-dev.github.io/evolver-tools/pricing/) — feature comparison, testimonials, and FAQ.
301
301
 
302
+ ## Changelog
303
+
304
+ ### v35.0.0 — 2026-06-01 (+5 tools, 249 total)
305
+ - **merge-json** — Deep merge multiple JSON files (arrays concatenate, dicts recurse)
306
+ - **validate** — Generic file validator (JSON/YAML/CSV/TOML/XML auto-detect)
307
+ - **diff-lines** — Line-by-line diff between two files (color, side-by-side)
308
+ - **csv-schema** — Infer CSV schema (column types, nulls, stats, samples)
309
+ - **chrono** — Advanced date/time calculator (durations, workdays, ranges, age)
310
+
311
+ ### v34.0.0 — 2026-06-01 (+5 tools, 244 total)
312
+ - **emoji-cli** — Search and display emoji (230+ emoji, categories, --random)
313
+ - **html-strip** — Strip HTML tags, extract plain text (stdin/file, --preserve-links)
314
+ - **json-patch** — Apply JSON Patch (RFC 6902) operations to JSON files
315
+ - **markdown-format** — Format/beautify Markdown tables and lists
316
+ - **ansi-to-txt** — Strip ANSI escape codes, convert to plain text
317
+
302
318
  Support the project via one-time purchase (¥79) or monthly sponsorship on [GitHub Sponsors](https://github.com/sponsors/evolver-dev).
303
319
 
304
320
  ## Links
@@ -1,8 +1,8 @@
1
1
  # EVOLVER Tools
2
2
 
3
- **244 CLI tools + 9 flagship projects — one `pip install`.**
3
+ **249 CLI tools + 9 flagship projects — one `pip install`.**
4
4
 
5
- Zero-dependency (240/244), cross-platform, production-ready. Version **34.0.0**.
5
+ Zero-dependency (245/249), cross-platform, production-ready. Version **35.0.0**.
6
6
  Systems ops, data processing, text manipulation, security, dev tooling, and creative utilities.
7
7
  All in a single install — not 239 separate packages.
8
8
 
@@ -10,7 +10,7 @@ All in a single install — not 239 separate packages.
10
10
 
11
11
  ```bash
12
12
  pip install evolver-tools
13
- evtool list # Show all 244 tools
13
+ evtool list # Show all 249 tools
14
14
  evtool sysmon # Launch system monitor
15
15
  evtool ff < data.txt # Fuzzy search through data
16
16
  evtool csv-stats data.csv # Analyze CSV columns
@@ -277,6 +277,22 @@ evolver-tools is **MIT open source** and free forever for all tools.
277
277
 
278
278
  👉 [View full pricing page](https://evolver-dev.github.io/evolver-tools/pricing/) — feature comparison, testimonials, and FAQ.
279
279
 
280
+ ## Changelog
281
+
282
+ ### v35.0.0 — 2026-06-01 (+5 tools, 249 total)
283
+ - **merge-json** — Deep merge multiple JSON files (arrays concatenate, dicts recurse)
284
+ - **validate** — Generic file validator (JSON/YAML/CSV/TOML/XML auto-detect)
285
+ - **diff-lines** — Line-by-line diff between two files (color, side-by-side)
286
+ - **csv-schema** — Infer CSV schema (column types, nulls, stats, samples)
287
+ - **chrono** — Advanced date/time calculator (durations, workdays, ranges, age)
288
+
289
+ ### v34.0.0 — 2026-06-01 (+5 tools, 244 total)
290
+ - **emoji-cli** — Search and display emoji (230+ emoji, categories, --random)
291
+ - **html-strip** — Strip HTML tags, extract plain text (stdin/file, --preserve-links)
292
+ - **json-patch** — Apply JSON Patch (RFC 6902) operations to JSON files
293
+ - **markdown-format** — Format/beautify Markdown tables and lists
294
+ - **ansi-to-txt** — Strip ANSI escape codes, convert to plain text
295
+
280
296
  Support the project via one-time purchase (¥79) or monthly sponsorship on [GitHub Sponsors](https://github.com/sponsors/evolver-dev).
281
297
 
282
298
  ## Links
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "evolver-tools"
7
- version = "34.0.0"
7
+ version = "35.0.0"
8
8
  description = "244 CLI tools + 9 flagship projects — one pip install"
9
9
  readme = "README.md"
10
10
  license = "MIT"
@@ -14,7 +14,7 @@ from evolver_tools.autoreg import auto_discover
14
14
  def list_tools():
15
15
  """Display all available tools."""
16
16
  tools = auto_discover()
17
- print(f'\x1b[1;36m===== EVOLVER Tools v34.0.0 =====\x1b[0m')
17
+ print(f'\x1b[1;36m===== EVOLVER Tools v35.0.0 =====\x1b[0m')
18
18
  print()
19
19
  for name, info in sorted(tools.items()):
20
20
  print(f' \033[1;33m{name:<18}\033[0m {info["desc"]}')
@@ -0,0 +1,275 @@
1
+ #!/usr/bin/env python3
2
+ """chrono — Advanced date/time calculator.
3
+
4
+ Calculate durations, add/subtract time, find business days,
5
+ convert timezones, and generate date ranges.
6
+
7
+ Usage:
8
+ chrono now # Current timestamp
9
+ chrono days 2024-01-01 2024-12-31 # Days between dates
10
+ chrono add 2024-01-01 90 days # Add/subtract time
11
+ chrono workdays 2024-01-01 2024-12-31 # Business days between dates
12
+ chrono range 2024-01-01 2024-01-31 3d # Generate date range with step
13
+ chrono age 1990-06-15 # Age from birthdate
14
+ """
15
+
16
+ import sys
17
+ import os
18
+ import re
19
+ from datetime import datetime, date, timedelta
20
+
21
+ TOOL_META = {
22
+ "name": "chrono",
23
+ "func": "main",
24
+ "desc": "Advanced date/time calculator (durations, business days, ranges, age)",
25
+ }
26
+
27
+ WEEKDAYS = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]
28
+ MONTHS = ["Jan", "Feb", "Mar", "Apr", "May", "Jun",
29
+ "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
30
+
31
+ UNITS = {
32
+ "d": "days", "day": "days", "days": "days",
33
+ "w": "weeks", "week": "weeks", "weeks": "weeks",
34
+ "m": "months", "month": "months", "months": "months",
35
+ "y": "years", "year": "years", "years": "years",
36
+ }
37
+
38
+
39
+ def parse_date(s):
40
+ """Parse a date string into a date object."""
41
+ s = s.strip().strip('"').strip("'")
42
+
43
+ if s.lower() in ("now", "today"):
44
+ return date.today()
45
+
46
+ formats = [
47
+ "%Y-%m-%d", "%Y/%m/%d", "%d-%m-%Y", "%d/%m/%Y",
48
+ "%m-%d-%Y", "%m/%d/%Y", "%Y%m%d",
49
+ ]
50
+ for fmt in formats:
51
+ try:
52
+ return datetime.strptime(s, fmt).date()
53
+ except ValueError:
54
+ continue
55
+ print(f"Error: cannot parse date '{s}'", file=sys.stderr)
56
+ print("Supported formats: YYYY-MM-DD, YYYY/MM/DD, DD-MM-YYYY", file=sys.stderr)
57
+ sys.exit(1)
58
+
59
+
60
+ def parse_delta(s):
61
+ """Parse a time delta string like '90 days', '2w', '3m', '1y'."""
62
+ s = s.strip()
63
+ m = re.match(r"^(-?\d+)\s*(day|days|d|week|weeks|w|month|months|m|year|years|y)$", s, re.I)
64
+ if not m:
65
+ print(f"Error: cannot parse duration '{s}'", file=sys.stderr)
66
+ print("Examples: 90 days, 2w, 3m, 1y, -7d", file=sys.stderr)
67
+ sys.exit(1)
68
+
69
+ num = int(m.group(1))
70
+ unit = m.group(2).lower()
71
+
72
+ if unit in ("d", "day", "days"):
73
+ return timedelta(days=num)
74
+ elif unit in ("w", "week", "weeks"):
75
+ return timedelta(weeks=num)
76
+ else:
77
+ # For months/years, return a proxy that we handle specially
78
+ return ("month_year", num, unit in ("y", "year", "years"))
79
+
80
+
81
+ def format_date(d):
82
+ """Format a date nicely."""
83
+ return f"{WEEKDAYS[d.weekday()]}, {d.strftime('%Y-%m-%d')}"
84
+
85
+
86
+ def cmd_now(*_):
87
+ now = datetime.now()
88
+ d = now.date()
89
+ t = now.time()
90
+ print(f"Today: {format_date(d)}")
91
+ print(f"Time: {t.strftime('%H:%M:%S')}")
92
+ print(f"ISO: {now.isoformat()}")
93
+ print(f"Epoch: {int(now.timestamp())}")
94
+ print(f"DOY: {d.timetuple().tm_yday}/366")
95
+
96
+
97
+ def cmd_days(args):
98
+ if len(args) < 2:
99
+ print("Usage: chrono days <date1> <date2>", file=sys.stderr)
100
+ sys.exit(1)
101
+ d1 = parse_date(args[0])
102
+ d2 = parse_date(args[1])
103
+ delta = (d2 - d1).days
104
+ print(f"{format_date(d1)} → {format_date(d2)}")
105
+ print(f"Difference: {abs(delta)} day{'s' if abs(delta) != 1 else ''}")
106
+ if delta < 0:
107
+ print("Direction: backward")
108
+ elif delta > 0:
109
+ print("Direction: forward")
110
+
111
+
112
+ def cmd_add(args):
113
+ if len(args) < 1:
114
+ print("Usage: chrono add <date> <delta> [--format ISO|full]", file=sys.stderr)
115
+ sys.exit(1)
116
+ d = parse_date(args[0])
117
+
118
+ if len(args) >= 2:
119
+ delta = parse_delta(args[1])
120
+ if isinstance(delta, tuple):
121
+ _, num, is_year = delta
122
+ if is_year:
123
+ new_year = d.year + num
124
+ try:
125
+ d = d.replace(year=new_year)
126
+ except ValueError:
127
+ # Handle Feb 29 edge case
128
+ import calendar
129
+ last_day = calendar.monthrange(new_year, d.month)[1]
130
+ d = d.replace(year=new_year, day=min(d.day, last_day))
131
+ else:
132
+ new_month = d.month + num
133
+ year_shift = (new_month - 1) // 12
134
+ new_month = ((new_month - 1) % 12) + 1
135
+ new_year = d.year + year_shift
136
+ import calendar
137
+ last_day = calendar.monthrange(new_year, new_month)[1]
138
+ d = d.replace(year=new_year, month=new_month, day=min(d.day, last_day))
139
+ else:
140
+ d = d + delta
141
+
142
+ show_fmt = "--format" in args
143
+ if show_fmt:
144
+ idx = args.index("--format")
145
+ fmt_type = args[idx + 1] if idx + 1 < len(args) else "full"
146
+
147
+ print(format_date(d))
148
+
149
+
150
+ def cmd_workdays(args):
151
+ if len(args) < 2:
152
+ print("Usage: chrono workdays <date1> <date2>", file=sys.stderr)
153
+ sys.exit(1)
154
+ d1 = parse_date(args[0])
155
+ d2 = parse_date(args[1])
156
+
157
+ if d1 > d2:
158
+ d1, d2 = d2, d1
159
+
160
+ count = 0
161
+ current = d1
162
+ while current <= d2:
163
+ if current.weekday() < 5: # Mon-Fri
164
+ count += 1
165
+ current += timedelta(days=1)
166
+
167
+ print(f"{format_date(d1)} → {format_date(d2)}")
168
+ print(f"Calendar days: {(d2 - d1).days}")
169
+ print(f"Workdays: {count}")
170
+ print(f"Weekends: {(d2 - d1).days - count}")
171
+
172
+
173
+ def cmd_range(args):
174
+ if len(args) < 2:
175
+ print("Usage: chrono range <start> <end> [step]", file=sys.stderr)
176
+ print(" step examples: 1d (default), 2d, 1w, 1m")
177
+ sys.exit(1)
178
+
179
+ start = parse_date(args[0])
180
+ end = parse_date(args[1])
181
+
182
+ step_delta = timedelta(days=1)
183
+ if len(args) >= 3:
184
+ delta = parse_delta(args[2])
185
+ if isinstance(delta, tuple):
186
+ print("Error: step must be days or weeks only", file=sys.stderr)
187
+ sys.exit(1)
188
+ step_delta = delta
189
+ if step_delta.days <= 0:
190
+ print("Error: step must be positive", file=sys.stderr)
191
+ sys.exit(1)
192
+
193
+ current = start
194
+ count = 0
195
+ while current <= end:
196
+ print(format_date(current))
197
+ current += step_delta
198
+ count += 1
199
+
200
+ print(f"\n{count} dates in range")
201
+
202
+
203
+ def cmd_age(args):
204
+ if not args:
205
+ print("Usage: chrono age <birthdate> [reference_date]", file=sys.stderr)
206
+ sys.exit(1)
207
+
208
+ birth = parse_date(args[0])
209
+ ref = parse_date(args[1]) if len(args) >= 2 else date.today()
210
+
211
+ if birth > ref:
212
+ print(f"Error: birthdate {birth} is after reference date {ref}", file=sys.stderr)
213
+ sys.exit(1)
214
+
215
+ years = ref.year - birth.year
216
+ months = ref.month - birth.month
217
+ days = ref.day - birth.day
218
+
219
+ if days < 0:
220
+ months -= 1
221
+ import calendar
222
+ days += calendar.monthrange(ref.year, ref.month - 1 if ref.month > 1 else 12)[0]
223
+ if months < 0:
224
+ years -= 1
225
+ months += 12
226
+
227
+ total_days = (ref - birth).days
228
+
229
+ print(f"Birth: {format_date(birth)}")
230
+ print(f"Reference: {format_date(ref)}")
231
+ print(f"Age: {years} years, {months} months, {days} days")
232
+ print(f"Total days: {total_days}")
233
+
234
+
235
+ COMMANDS = {
236
+ "now": cmd_now,
237
+ "days": cmd_days,
238
+ "add": cmd_add,
239
+ "workdays": cmd_workdays,
240
+ "range": cmd_range,
241
+ "age": cmd_age,
242
+ }
243
+
244
+
245
+ def main():
246
+ args = sys.argv[1:]
247
+
248
+ if not args or args[0] in ("-h", "--help"):
249
+ print("Usage: chrono <command> [args...]")
250
+ print()
251
+ print("Commands:")
252
+ print(" now Current date/time info")
253
+ print(" days <d1> <d2> Days between two dates")
254
+ print(" add <date> <delta> Add/subtract time (90d, 2w, 3m, 1y, -7d)")
255
+ print(" workdays <d1> <d2> Business days between dates")
256
+ print(" range <start> <end> [step] Generate date range")
257
+ print(" age <birthdate> [ref] Calculate age")
258
+ print()
259
+ print("Date formats: YYYY-MM-DD (YYYY/MM/DD, DD-MM-YYYY)")
260
+ print(" 'now' or 'today' for current date")
261
+ return
262
+
263
+ cmd = args[0]
264
+ cmd_args = args[1:]
265
+
266
+ if cmd not in COMMANDS:
267
+ print(f"Error: unknown command '{cmd}'", file=sys.stderr)
268
+ print(f"Available: {', '.join(COMMANDS.keys())}", file=sys.stderr)
269
+ sys.exit(1)
270
+
271
+ COMMANDS[cmd](cmd_args)
272
+
273
+
274
+ if __name__ == "__main__":
275
+ main()
@@ -0,0 +1,174 @@
1
+ #!/usr/bin/env python3
2
+ """csv-schema — Infer CSV schema from a CSV file.
3
+
4
+ Detects column names, inferred types, null counts,
5
+ distinct values, min/max for numerics, and sample values.
6
+
7
+ Usage:
8
+ csv-schema data.csv
9
+ csv-schema --detailed data.csv
10
+ csv-schema --summary data.csv
11
+ """
12
+
13
+ import csv
14
+ import sys
15
+ import os
16
+
17
+ TOOL_META = {
18
+ "name": "csv-schema",
19
+ "func": "main",
20
+ "desc": "Infer CSV schema (column types, nulls, stats, samples)",
21
+ }
22
+
23
+
24
+ def infer_type(values):
25
+ """Infer the most specific type for a list of non-empty string values."""
26
+ non_empty = [v for v in values if v.strip()]
27
+ if not non_empty:
28
+ return "empty"
29
+
30
+ # Check boolean first (strict: only true/false/yes/no/0/1)
31
+ bool_vals = {"true", "false", "yes", "no"}
32
+ if all(v.strip().lower() in bool_vals for v in non_empty):
33
+ return "boolean"
34
+
35
+ # Check integer
36
+ all_int = True
37
+ for v in non_empty:
38
+ try:
39
+ int(v.strip())
40
+ except ValueError:
41
+ all_int = False
42
+ break
43
+ if all_int:
44
+ return "integer"
45
+
46
+ # Check float
47
+ all_float = True
48
+ for v in non_empty:
49
+ try:
50
+ float(v.strip())
51
+ except ValueError:
52
+ all_float = False
53
+ break
54
+ if all_float:
55
+ return "float"
56
+
57
+ # Check date patterns (YYYY-MM-DD, DD/MM/YYYY, MM/DD/YYYY)
58
+ import re
59
+ date_pat = re.compile(r"^\d{4}-\d{2}-\d{2}$|^\d{2}/\d{2}/\d{4}$|^\d{4}/\d{2}/\d{2}$")
60
+ if all(date_pat.match(v.strip()) for v in non_empty):
61
+ return "date"
62
+
63
+ return "string"
64
+
65
+
66
+ def analyze_column(values):
67
+ """Analyze a column's values."""
68
+ non_empty = [v for v in values if v.strip()]
69
+ empty_count = len(values) - len(non_empty)
70
+ distinct = len(set(values))
71
+
72
+ inferred = infer_type(values)
73
+ stats = {"type": inferred, "nulls": empty_count, "non_null": len(non_empty),
74
+ "distinct": distinct, "total": len(values)}
75
+
76
+ if inferred in ("integer", "float"):
77
+ nums = []
78
+ for v in non_empty:
79
+ try:
80
+ nums.append(float(v.strip()))
81
+ except ValueError:
82
+ continue
83
+ if nums:
84
+ stats["min"] = min(nums)
85
+ stats["max"] = max(nums)
86
+ stats["mean"] = sum(nums) / len(nums)
87
+
88
+ # Sample values (up to 5)
89
+ seen = set()
90
+ samples = []
91
+ for v in values:
92
+ if v.strip() and v not in seen:
93
+ samples.append(v[:60])
94
+ seen.add(v)
95
+ if len(samples) >= 5:
96
+ break
97
+ stats["samples"] = samples
98
+
99
+ return stats
100
+
101
+
102
+ def main():
103
+ args = sys.argv[1:]
104
+
105
+ if not args or args[0] in ("-h", "--help"):
106
+ print("Usage: csv-schema <file.csv> [--detailed] [--summary]")
107
+ print("Analyze CSV structure: types, nulls, distinct values.")
108
+ print(" --detailed Show per-column stats")
109
+ print(" --summary Show brief column list only")
110
+ sys.exit(0)
111
+
112
+ path = args[0]
113
+ detailed = "--detailed" in args
114
+ summary = "--summary" in args
115
+
116
+ if not os.path.exists(path):
117
+ print(f"Error: file not found — {path}", file=sys.stderr)
118
+ sys.exit(1)
119
+
120
+ try:
121
+ with open(path, newline="", encoding="utf-8", errors="replace") as f:
122
+ reader = csv.reader(f)
123
+ header = next(reader, None)
124
+ if not header:
125
+ print("Error: empty CSV file (no header)", file=sys.stderr)
126
+ sys.exit(1)
127
+
128
+ rows = list(reader)
129
+ except Exception as e:
130
+ print(f"Error reading CSV: {e}", file=sys.stderr)
131
+ sys.exit(1)
132
+
133
+ num_cols = len(header)
134
+ num_rows = len(rows)
135
+
136
+ print(f"CSV Schema: {os.path.basename(path)}")
137
+ print(f" Columns: {num_cols}")
138
+ print(f" Rows: {num_rows}")
139
+ print()
140
+
141
+ if summary:
142
+ print(f"{'#':>3} {'Name':<25} {'Type':<10}")
143
+ print(f"{'---':>3} {'----':<25} {'----':<10}")
144
+ for i, col in enumerate(header, 1):
145
+ values = [r[i - 1] if i - 1 < len(r) else "" for r in rows]
146
+ t = infer_type(values)
147
+ print(f"{i:>3} {col:<25} {t:<10}")
148
+ return
149
+
150
+ # Detailed output
151
+ for i, col in enumerate(header, 1):
152
+ values = [r[i - 1] if i - 1 < len(r) else "" for r in rows]
153
+ stats = analyze_column(values)
154
+
155
+ print(f"[{i}] {col}")
156
+ print(f" Type: {stats['type']}")
157
+ print(f" Non-null: {stats['non_null']}/{stats['total']}")
158
+ null_pct = (stats['nulls'] / stats['total'] * 100) if stats['total'] else 0
159
+ if stats['nulls']:
160
+ print(f" Nulls: {stats['nulls']} ({null_pct:.1f}%)")
161
+ print(f" Distinct: {stats['distinct']}")
162
+
163
+ if "min" in stats and "max" in stats:
164
+ print(f" Range: {stats['min']} — {stats['max']}")
165
+ if "mean" in stats:
166
+ print(f" Mean: {stats['mean']:.2f}")
167
+
168
+ if stats['samples']:
169
+ print(f" Samples: {', '.join(stats['samples'])}")
170
+ print()
171
+
172
+
173
+ if __name__ == "__main__":
174
+ main()