recce-nightly 0.61.0.20250410__tar.gz → 0.61.0.20250413__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.

Potentially problematic release.


This version of recce-nightly might be problematic. Click here for more details.

Files changed (146) hide show
  1. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/PKG-INFO +1 -1
  2. recce_nightly-0.61.0.20250413/recce/VERSION +1 -0
  3. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/data/404.html +1 -1
  4. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/data/index.html +1 -1
  5. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/data/index.txt +1 -1
  6. recce_nightly-0.61.0.20250413/recce/util/breaking.py +356 -0
  7. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce_nightly.egg-info/PKG-INFO +1 -1
  8. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce_nightly.egg-info/SOURCES.txt +2 -2
  9. recce_nightly-0.61.0.20250410/recce/VERSION +0 -1
  10. recce_nightly-0.61.0.20250410/recce/util/breaking.py +0 -78
  11. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/LICENSE +0 -0
  12. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/README.md +0 -0
  13. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/__init__.py +0 -0
  14. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/adapter/__init__.py +0 -0
  15. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/adapter/base.py +0 -0
  16. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/adapter/dbt_adapter/__init__.py +0 -0
  17. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/adapter/dbt_adapter/dbt_version.py +0 -0
  18. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/adapter/sqlmesh_adapter.py +0 -0
  19. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/apis/__init__.py +0 -0
  20. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/apis/check_api.py +0 -0
  21. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/apis/check_func.py +0 -0
  22. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/apis/run_api.py +0 -0
  23. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/apis/run_func.py +0 -0
  24. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/artifact.py +0 -0
  25. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/cli.py +0 -0
  26. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/config.py +0 -0
  27. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/core.py +0 -0
  28. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/data/_next/static/chunks/269-83bbdbcbd0cc1ddb.js +0 -0
  29. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/data/_next/static/chunks/29e3cc0d-6e3b0cf904a6874d.js +0 -0
  30. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/data/_next/static/chunks/36e1c10d-800596efe83e74a6.js +0 -0
  31. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/data/_next/static/chunks/38610ee6-24a85e2dfb424ddb.js +0 -0
  32. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/data/_next/static/chunks/3998a672-63fc54b2b517ee2b.js +0 -0
  33. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/data/_next/static/chunks/450c323b-b36e745822edebe2.js +0 -0
  34. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/data/_next/static/chunks/47d8844f-0516cea2ef568380.js +0 -0
  35. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/data/_next/static/chunks/6dc81886-9871b611a22bd997.js +0 -0
  36. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/data/_next/static/chunks/783-784ce10322400a48.js +0 -0
  37. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/data/_next/static/chunks/7a8a3e83-dd26fafa0a7421e5.js +0 -0
  38. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/data/_next/static/chunks/7f27ae6c-4ddea120696db611.js +0 -0
  39. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/data/_next/static/chunks/9746af58-527fd8cbd2d17eee.js +0 -0
  40. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/data/_next/static/chunks/a30376cd-1ad5a3f522da896c.js +0 -0
  41. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/data/_next/static/chunks/app/_not-found/page-76f691066176b63a.js +0 -0
  42. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/data/_next/static/chunks/app/layout-fdacc83a3bf974a3.js +0 -0
  43. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/data/_next/static/chunks/app/page-35403e208468490c.js +0 -0
  44. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/data/_next/static/chunks/b63b1b3f-fe714039749c1250.js +0 -0
  45. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/data/_next/static/chunks/c132bf7d-4cb4c4a123e27340.js +0 -0
  46. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/data/_next/static/chunks/c1ceaa8b-64142a5184f1b8b2.js +0 -0
  47. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/data/_next/static/chunks/cd9f8d63-543677b0ef49da87.js +0 -0
  48. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/data/_next/static/chunks/ce84277d-4bca7695ec1ada94.js +0 -0
  49. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/data/_next/static/chunks/e24bf851-5db5db8459b0b291.js +0 -0
  50. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/data/_next/static/chunks/fee69bc6-1df8306af9d11293.js +0 -0
  51. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/data/_next/static/chunks/framework-ded83d71b51ce901.js +0 -0
  52. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/data/_next/static/chunks/main-7183c49fe89a1f9b.js +0 -0
  53. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/data/_next/static/chunks/main-app-cfd795a5fe58bf37.js +0 -0
  54. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/data/_next/static/chunks/pages/_app-9f1049bbd7b90455.js +0 -0
  55. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/data/_next/static/chunks/pages/_error-71ed60313c005df1.js +0 -0
  56. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/data/_next/static/chunks/polyfills-42372ed130431b0a.js +0 -0
  57. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/data/_next/static/chunks/webpack-8a8709fe9d22c323.js +0 -0
  58. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/data/_next/static/css/c9ecb46a4b21c126.css +0 -0
  59. {recce_nightly-0.61.0.20250410/recce/data/_next/static/5buO1HcwjKml_chmOXRDr → recce_nightly-0.61.0.20250413/recce/data/_next/static/hD8g5-RYxHasL_ZuMPw1A}/_buildManifest.js +0 -0
  60. {recce_nightly-0.61.0.20250410/recce/data/_next/static/5buO1HcwjKml_chmOXRDr → recce_nightly-0.61.0.20250413/recce/data/_next/static/hD8g5-RYxHasL_ZuMPw1A}/_ssgManifest.js +0 -0
  61. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/data/_next/static/media/montserrat-cyrillic-800-normal.22628180.woff2 +0 -0
  62. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/data/_next/static/media/montserrat-cyrillic-800-normal.31d693bb.woff +0 -0
  63. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/data/_next/static/media/montserrat-cyrillic-ext-800-normal.7e2c1e62.woff +0 -0
  64. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/data/_next/static/media/montserrat-cyrillic-ext-800-normal.94a63aea.woff2 +0 -0
  65. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/data/_next/static/media/montserrat-latin-800-normal.6f8fa298.woff2 +0 -0
  66. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/data/_next/static/media/montserrat-latin-800-normal.97e20d5e.woff +0 -0
  67. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/data/_next/static/media/montserrat-latin-ext-800-normal.013b84f9.woff2 +0 -0
  68. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/data/_next/static/media/montserrat-latin-ext-800-normal.aff52ab0.woff +0 -0
  69. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/data/_next/static/media/montserrat-vietnamese-800-normal.5f21869b.woff +0 -0
  70. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/data/_next/static/media/montserrat-vietnamese-800-normal.c0035377.woff2 +0 -0
  71. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/data/favicon.ico +0 -0
  72. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/data/imgs/feedback/thumbs-down.png +0 -0
  73. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/data/imgs/feedback/thumbs-up.png +0 -0
  74. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/data/logo/recce-logo-white.png +0 -0
  75. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/diff.py +0 -0
  76. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/event/CONFIG +0 -0
  77. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/event/SENTRY_DNS +0 -0
  78. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/event/__init__.py +0 -0
  79. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/event/collector.py +0 -0
  80. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/event/track.py +0 -0
  81. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/exceptions.py +0 -0
  82. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/git.py +0 -0
  83. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/github.py +0 -0
  84. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/models/__init__.py +0 -0
  85. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/models/check.py +0 -0
  86. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/models/run.py +0 -0
  87. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/models/types.py +0 -0
  88. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/pull_request.py +0 -0
  89. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/run.py +0 -0
  90. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/server.py +0 -0
  91. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/state.py +0 -0
  92. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/summary.py +0 -0
  93. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/tasks/__init__.py +0 -0
  94. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/tasks/core.py +0 -0
  95. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/tasks/dataframe.py +0 -0
  96. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/tasks/histogram.py +0 -0
  97. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/tasks/lineage.py +0 -0
  98. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/tasks/profile.py +0 -0
  99. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/tasks/query.py +0 -0
  100. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/tasks/rowcount.py +0 -0
  101. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/tasks/schema.py +0 -0
  102. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/tasks/top_k.py +0 -0
  103. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/tasks/valuediff.py +0 -0
  104. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/util/__init__.py +0 -0
  105. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/util/cache.py +0 -0
  106. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/util/cll.py +0 -0
  107. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/util/io.py +0 -0
  108. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/util/lineage.py +0 -0
  109. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/util/logger.py +0 -0
  110. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/util/pydantic_model.py +0 -0
  111. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/util/recce_cloud.py +0 -0
  112. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/util/singleton.py +0 -0
  113. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce/yaml/__init__.py +0 -0
  114. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce_nightly.egg-info/dependency_links.txt +0 -0
  115. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce_nightly.egg-info/entry_points.txt +0 -0
  116. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce_nightly.egg-info/requires.txt +0 -0
  117. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/recce_nightly.egg-info/top_level.txt +0 -0
  118. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/setup.cfg +0 -0
  119. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/setup.py +0 -0
  120. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/tests/__init__.py +0 -0
  121. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/tests/adapter/__init__.py +0 -0
  122. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/tests/adapter/dbt_adapter/__init__.py +0 -0
  123. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/tests/adapter/dbt_adapter/conftest.py +0 -0
  124. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/tests/adapter/dbt_adapter/dbt_test_helper.py +0 -0
  125. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/tests/adapter/dbt_adapter/test_dbt_adapter.py +0 -0
  126. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/tests/adapter/dbt_adapter/test_dbt_cll.py +0 -0
  127. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/tests/adapter/dbt_adapter/test_selector.py +0 -0
  128. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/tests/tasks/__init__.py +0 -0
  129. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/tests/tasks/conftest.py +0 -0
  130. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/tests/tasks/test_histogram.py +0 -0
  131. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/tests/tasks/test_lineage.py +0 -0
  132. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/tests/tasks/test_preset_checks.py +0 -0
  133. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/tests/tasks/test_profile.py +0 -0
  134. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/tests/tasks/test_query.py +0 -0
  135. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/tests/tasks/test_row_count.py +0 -0
  136. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/tests/tasks/test_schema.py +0 -0
  137. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/tests/tasks/test_top_k.py +0 -0
  138. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/tests/tasks/test_valuediff.py +0 -0
  139. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/tests/test_cli.py +0 -0
  140. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/tests/test_config.py +0 -0
  141. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/tests/test_core.py +0 -0
  142. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/tests/test_dbt.py +0 -0
  143. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/tests/test_pull_request.py +0 -0
  144. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/tests/test_server.py +0 -0
  145. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/tests/test_state.py +0 -0
  146. {recce_nightly-0.61.0.20250410 → recce_nightly-0.61.0.20250413}/tests/test_summary.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: recce-nightly
3
- Version: 0.61.0.20250410
3
+ Version: 0.61.0.20250413
4
4
  Summary: Environment diff tool for dbt
5
5
  Home-page: https://github.com/InfuseAI/recce
6
6
  Author: InfuseAI Dev Team
@@ -0,0 +1 @@
1
+ 0.61.0.20250413
@@ -1 +1 @@
1
- <!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-8a8709fe9d22c323.js"/><script src="/_next/static/chunks/38610ee6-24a85e2dfb424ddb.js" async=""></script><script src="/_next/static/chunks/783-784ce10322400a48.js" async=""></script><script src="/_next/static/chunks/main-app-cfd795a5fe58bf37.js" async=""></script><meta name="robots" content="noindex"/><title>404: This page could not be found.</title><title>recce</title><meta name="description" content="Recce: Data validation toolkit for comprehensive PR review"/><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><script src="/_next/static/chunks/webpack-8a8709fe9d22c323.js" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0]);self.__next_f.push([2,null])</script><script>self.__next_f.push([1,"1:I[83798,[],\"\"]\n3:I[26375,[],\"\"]\n4:I[22587,[],\"\"]\na:I[114,[],\"\"]\n5:{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"}\n6:{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"}\n7:{\"display\":\"inline-block\"}\n8:{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0}\nb:[]\n"])</script><script>self.__next_f.push([1,"0:[\"$\",\"$L1\",null,{\"buildId\":\"5buO1HcwjKml_chmOXRDr\",\"assetPrefix\":\"\",\"urlParts\":[\"\",\"_not-found\"],\"initialTree\":[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],\"initialSeedData\":[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{},[[\"$L2\",[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":\"404\"}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],null],null],null]},[null,[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\",\"/_not-found\",\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"notFoundStyles\":\"$undefined\"}]],null]},[[null,[\"$\",\"html\",null,{\"lang\":\"en\",\"children\":[\"$\",\"body\",null,{\"suppressHydrationWarning\":true,\"children\":[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":\"$5\",\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":\"$6\",\"children\":\"404\"}],[\"$\",\"div\",null,{\"style\":\"$7\",\"children\":[\"$\",\"h2\",null,{\"style\":\"$8\",\"children\":\"This page could not be found.\"}]}]]}]}]],\"notFoundStyles\":[]}]}]}]],null],null],\"couldBeIntercepted\":false,\"initialHead\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],\"$L9\"],\"globalErrorComponent\":\"$a\",\"missingSlots\":\"$Wb\"}]\n"])</script><script>self.__next_f.push([1,"9:[[\"$\",\"meta\",\"0\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}],[\"$\",\"meta\",\"1\",{\"charSet\":\"utf-8\"}],[\"$\",\"title\",\"2\",{\"children\":\"recce\"}],[\"$\",\"meta\",\"3\",{\"name\":\"description\",\"content\":\"Recce: Data validation toolkit for comprehensive PR review\"}]]\n2:null\n"])</script></body></html>
1
+ <!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-8a8709fe9d22c323.js"/><script src="/_next/static/chunks/38610ee6-24a85e2dfb424ddb.js" async=""></script><script src="/_next/static/chunks/783-784ce10322400a48.js" async=""></script><script src="/_next/static/chunks/main-app-cfd795a5fe58bf37.js" async=""></script><meta name="robots" content="noindex"/><title>404: This page could not be found.</title><title>recce</title><meta name="description" content="Recce: Data validation toolkit for comprehensive PR review"/><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><script src="/_next/static/chunks/webpack-8a8709fe9d22c323.js" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0]);self.__next_f.push([2,null])</script><script>self.__next_f.push([1,"1:I[83798,[],\"\"]\n3:I[26375,[],\"\"]\n4:I[22587,[],\"\"]\na:I[114,[],\"\"]\n5:{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"}\n6:{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"}\n7:{\"display\":\"inline-block\"}\n8:{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0}\nb:[]\n"])</script><script>self.__next_f.push([1,"0:[\"$\",\"$L1\",null,{\"buildId\":\"hD8g5-RYxHasL_ZuMPw1A\",\"assetPrefix\":\"\",\"urlParts\":[\"\",\"_not-found\"],\"initialTree\":[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],\"initialSeedData\":[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{},[[\"$L2\",[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":\"404\"}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],null],null],null]},[null,[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\",\"/_not-found\",\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"notFoundStyles\":\"$undefined\"}]],null]},[[null,[\"$\",\"html\",null,{\"lang\":\"en\",\"children\":[\"$\",\"body\",null,{\"suppressHydrationWarning\":true,\"children\":[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":\"$5\",\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":\"$6\",\"children\":\"404\"}],[\"$\",\"div\",null,{\"style\":\"$7\",\"children\":[\"$\",\"h2\",null,{\"style\":\"$8\",\"children\":\"This page could not be found.\"}]}]]}]}]],\"notFoundStyles\":[]}]}]}]],null],null],\"couldBeIntercepted\":false,\"initialHead\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],\"$L9\"],\"globalErrorComponent\":\"$a\",\"missingSlots\":\"$Wb\"}]\n"])</script><script>self.__next_f.push([1,"9:[[\"$\",\"meta\",\"0\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}],[\"$\",\"meta\",\"1\",{\"charSet\":\"utf-8\"}],[\"$\",\"title\",\"2\",{\"children\":\"recce\"}],[\"$\",\"meta\",\"3\",{\"name\":\"description\",\"content\":\"Recce: Data validation toolkit for comprehensive PR review\"}]]\n2:null\n"])</script></body></html>
@@ -24,4 +24,4 @@
24
24
  transparent 0%,
25
25
  #3182ce 50%,
26
26
  transparent 100%
27
- );position:absolute;will-change:left;min-width:50%;-webkit-animation:animation-11lmxjq 1s ease infinite normal none running;animation:animation-11lmxjq 1s ease infinite normal none running;}@-webkit-keyframes animation-11lmxjq{0%{left:-40%;}100%{left:100%;}}@keyframes animation-11lmxjq{0%{left:-40%;}100%{left:100%;}}</style><div style="width:0%" data-indeterminate="" aria-valuemax="100" aria-valuemin="0" role="progressbar" class="css-h5ends"></div></div></div><div class="css-0"></div></div></div></div><span></span><span id="__chakra_env" hidden=""></span><script src="/_next/static/chunks/webpack-8a8709fe9d22c323.js" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0]);self.__next_f.push([2,null])</script><script>self.__next_f.push([1,"1:HL[\"/_next/static/css/c9ecb46a4b21c126.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"2:I[83798,[],\"\"]\n4:I[49272,[],\"ClientPageRoot\"]\n5:I[12963,[\"266\",\"static/chunks/e24bf851-5db5db8459b0b291.js\",\"517\",\"static/chunks/c1ceaa8b-64142a5184f1b8b2.js\",\"678\",\"static/chunks/3998a672-63fc54b2b517ee2b.js\",\"509\",\"static/chunks/9746af58-527fd8cbd2d17eee.js\",\"648\",\"static/chunks/ce84277d-4bca7695ec1ada94.js\",\"989\",\"static/chunks/47d8844f-0516cea2ef568380.js\",\"147\",\"static/chunks/a30376cd-1ad5a3f522da896c.js\",\"995\",\"static/chunks/fee69bc6-1df8306af9d11293.js\",\"739\",\"static/chunks/7a8a3e83-dd26fafa0a7421e5.js\",\"283\",\"static/chunks/450c323b-b36e745822edebe2.js\",\"303\",\"static/chunks/36e1c10d-800596efe83e74a6.js\",\"22\",\"static/chunks/29e3cc0d-6e3b0cf904a6874d.js\",\"25\",\"static/chunks/b63b1b3f-fe714039749c1250.js\",\"355\",\"static/chunks/7f27ae6c-4ddea120696db611.js\",\"495\",\"static/chunks/6dc81886-9871b611a22bd997.js\",\"599\",\"static/chunks/c132bf7d-4cb4c4a123e27340.js\",\"971\",\"static/chunks/cd9f8d63-543677b0ef49da87.js\",\"269\",\"static/chunks/269-83bbdbcbd0cc1ddb.js\",\"931\",\"static/chunks/app/page-35403e208468490c.js\"],\"default\",1]\n6:I[26375,[],\"\"]\n7:I[22587,[],\"\"]\n9:I[114,[],\"\"]\na:[]\n0:[\"$\",\"$L2\",null,{\"buildId\":\"5buO1HcwjKml_chmOXRDr\",\"assetPrefix\":\"\",\"urlParts\":[\"\",\"\"],\"initialTree\":[\"\",{\"children\":[\"__PAGE__\",{}]},\"$undefined\",\"$undefined\",true],\"initialSeedData\":[\"\",{\"children\":[\"__PAGE__\",{},[[\"$L3\",[\"$\",\"$L4\",null,{\"props\":{\"params\":{},\"searchParams\":{}},\"Component\":\"$5\"}],[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/c9ecb46a4b21c126.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\"}]]],null],null]},[[null,[\"$\",\"html\",null,{\"lang\":\"en\",\"children\":[\"$\",\"body\",null,{\"suppressHydrationWarning\":true,\"children\":[\"$\",\"$L6\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L7\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvet"])</script><script>self.__next_f.push([1,"ica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":\"404\"}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],\"notFoundStyles\":[]}]}]}]],null],null],\"couldBeIntercepted\":false,\"initialHead\":[null,\"$L8\"],\"globalErrorComponent\":\"$9\",\"missingSlots\":\"$Wa\"}]\n"])</script><script>self.__next_f.push([1,"8:[[\"$\",\"meta\",\"0\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}],[\"$\",\"meta\",\"1\",{\"charSet\":\"utf-8\"}],[\"$\",\"title\",\"2\",{\"children\":\"recce\"}],[\"$\",\"meta\",\"3\",{\"name\":\"description\",\"content\":\"Recce: Data validation toolkit for comprehensive PR review\"}],[\"$\",\"link\",\"4\",{\"rel\":\"icon\",\"href\":\"/favicon.ico\",\"type\":\"image/x-icon\",\"sizes\":\"32x32\"}]]\n3:null\n"])</script></body></html>
27
+ );position:absolute;will-change:left;min-width:50%;-webkit-animation:animation-11lmxjq 1s ease infinite normal none running;animation:animation-11lmxjq 1s ease infinite normal none running;}@-webkit-keyframes animation-11lmxjq{0%{left:-40%;}100%{left:100%;}}@keyframes animation-11lmxjq{0%{left:-40%;}100%{left:100%;}}</style><div style="width:0%" data-indeterminate="" aria-valuemax="100" aria-valuemin="0" role="progressbar" class="css-h5ends"></div></div></div><div class="css-0"></div></div></div></div><span></span><span id="__chakra_env" hidden=""></span><script src="/_next/static/chunks/webpack-8a8709fe9d22c323.js" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0]);self.__next_f.push([2,null])</script><script>self.__next_f.push([1,"1:HL[\"/_next/static/css/c9ecb46a4b21c126.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"2:I[83798,[],\"\"]\n4:I[49272,[],\"ClientPageRoot\"]\n5:I[12963,[\"266\",\"static/chunks/e24bf851-5db5db8459b0b291.js\",\"517\",\"static/chunks/c1ceaa8b-64142a5184f1b8b2.js\",\"678\",\"static/chunks/3998a672-63fc54b2b517ee2b.js\",\"509\",\"static/chunks/9746af58-527fd8cbd2d17eee.js\",\"648\",\"static/chunks/ce84277d-4bca7695ec1ada94.js\",\"989\",\"static/chunks/47d8844f-0516cea2ef568380.js\",\"147\",\"static/chunks/a30376cd-1ad5a3f522da896c.js\",\"995\",\"static/chunks/fee69bc6-1df8306af9d11293.js\",\"739\",\"static/chunks/7a8a3e83-dd26fafa0a7421e5.js\",\"283\",\"static/chunks/450c323b-b36e745822edebe2.js\",\"303\",\"static/chunks/36e1c10d-800596efe83e74a6.js\",\"22\",\"static/chunks/29e3cc0d-6e3b0cf904a6874d.js\",\"25\",\"static/chunks/b63b1b3f-fe714039749c1250.js\",\"355\",\"static/chunks/7f27ae6c-4ddea120696db611.js\",\"495\",\"static/chunks/6dc81886-9871b611a22bd997.js\",\"599\",\"static/chunks/c132bf7d-4cb4c4a123e27340.js\",\"971\",\"static/chunks/cd9f8d63-543677b0ef49da87.js\",\"269\",\"static/chunks/269-83bbdbcbd0cc1ddb.js\",\"931\",\"static/chunks/app/page-35403e208468490c.js\"],\"default\",1]\n6:I[26375,[],\"\"]\n7:I[22587,[],\"\"]\n9:I[114,[],\"\"]\na:[]\n0:[\"$\",\"$L2\",null,{\"buildId\":\"hD8g5-RYxHasL_ZuMPw1A\",\"assetPrefix\":\"\",\"urlParts\":[\"\",\"\"],\"initialTree\":[\"\",{\"children\":[\"__PAGE__\",{}]},\"$undefined\",\"$undefined\",true],\"initialSeedData\":[\"\",{\"children\":[\"__PAGE__\",{},[[\"$L3\",[\"$\",\"$L4\",null,{\"props\":{\"params\":{},\"searchParams\":{}},\"Component\":\"$5\"}],[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/c9ecb46a4b21c126.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\"}]]],null],null]},[[null,[\"$\",\"html\",null,{\"lang\":\"en\",\"children\":[\"$\",\"body\",null,{\"suppressHydrationWarning\":true,\"children\":[\"$\",\"$L6\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L7\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvet"])</script><script>self.__next_f.push([1,"ica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":\"404\"}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],\"notFoundStyles\":[]}]}]}]],null],null],\"couldBeIntercepted\":false,\"initialHead\":[null,\"$L8\"],\"globalErrorComponent\":\"$9\",\"missingSlots\":\"$Wa\"}]\n"])</script><script>self.__next_f.push([1,"8:[[\"$\",\"meta\",\"0\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}],[\"$\",\"meta\",\"1\",{\"charSet\":\"utf-8\"}],[\"$\",\"title\",\"2\",{\"children\":\"recce\"}],[\"$\",\"meta\",\"3\",{\"name\":\"description\",\"content\":\"Recce: Data validation toolkit for comprehensive PR review\"}],[\"$\",\"link\",\"4\",{\"rel\":\"icon\",\"href\":\"/favicon.ico\",\"type\":\"image/x-icon\",\"sizes\":\"32x32\"}]]\n3:null\n"])</script></body></html>
@@ -2,6 +2,6 @@
2
2
  3:I[12963,["266","static/chunks/e24bf851-5db5db8459b0b291.js","517","static/chunks/c1ceaa8b-64142a5184f1b8b2.js","678","static/chunks/3998a672-63fc54b2b517ee2b.js","509","static/chunks/9746af58-527fd8cbd2d17eee.js","648","static/chunks/ce84277d-4bca7695ec1ada94.js","989","static/chunks/47d8844f-0516cea2ef568380.js","147","static/chunks/a30376cd-1ad5a3f522da896c.js","995","static/chunks/fee69bc6-1df8306af9d11293.js","739","static/chunks/7a8a3e83-dd26fafa0a7421e5.js","283","static/chunks/450c323b-b36e745822edebe2.js","303","static/chunks/36e1c10d-800596efe83e74a6.js","22","static/chunks/29e3cc0d-6e3b0cf904a6874d.js","25","static/chunks/b63b1b3f-fe714039749c1250.js","355","static/chunks/7f27ae6c-4ddea120696db611.js","495","static/chunks/6dc81886-9871b611a22bd997.js","599","static/chunks/c132bf7d-4cb4c4a123e27340.js","971","static/chunks/cd9f8d63-543677b0ef49da87.js","269","static/chunks/269-83bbdbcbd0cc1ddb.js","931","static/chunks/app/page-35403e208468490c.js"],"default",1]
3
3
  4:I[26375,[],""]
4
4
  5:I[22587,[],""]
5
- 0:["5buO1HcwjKml_chmOXRDr",[[["",{"children":["__PAGE__",{}]},"$undefined","$undefined",true],["",{"children":["__PAGE__",{},[["$L1",["$","$L2",null,{"props":{"params":{},"searchParams":{}},"Component":"$3"}],[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/c9ecb46a4b21c126.css","precedence":"next","crossOrigin":"$undefined"}]]],null],null]},[[null,["$","html",null,{"lang":"en","children":["$","body",null,{"suppressHydrationWarning":true,"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":"404"}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],"notFoundStyles":[]}]}]}]],null],null],["$L6",null]]]]
5
+ 0:["hD8g5-RYxHasL_ZuMPw1A",[[["",{"children":["__PAGE__",{}]},"$undefined","$undefined",true],["",{"children":["__PAGE__",{},[["$L1",["$","$L2",null,{"props":{"params":{},"searchParams":{}},"Component":"$3"}],[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/c9ecb46a4b21c126.css","precedence":"next","crossOrigin":"$undefined"}]]],null],null]},[[null,["$","html",null,{"lang":"en","children":["$","body",null,{"suppressHydrationWarning":true,"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":"404"}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],"notFoundStyles":[]}]}]}]],null],null],["$L6",null]]]]
6
6
  6:[["$","meta","0",{"name":"viewport","content":"width=device-width, initial-scale=1"}],["$","meta","1",{"charSet":"utf-8"}],["$","title","2",{"children":"recce"}],["$","meta","3",{"name":"description","content":"Recce: Data validation toolkit for comprehensive PR review"}],["$","link","4",{"rel":"icon","href":"/favicon.ico","type":"image/x-icon","sizes":"32x32"}]]
7
7
  1:null
@@ -0,0 +1,356 @@
1
+ from dataclasses import dataclass
2
+ from typing import Literal, Optional
3
+
4
+ import sqlglot.expressions as exp
5
+ from sqlglot import parse_one, diff, Dialect
6
+ from sqlglot.diff import Insert, Keep
7
+ from sqlglot.optimizer import optimize, traverse_scope, Scope
8
+
9
+ ChangeCategory = Literal['breaking', 'partial_breaking', 'non_breaking', 'unknown']
10
+ ColumnChangeStatus = Literal['added', 'removed', 'modified']
11
+ VALID_EXPRESSIONS = (
12
+ exp.Where,
13
+ exp.Join,
14
+ exp.Order,
15
+ exp.Group,
16
+ exp.Having,
17
+ exp.Limit,
18
+ exp.Offset,
19
+ exp.Window,
20
+ exp.Union,
21
+ exp.Intersect,
22
+ exp.Except,
23
+ exp.Merge,
24
+ exp.Delete,
25
+ exp.Update,
26
+ exp.Insert,
27
+ exp.Subquery,
28
+ )
29
+
30
+
31
+ @dataclass
32
+ class ChangeCategoryResult:
33
+ category: ChangeCategory
34
+ changed_columns: Optional[dict[str, ColumnChangeStatus]]
35
+
36
+ def __init__(
37
+ self,
38
+ category: ChangeCategory,
39
+ changed_columns: Optional[dict[str, ColumnChangeStatus]] = None
40
+ ):
41
+ self.category = category
42
+ self.changed_columns = changed_columns
43
+
44
+
45
+ CHANGE_CATEGORY_UNKNOWN = ChangeCategoryResult('unknown')
46
+ CHANGE_CATEGORY_BREAKING = ChangeCategoryResult('breaking')
47
+
48
+
49
+ def _debug(*args):
50
+ pass
51
+ # print(*args)
52
+
53
+
54
+ def is_breaking_change(old_sql, new_sql, dialect=None):
55
+ result = parse_change_category(old_sql, new_sql, old_schema=None, new_schema=None, dialect=dialect)
56
+ return result.category != 'non_breaking'
57
+
58
+
59
+ def _is_breaking_change(original_sql, modified_sql, dialect=None) -> bool:
60
+ if original_sql == modified_sql:
61
+ return False
62
+
63
+ try:
64
+ dialect = Dialect.get(dialect)
65
+
66
+ def _parse(sql):
67
+ ast = parse_one(sql, dialect=dialect)
68
+ try:
69
+ ast = optimize(ast, dialect=dialect)
70
+ except Exception:
71
+ # cannot optimize, skip it.
72
+ pass
73
+ return ast
74
+
75
+ original_ast = _parse(original_sql)
76
+ modified_ast = _parse(modified_sql)
77
+ except Exception:
78
+ return True
79
+
80
+ if not isinstance(original_ast, exp.Select) or not isinstance(modified_ast, exp.Select):
81
+ raise ValueError("Currently only SELECT statements are supported for comparison")
82
+
83
+ edits = diff(original_ast, modified_ast, delta_only=True)
84
+
85
+ inserted_expressions = {
86
+ e.expression for e in edits if isinstance(e, Insert)
87
+ }
88
+
89
+ for edit in edits:
90
+ if isinstance(edit, Insert):
91
+ inserted_expr = edit.expression
92
+
93
+ if isinstance(inserted_expr, VALID_EXPRESSIONS):
94
+ return True
95
+
96
+ if isinstance(inserted_expr, exp.UDTF):
97
+ return True
98
+
99
+ if (
100
+ not isinstance(inserted_expr.parent, exp.Select) and
101
+ inserted_expr.parent not in inserted_expressions
102
+ ):
103
+ return True
104
+ elif not isinstance(edit, Keep):
105
+ return True
106
+
107
+ return False
108
+
109
+
110
+ def _diff_select_scope(
111
+ old_scope: Scope,
112
+ new_scope: Scope,
113
+ scope_changes_map: dict[Scope, ChangeCategoryResult]
114
+ ) -> ChangeCategoryResult:
115
+ assert old_scope.expression.key == 'select'
116
+ assert new_scope.expression.key == 'select'
117
+
118
+ result = ChangeCategoryResult('non_breaking')
119
+
120
+ # check if the upstream scopes is the same and not breaking
121
+ if old_scope.sources.keys() != new_scope.sources.keys():
122
+ return CHANGE_CATEGORY_BREAKING
123
+ for source_name, source in new_scope.sources.items():
124
+ if scope_changes_map.get(source) is not None:
125
+ change_category = scope_changes_map[source]
126
+ if change_category.category == 'breaking':
127
+ return CHANGE_CATEGORY_BREAKING
128
+
129
+ # check if non-select expressions are the same
130
+ old_select = old_scope.expression # type: exp.Select
131
+ new_select = new_scope.expression # type: exp.Select
132
+ for arg_key in old_select.args.keys() | new_select.args.keys():
133
+ if arg_key in ['expressions', 'with', 'from']:
134
+ continue
135
+
136
+ if old_select.args.get(arg_key) != new_select.args.get(arg_key):
137
+ return CHANGE_CATEGORY_BREAKING
138
+
139
+ def source_column_change_status(ref_column: exp.Column) -> Optional[ColumnChangeStatus]:
140
+ table_name = ref_column.table
141
+ column_name = ref_column.name
142
+ source = new_scope.sources.get(table_name, None) # type: exp.Table | Scope
143
+ if not isinstance(source, Scope):
144
+ return None
145
+
146
+ ref_change_category = scope_changes_map.get(source)
147
+ if ref_change_category is None:
148
+ return None
149
+
150
+ return ref_change_category.changed_columns.get(column_name)
151
+
152
+ # selects
153
+ old_column_map = {projection.alias_or_name: projection for projection in old_select.selects}
154
+ new_column_map = {projection.alias_or_name: projection for projection in new_select.selects}
155
+ changed_columns = {}
156
+ is_distinct = new_select.args.get('distinct') is not None
157
+
158
+ for column_name in (old_column_map.keys() | new_column_map.keys()):
159
+ def _has_udtf(expr: exp.Expression) -> bool:
160
+ return expr.find(exp.UDTF) is not None
161
+
162
+ def _has_aggregate(expr: exp.Expression) -> bool:
163
+ return expr.find(exp.AggFunc) is not None
164
+
165
+ old_column = old_column_map.get(column_name)
166
+ new_column = new_column_map.get(column_name)
167
+ if old_column is None:
168
+ if is_distinct:
169
+ return CHANGE_CATEGORY_BREAKING
170
+
171
+ if _has_udtf(new_column):
172
+ return CHANGE_CATEGORY_BREAKING
173
+
174
+ changed_columns[column_name] = 'added'
175
+ elif new_column is None:
176
+ if is_distinct:
177
+ return CHANGE_CATEGORY_BREAKING
178
+
179
+ if _has_udtf(old_column):
180
+ return CHANGE_CATEGORY_BREAKING
181
+
182
+ changed_columns[column_name] = 'removed'
183
+ result.category = 'partial_breaking'
184
+ elif old_column != new_column:
185
+ if is_distinct:
186
+ return CHANGE_CATEGORY_BREAKING
187
+
188
+ if _has_udtf(old_column) and _has_udtf(new_column):
189
+ return CHANGE_CATEGORY_BREAKING
190
+
191
+ if _has_aggregate(old_column) != _has_aggregate(new_column):
192
+ return CHANGE_CATEGORY_BREAKING
193
+
194
+ changed_columns[column_name] = 'modified'
195
+ result.category = 'partial_breaking'
196
+ else:
197
+ ref_columns = new_column.find_all(exp.Column)
198
+ for ref_column in ref_columns:
199
+ if source_column_change_status(ref_column) is not None:
200
+ if is_distinct:
201
+ return CHANGE_CATEGORY_BREAKING
202
+ if _has_udtf(new_column):
203
+ return CHANGE_CATEGORY_BREAKING
204
+
205
+ result.category = 'partial_breaking'
206
+ changed_columns[column_name] = 'modified'
207
+
208
+ def selected_column_change_status(ref_column: exp.Column) -> Optional[ColumnChangeStatus]:
209
+ column_name = ref_column.name
210
+ return changed_columns.get(column_name)
211
+
212
+ # joins clause: Reference the source columns
213
+ if new_select.args.get('joins'):
214
+ joins = new_select.args.get('joins')
215
+ for join in joins:
216
+ if isinstance(join, exp.Join):
217
+ for ref_column in join.find_all(exp.Column):
218
+ if source_column_change_status(ref_column) is not None:
219
+ return CHANGE_CATEGORY_BREAKING
220
+
221
+ # where clauses: Reference the source columns
222
+ if new_select.args.get('where'):
223
+ where = new_select.args.get('where')
224
+ if isinstance(where, exp.Where):
225
+ for ref_column in where.find_all(exp.Column):
226
+ if source_column_change_status(ref_column) is not None:
227
+ return CHANGE_CATEGORY_BREAKING
228
+
229
+ # group by clause: Reference the source columns, column index
230
+ if new_select.args.get('group'):
231
+ group = new_select.args.get('group')
232
+ if isinstance(group, exp.Group):
233
+ for ref_column in group.find_all(exp.Column):
234
+ if source_column_change_status(ref_column) is not None:
235
+ return CHANGE_CATEGORY_BREAKING
236
+
237
+ # having clause: Reference the source columns, selected columns
238
+ if new_select.args.get('having'):
239
+ having = new_select.args.get('having')
240
+ if isinstance(having, exp.Having):
241
+ for ref_column in having.find_all(exp.Column):
242
+ if source_column_change_status(ref_column) is not None:
243
+ return CHANGE_CATEGORY_BREAKING
244
+ if selected_column_change_status(ref_column) is not None:
245
+ return CHANGE_CATEGORY_BREAKING
246
+
247
+ # order by clause: Reference the source columns, selected columns, column index
248
+ if new_select.args.get('order'):
249
+ order = new_select.args.get('order')
250
+ if isinstance(order, exp.Order):
251
+ for ref_column in order.find_all(exp.Column):
252
+ if source_column_change_status(ref_column) is not None:
253
+ return CHANGE_CATEGORY_BREAKING
254
+ if selected_column_change_status(ref_column) is not None:
255
+ return CHANGE_CATEGORY_BREAKING
256
+
257
+ result.changed_columns = changed_columns
258
+ return result
259
+
260
+
261
+ def _diff_union_scope(
262
+ old_scope: Scope,
263
+ new_scope: Scope,
264
+ scope_changes_map: dict[Scope, ChangeCategoryResult]
265
+ ) -> ChangeCategoryResult:
266
+ assert old_scope.expression.key == 'union'
267
+ assert new_scope.expression.key == 'union'
268
+ assert len(old_scope.union_scopes) == len(new_scope.union_scopes)
269
+ assert new_scope.union_scopes is not None
270
+ assert len(new_scope.union_scopes) > 0
271
+
272
+ result = scope_changes_map.get(new_scope.union_scopes[0])
273
+ if result.category in ['breaking', 'unknown']:
274
+ return result
275
+
276
+ for sub_scope in new_scope.union_scopes[1:]:
277
+ result_right = scope_changes_map.get(sub_scope)
278
+ if result_right.category in ['breaking', 'unknown']:
279
+ return result_right
280
+ if result_right.category == 'partial_breaking':
281
+ result.category = 'partial_breaking'
282
+ for column_name, column_change_status in result_right.changed_columns.items():
283
+ result.changed_columns[column_name] = column_change_status
284
+
285
+ return result
286
+
287
+
288
+ def parse_change_category(
289
+ old_sql,
290
+ new_sql,
291
+ old_schema=None,
292
+ new_schema=None,
293
+ dialect=None,
294
+ optimizer_rules=None,
295
+ ) -> ChangeCategoryResult:
296
+ if old_sql == new_sql:
297
+ return ChangeCategoryResult('non_breaking')
298
+
299
+ try:
300
+ dialect = Dialect.get(dialect)
301
+
302
+ def _parse(sql, schema):
303
+ exp = parse_one(sql, dialect=dialect)
304
+ if schema:
305
+ try:
306
+ kwargs = {}
307
+ if optimizer_rules is not None:
308
+ kwargs["rules"] = optimizer_rules
309
+ exp = optimize(exp, schema=schema, dialect=dialect, **kwargs)
310
+ except Exception as e:
311
+ # cannot optimize, skip it.
312
+ _debug(e)
313
+ pass
314
+ return exp
315
+
316
+ old_exp = _parse(old_sql, old_schema)
317
+ new_exp = _parse(new_sql, new_schema)
318
+ except Exception as e:
319
+ _debug(e)
320
+ return CHANGE_CATEGORY_UNKNOWN
321
+
322
+ old_scopes = traverse_scope(old_exp)
323
+ new_scopes = traverse_scope(new_exp)
324
+ if len(old_scopes) != len(new_scopes):
325
+ return CHANGE_CATEGORY_BREAKING
326
+
327
+ scope_changes_map = {}
328
+ for old_scope, new_scope in zip(old_scopes, new_scopes):
329
+ if old_scope.expression.key != new_scope.expression.key:
330
+ scope_changes_map[new_scope] = CHANGE_CATEGORY_BREAKING
331
+ continue
332
+ if old_scope == new_scope:
333
+ scope_changes_map[new_scope] = ChangeCategoryResult('non_breaking')
334
+ continue
335
+
336
+ scope_type = old_scope.expression.key
337
+ if scope_type == 'select':
338
+ # CTE, Subquery, Root
339
+ result = _diff_select_scope(old_scope, new_scope, scope_changes_map)
340
+ elif scope_type == 'union':
341
+ # Union
342
+ result = _diff_union_scope(old_scope, new_scope, scope_changes_map)
343
+ else:
344
+ if old_scope.expression != new_scope.expression:
345
+ result = CHANGE_CATEGORY_BREAKING
346
+ else:
347
+ result = ChangeCategoryResult('non_breaking', changed_columns={})
348
+
349
+ if result.category == 'breaking' or result.category == 'unknown':
350
+ return result
351
+
352
+ scope_changes_map[new_scope] = result
353
+ if new_scope.is_root:
354
+ return result
355
+
356
+ return result
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: recce-nightly
3
- Version: 0.61.0.20250410
3
+ Version: 0.61.0.20250413
4
4
  Summary: Environment diff tool for dbt
5
5
  Home-page: https://github.com/InfuseAI/recce
6
6
  Author: InfuseAI Dev Team
@@ -30,8 +30,6 @@ recce/data/404.html
30
30
  recce/data/favicon.ico
31
31
  recce/data/index.html
32
32
  recce/data/index.txt
33
- recce/data/_next/static/5buO1HcwjKml_chmOXRDr/_buildManifest.js
34
- recce/data/_next/static/5buO1HcwjKml_chmOXRDr/_ssgManifest.js
35
33
  recce/data/_next/static/chunks/269-83bbdbcbd0cc1ddb.js
36
34
  recce/data/_next/static/chunks/29e3cc0d-6e3b0cf904a6874d.js
37
35
  recce/data/_next/static/chunks/36e1c10d-800596efe83e74a6.js
@@ -63,6 +61,8 @@ recce/data/_next/static/chunks/app/_not-found/page-76f691066176b63a.js
63
61
  recce/data/_next/static/chunks/pages/_app-9f1049bbd7b90455.js
64
62
  recce/data/_next/static/chunks/pages/_error-71ed60313c005df1.js
65
63
  recce/data/_next/static/css/c9ecb46a4b21c126.css
64
+ recce/data/_next/static/hD8g5-RYxHasL_ZuMPw1A/_buildManifest.js
65
+ recce/data/_next/static/hD8g5-RYxHasL_ZuMPw1A/_ssgManifest.js
66
66
  recce/data/_next/static/media/montserrat-cyrillic-800-normal.22628180.woff2
67
67
  recce/data/_next/static/media/montserrat-cyrillic-800-normal.31d693bb.woff
68
68
  recce/data/_next/static/media/montserrat-cyrillic-ext-800-normal.7e2c1e62.woff
@@ -1 +0,0 @@
1
- 0.61.0.20250410
@@ -1,78 +0,0 @@
1
- from sqlglot.optimizer import optimize
2
-
3
-
4
- def is_breaking_change(original_sql, modified_sql, dialect=None):
5
- if original_sql == modified_sql:
6
- return False
7
-
8
- try:
9
- from sqlglot import parse_one, diff, Dialect
10
- from sqlglot.diff import Insert, Keep
11
- import sqlglot.expressions as exp
12
- except ImportError:
13
- return True
14
-
15
- try:
16
- dialect = Dialect.get(dialect)
17
-
18
- def _parse(sql):
19
- ast = parse_one(sql, dialect=dialect)
20
- try:
21
- ast = optimize(ast, dialect=dialect)
22
- except Exception:
23
- # cannot optimize, skip it.
24
- pass
25
- return ast
26
-
27
- original_ast = _parse(original_sql)
28
- modified_ast = _parse(modified_sql)
29
- except Exception:
30
- return True
31
-
32
- if not isinstance(original_ast, exp.Select) or not isinstance(modified_ast, exp.Select):
33
- raise ValueError("Currently only SELECT statements are supported for comparison")
34
-
35
- edits = diff(original_ast, modified_ast, delta_only=True)
36
-
37
- inserted_expressions = {
38
- e.expression for e in edits if isinstance(e, Insert)
39
- }
40
-
41
- VALID_EXPRESSIONS = (
42
- exp.Where,
43
- exp.Join,
44
- exp.Order,
45
- exp.Group,
46
- exp.Having,
47
- exp.Limit,
48
- exp.Offset,
49
- exp.Window,
50
- exp.Union,
51
- exp.Intersect,
52
- exp.Except,
53
- exp.Merge,
54
- exp.Delete,
55
- exp.Update,
56
- exp.Insert,
57
- exp.Subquery,
58
- )
59
-
60
- for edit in edits:
61
- if isinstance(edit, Insert):
62
- inserted_expr = edit.expression
63
-
64
- if isinstance(inserted_expr, VALID_EXPRESSIONS):
65
- return True
66
-
67
- if isinstance(inserted_expr, exp.UDTF):
68
- return True
69
-
70
- if (
71
- not isinstance(inserted_expr.parent, exp.Select) and
72
- inserted_expr.parent not in inserted_expressions
73
- ):
74
- return True
75
- elif not isinstance(edit, Keep):
76
- return True
77
-
78
- return False