recce-nightly 0.57.0.20250310__py3-none-any.whl → 0.58.0.20250312__py3-none-any.whl

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.

recce/data/index.html CHANGED
@@ -1,4 +1,4 @@
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="image" href="/logo/recce-logo-white.png"/><link rel="stylesheet" href="/_next/static/css/c9ecb46a4b21c126.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-5ab3237140d2c0f8.js"/><script src="/_next/static/chunks/523b8219-cd28a6efac8e1cf1.js" async=""></script><script src="/_next/static/chunks/921-4158ef2dc23e4a01.js" async=""></script><script src="/_next/static/chunks/main-app-6f45568a6a7cd7b0.js" async=""></script><script src="/_next/static/chunks/e24bf851-38fffe87a7b8784a.js" async=""></script><script src="/_next/static/chunks/c1ceaa8b-c4f0232ef5c2c9ba.js" async=""></script><script src="/_next/static/chunks/3998a672-18454f939c052b39.js" async=""></script><script src="/_next/static/chunks/9746af58-344daabf5df08121.js" async=""></script><script src="/_next/static/chunks/ce84277d-3cee88b51629d895.js" async=""></script><script src="/_next/static/chunks/47d8844f-cac2989cb39ba350.js" async=""></script><script src="/_next/static/chunks/a30376cd-0e2abcaded0e4cfc.js" async=""></script><script src="/_next/static/chunks/fee69bc6-4490eb47d2aaaa72.js" async=""></script><script src="/_next/static/chunks/7a8a3e83-1a4edb77e4d0142d.js" async=""></script><script src="/_next/static/chunks/450c323b-ff537c106edf3f59.js" async=""></script><script src="/_next/static/chunks/36e1c10d-440dfddfa8195fa6.js" async=""></script><script src="/_next/static/chunks/29e3cc0d-b9131230fdb267e7.js" async=""></script><script src="/_next/static/chunks/b63b1b3f-fbe2ac2c00b4eb2f.js" async=""></script><script src="/_next/static/chunks/7f27ae6c-9c6bdf82ccd2f646.js" async=""></script><script src="/_next/static/chunks/6dc81886-d45acadb4b6674c7.js" async=""></script><script src="/_next/static/chunks/c132bf7d-3375ff4277eceb81.js" async=""></script><script src="/_next/static/chunks/cd9f8d63-ba9b342f3d5e92ac.js" async=""></script><script src="/_next/static/chunks/764-350e6bbb8a63c229.js" async=""></script><script src="/_next/static/chunks/app/page-6ff79de000e5b4bd.js" async=""></script><title>recce</title><meta name="description" content="Recce: Data validation toolkit for comprehensive PR review"/><link rel="icon" href="/favicon.ico" type="image/x-icon" sizes="32x32"/><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body><style data-emotion="css-global rh8y69">:host,:root,[data-theme]{--chakra-ring-inset:var(--chakra-empty,/*!*/ /*!*/);--chakra-ring-offset-width:0px;--chakra-ring-offset-color:#fff;--chakra-ring-color:rgba(66, 153, 225, 0.6);--chakra-ring-offset-shadow:0 0 #0000;--chakra-ring-shadow:0 0 #0000;--chakra-space-x-reverse:0;--chakra-space-y-reverse:0;--chakra-colors-transparent:transparent;--chakra-colors-current:currentColor;--chakra-colors-black:#000000;--chakra-colors-white:#FFFFFF;--chakra-colors-whiteAlpha-50:rgba(255, 255, 255, 0.04);--chakra-colors-whiteAlpha-100:rgba(255, 255, 255, 0.06);--chakra-colors-whiteAlpha-200:rgba(255, 255, 255, 0.08);--chakra-colors-whiteAlpha-300:rgba(255, 255, 255, 0.16);--chakra-colors-whiteAlpha-400:rgba(255, 255, 255, 0.24);--chakra-colors-whiteAlpha-500:rgba(255, 255, 255, 0.36);--chakra-colors-whiteAlpha-600:rgba(255, 255, 255, 0.48);--chakra-colors-whiteAlpha-700:rgba(255, 255, 255, 0.64);--chakra-colors-whiteAlpha-800:rgba(255, 255, 255, 0.80);--chakra-colors-whiteAlpha-900:rgba(255, 255, 255, 0.92);--chakra-colors-blackAlpha-50:rgba(0, 0, 0, 0.04);--chakra-colors-blackAlpha-100:rgba(0, 0, 0, 0.06);--chakra-colors-blackAlpha-200:rgba(0, 0, 0, 0.08);--chakra-colors-blackAlpha-300:rgba(0, 0, 0, 0.16);--chakra-colors-blackAlpha-400:rgba(0, 0, 0, 0.24);--chakra-colors-blackAlpha-500:rgba(0, 0, 0, 0.36);--chakra-colors-blackAlpha-600:rgba(0, 0, 0, 0.48);--chakra-colors-blackAlpha-700:rgba(0, 0, 0, 0.64);--chakra-colors-blackAlpha-800:rgba(0, 0, 0, 0.80);--chakra-colors-blackAlpha-900:rgba(0, 0, 0, 0.92);--chakra-colors-gray-50:#F7FAFC;--chakra-colors-gray-100:#EDF2F7;--chakra-colors-gray-200:#E2E8F0;--chakra-colors-gray-300:#CBD5E0;--chakra-colors-gray-400:#A0AEC0;--chakra-colors-gray-500:#718096;--chakra-colors-gray-600:#4A5568;--chakra-colors-gray-700:#2D3748;--chakra-colors-gray-800:#1A202C;--chakra-colors-gray-900:#171923;--chakra-colors-red-50:#FFF5F5;--chakra-colors-red-100:#FED7D7;--chakra-colors-red-200:#FEB2B2;--chakra-colors-red-300:#FC8181;--chakra-colors-red-400:#F56565;--chakra-colors-red-500:#E53E3E;--chakra-colors-red-600:#C53030;--chakra-colors-red-700:#9B2C2C;--chakra-colors-red-800:#822727;--chakra-colors-red-900:#63171B;--chakra-colors-orange-50:#FFFAF0;--chakra-colors-orange-100:#FEEBC8;--chakra-colors-orange-200:#FBD38D;--chakra-colors-orange-300:#F6AD55;--chakra-colors-orange-400:#ED8936;--chakra-colors-orange-500:#DD6B20;--chakra-colors-orange-600:#C05621;--chakra-colors-orange-700:#9C4221;--chakra-colors-orange-800:#7B341E;--chakra-colors-orange-900:#652B19;--chakra-colors-yellow-50:#FFFFF0;--chakra-colors-yellow-100:#FEFCBF;--chakra-colors-yellow-200:#FAF089;--chakra-colors-yellow-300:#F6E05E;--chakra-colors-yellow-400:#ECC94B;--chakra-colors-yellow-500:#D69E2E;--chakra-colors-yellow-600:#B7791F;--chakra-colors-yellow-700:#975A16;--chakra-colors-yellow-800:#744210;--chakra-colors-yellow-900:#5F370E;--chakra-colors-green-50:#F0FFF4;--chakra-colors-green-100:#C6F6D5;--chakra-colors-green-200:#9AE6B4;--chakra-colors-green-300:#68D391;--chakra-colors-green-400:#48BB78;--chakra-colors-green-500:#38A169;--chakra-colors-green-600:#2F855A;--chakra-colors-green-700:#276749;--chakra-colors-green-800:#22543D;--chakra-colors-green-900:#1C4532;--chakra-colors-teal-50:#E6FFFA;--chakra-colors-teal-100:#B2F5EA;--chakra-colors-teal-200:#81E6D9;--chakra-colors-teal-300:#4FD1C5;--chakra-colors-teal-400:#38B2AC;--chakra-colors-teal-500:#319795;--chakra-colors-teal-600:#2C7A7B;--chakra-colors-teal-700:#285E61;--chakra-colors-teal-800:#234E52;--chakra-colors-teal-900:#1D4044;--chakra-colors-blue-50:#ebf8ff;--chakra-colors-blue-100:#bee3f8;--chakra-colors-blue-200:#90cdf4;--chakra-colors-blue-300:#63b3ed;--chakra-colors-blue-400:#4299e1;--chakra-colors-blue-500:#3182ce;--chakra-colors-blue-600:#2b6cb0;--chakra-colors-blue-700:#2c5282;--chakra-colors-blue-800:#2a4365;--chakra-colors-blue-900:#1A365D;--chakra-colors-cyan-50:#EDFDFD;--chakra-colors-cyan-100:#C4F1F9;--chakra-colors-cyan-200:#9DECF9;--chakra-colors-cyan-300:#76E4F7;--chakra-colors-cyan-400:#0BC5EA;--chakra-colors-cyan-500:#00B5D8;--chakra-colors-cyan-600:#00A3C4;--chakra-colors-cyan-700:#0987A0;--chakra-colors-cyan-800:#086F83;--chakra-colors-cyan-900:#065666;--chakra-colors-purple-50:#FAF5FF;--chakra-colors-purple-100:#E9D8FD;--chakra-colors-purple-200:#D6BCFA;--chakra-colors-purple-300:#B794F4;--chakra-colors-purple-400:#9F7AEA;--chakra-colors-purple-500:#805AD5;--chakra-colors-purple-600:#6B46C1;--chakra-colors-purple-700:#553C9A;--chakra-colors-purple-800:#44337A;--chakra-colors-purple-900:#322659;--chakra-colors-pink-50:#FFF5F7;--chakra-colors-pink-100:#FED7E2;--chakra-colors-pink-200:#FBB6CE;--chakra-colors-pink-300:#F687B3;--chakra-colors-pink-400:#ED64A6;--chakra-colors-pink-500:#D53F8C;--chakra-colors-pink-600:#B83280;--chakra-colors-pink-700:#97266D;--chakra-colors-pink-800:#702459;--chakra-colors-pink-900:#521B41;--chakra-borders-none:0;--chakra-borders-1px:1px solid;--chakra-borders-2px:2px solid;--chakra-borders-4px:4px solid;--chakra-borders-8px:8px solid;--chakra-fonts-heading:-apple-system,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--chakra-fonts-body:-apple-system,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--chakra-fonts-mono:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--chakra-fontSizes-3xs:0.45rem;--chakra-fontSizes-2xs:0.625rem;--chakra-fontSizes-xs:0.75rem;--chakra-fontSizes-sm:0.875rem;--chakra-fontSizes-md:1rem;--chakra-fontSizes-lg:1.125rem;--chakra-fontSizes-xl:1.25rem;--chakra-fontSizes-2xl:1.5rem;--chakra-fontSizes-3xl:1.875rem;--chakra-fontSizes-4xl:2.25rem;--chakra-fontSizes-5xl:3rem;--chakra-fontSizes-6xl:3.75rem;--chakra-fontSizes-7xl:4.5rem;--chakra-fontSizes-8xl:6rem;--chakra-fontSizes-9xl:8rem;--chakra-fontWeights-hairline:100;--chakra-fontWeights-thin:200;--chakra-fontWeights-light:300;--chakra-fontWeights-normal:400;--chakra-fontWeights-medium:500;--chakra-fontWeights-semibold:600;--chakra-fontWeights-bold:700;--chakra-fontWeights-extrabold:800;--chakra-fontWeights-black:900;--chakra-letterSpacings-tighter:-0.05em;--chakra-letterSpacings-tight:-0.025em;--chakra-letterSpacings-normal:0;--chakra-letterSpacings-wide:0.025em;--chakra-letterSpacings-wider:0.05em;--chakra-letterSpacings-widest:0.1em;--chakra-lineHeights-3:.75rem;--chakra-lineHeights-4:1rem;--chakra-lineHeights-5:1.25rem;--chakra-lineHeights-6:1.5rem;--chakra-lineHeights-7:1.75rem;--chakra-lineHeights-8:2rem;--chakra-lineHeights-9:2.25rem;--chakra-lineHeights-10:2.5rem;--chakra-lineHeights-normal:normal;--chakra-lineHeights-none:1;--chakra-lineHeights-shorter:1.25;--chakra-lineHeights-short:1.375;--chakra-lineHeights-base:1.5;--chakra-lineHeights-tall:1.625;--chakra-lineHeights-taller:2;--chakra-radii-none:0;--chakra-radii-sm:0.125rem;--chakra-radii-base:0.25rem;--chakra-radii-md:0.375rem;--chakra-radii-lg:0.5rem;--chakra-radii-xl:0.75rem;--chakra-radii-2xl:1rem;--chakra-radii-3xl:1.5rem;--chakra-radii-full:9999px;--chakra-space-1:0.25rem;--chakra-space-2:0.5rem;--chakra-space-3:0.75rem;--chakra-space-4:1rem;--chakra-space-5:1.25rem;--chakra-space-6:1.5rem;--chakra-space-7:1.75rem;--chakra-space-8:2rem;--chakra-space-9:2.25rem;--chakra-space-10:2.5rem;--chakra-space-12:3rem;--chakra-space-14:3.5rem;--chakra-space-16:4rem;--chakra-space-20:5rem;--chakra-space-24:6rem;--chakra-space-28:7rem;--chakra-space-32:8rem;--chakra-space-36:9rem;--chakra-space-40:10rem;--chakra-space-44:11rem;--chakra-space-48:12rem;--chakra-space-52:13rem;--chakra-space-56:14rem;--chakra-space-60:15rem;--chakra-space-64:16rem;--chakra-space-72:18rem;--chakra-space-80:20rem;--chakra-space-96:24rem;--chakra-space-px:1px;--chakra-space-0-5:0.125rem;--chakra-space-1-5:0.375rem;--chakra-space-2-5:0.625rem;--chakra-space-3-5:0.875rem;--chakra-shadows-xs:0 0 0 1px rgba(0, 0, 0, 0.05);--chakra-shadows-sm:0 1px 2px 0 rgba(0, 0, 0, 0.05);--chakra-shadows-base:0 1px 3px 0 rgba(0, 0, 0, 0.1),0 1px 2px 0 rgba(0, 0, 0, 0.06);--chakra-shadows-md:0 4px 6px -1px rgba(0, 0, 0, 0.1),0 2px 4px -1px rgba(0, 0, 0, 0.06);--chakra-shadows-lg:0 10px 15px -3px rgba(0, 0, 0, 0.1),0 4px 6px -2px rgba(0, 0, 0, 0.05);--chakra-shadows-xl:0 20px 25px -5px rgba(0, 0, 0, 0.1),0 10px 10px -5px rgba(0, 0, 0, 0.04);--chakra-shadows-2xl:0 25px 50px -12px rgba(0, 0, 0, 0.25);--chakra-shadows-outline:0 0 0 3px rgba(66, 153, 225, 0.6);--chakra-shadows-inner:inset 0 2px 4px 0 rgba(0,0,0,0.06);--chakra-shadows-none:none;--chakra-shadows-dark-lg:rgba(0, 0, 0, 0.1) 0px 0px 0px 1px,rgba(0, 0, 0, 0.2) 0px 5px 10px,rgba(0, 0, 0, 0.4) 0px 15px 40px;--chakra-sizes-1:0.25rem;--chakra-sizes-2:0.5rem;--chakra-sizes-3:0.75rem;--chakra-sizes-4:1rem;--chakra-sizes-5:1.25rem;--chakra-sizes-6:1.5rem;--chakra-sizes-7:1.75rem;--chakra-sizes-8:2rem;--chakra-sizes-9:2.25rem;--chakra-sizes-10:2.5rem;--chakra-sizes-12:3rem;--chakra-sizes-14:3.5rem;--chakra-sizes-16:4rem;--chakra-sizes-20:5rem;--chakra-sizes-24:6rem;--chakra-sizes-28:7rem;--chakra-sizes-32:8rem;--chakra-sizes-36:9rem;--chakra-sizes-40:10rem;--chakra-sizes-44:11rem;--chakra-sizes-48:12rem;--chakra-sizes-52:13rem;--chakra-sizes-56:14rem;--chakra-sizes-60:15rem;--chakra-sizes-64:16rem;--chakra-sizes-72:18rem;--chakra-sizes-80:20rem;--chakra-sizes-96:24rem;--chakra-sizes-px:1px;--chakra-sizes-0-5:0.125rem;--chakra-sizes-1-5:0.375rem;--chakra-sizes-2-5:0.625rem;--chakra-sizes-3-5:0.875rem;--chakra-sizes-max:max-content;--chakra-sizes-min:min-content;--chakra-sizes-full:100%;--chakra-sizes-3xs:14rem;--chakra-sizes-2xs:16rem;--chakra-sizes-xs:20rem;--chakra-sizes-sm:24rem;--chakra-sizes-md:28rem;--chakra-sizes-lg:32rem;--chakra-sizes-xl:36rem;--chakra-sizes-2xl:42rem;--chakra-sizes-3xl:48rem;--chakra-sizes-4xl:56rem;--chakra-sizes-5xl:64rem;--chakra-sizes-6xl:72rem;--chakra-sizes-7xl:80rem;--chakra-sizes-8xl:90rem;--chakra-sizes-prose:60ch;--chakra-sizes-container-sm:640px;--chakra-sizes-container-md:768px;--chakra-sizes-container-lg:1024px;--chakra-sizes-container-xl:1280px;--chakra-zIndices-hide:-1;--chakra-zIndices-auto:auto;--chakra-zIndices-base:0;--chakra-zIndices-docked:10;--chakra-zIndices-dropdown:1000;--chakra-zIndices-sticky:1100;--chakra-zIndices-banner:1200;--chakra-zIndices-overlay:1300;--chakra-zIndices-modal:1400;--chakra-zIndices-popover:1500;--chakra-zIndices-skipLink:1600;--chakra-zIndices-toast:1700;--chakra-zIndices-tooltip:1800;--chakra-transition-property-common:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform;--chakra-transition-property-colors:background-color,border-color,color,fill,stroke;--chakra-transition-property-dimensions:width,height;--chakra-transition-property-position:left,right,top,bottom;--chakra-transition-property-background:background-color,background-image,background-position;--chakra-transition-easing-ease-in:cubic-bezier(0.4, 0, 1, 1);--chakra-transition-easing-ease-out:cubic-bezier(0, 0, 0.2, 1);--chakra-transition-easing-ease-in-out:cubic-bezier(0.4, 0, 0.2, 1);--chakra-transition-duration-ultra-fast:50ms;--chakra-transition-duration-faster:100ms;--chakra-transition-duration-fast:150ms;--chakra-transition-duration-normal:200ms;--chakra-transition-duration-slow:300ms;--chakra-transition-duration-slower:400ms;--chakra-transition-duration-ultra-slow:500ms;--chakra-blur-none:0;--chakra-blur-sm:4px;--chakra-blur-base:8px;--chakra-blur-md:12px;--chakra-blur-lg:16px;--chakra-blur-xl:24px;--chakra-blur-2xl:40px;--chakra-blur-3xl:64px;--chakra-breakpoints-base:0em;--chakra-breakpoints-sm:30em;--chakra-breakpoints-md:48em;--chakra-breakpoints-lg:62em;--chakra-breakpoints-xl:80em;--chakra-breakpoints-2xl:96em;}.chakra-ui-light :host:not([data-theme]),.chakra-ui-light :root:not([data-theme]),.chakra-ui-light [data-theme]:not([data-theme]),[data-theme=light] :host:not([data-theme]),[data-theme=light] :root:not([data-theme]),[data-theme=light] [data-theme]:not([data-theme]),:host[data-theme=light],:root[data-theme=light],[data-theme][data-theme=light]{--chakra-colors-chakra-body-text:var(--chakra-colors-gray-800);--chakra-colors-chakra-body-bg:var(--chakra-colors-white);--chakra-colors-chakra-border-color:var(--chakra-colors-gray-200);--chakra-colors-chakra-inverse-text:var(--chakra-colors-white);--chakra-colors-chakra-subtle-bg:var(--chakra-colors-gray-100);--chakra-colors-chakra-subtle-text:var(--chakra-colors-gray-600);--chakra-colors-chakra-placeholder-color:var(--chakra-colors-gray-500);}.chakra-ui-dark :host:not([data-theme]),.chakra-ui-dark :root:not([data-theme]),.chakra-ui-dark [data-theme]:not([data-theme]),[data-theme=dark] :host:not([data-theme]),[data-theme=dark] :root:not([data-theme]),[data-theme=dark] [data-theme]:not([data-theme]),:host[data-theme=dark],:root[data-theme=dark],[data-theme][data-theme=dark]{--chakra-colors-chakra-body-text:var(--chakra-colors-whiteAlpha-900);--chakra-colors-chakra-body-bg:var(--chakra-colors-gray-800);--chakra-colors-chakra-border-color:var(--chakra-colors-whiteAlpha-300);--chakra-colors-chakra-inverse-text:var(--chakra-colors-gray-800);--chakra-colors-chakra-subtle-bg:var(--chakra-colors-gray-700);--chakra-colors-chakra-subtle-text:var(--chakra-colors-gray-400);--chakra-colors-chakra-placeholder-color:var(--chakra-colors-whiteAlpha-400);}</style><style data-emotion="css-global fubdgu">html{line-height:1.5;-webkit-text-size-adjust:100%;font-family:system-ui,sans-serif;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;touch-action:manipulation;}body{position:relative;min-height:100%;margin:0;font-feature-settings:"kern";}:where(*, *::before, *::after){border-width:0;border-style:solid;box-sizing:border-box;word-wrap:break-word;}main{display:block;}hr{border-top-width:1px;box-sizing:content-box;height:0;overflow:visible;}:where(pre, code, kbd,samp){font-family:SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:1em;}a{background-color:transparent;color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit;}abbr[title]{border-bottom:none;-webkit-text-decoration:underline;text-decoration:underline;-webkit-text-decoration:underline dotted;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;}:where(b, strong){font-weight:bold;}small{font-size:80%;}:where(sub,sup){font-size:75%;line-height:0;position:relative;vertical-align:baseline;}sub{bottom:-0.25em;}sup{top:-0.5em;}img{border-style:none;}:where(button, input, optgroup, select, textarea){font-family:inherit;font-size:100%;line-height:1.15;margin:0;}:where(button, input){overflow:visible;}:where(button, select){text-transform:none;}:where(
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="image" href="/logo/recce-logo-white.png"/><link rel="stylesheet" href="/_next/static/css/c9ecb46a4b21c126.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-5ab3237140d2c0f8.js"/><script src="/_next/static/chunks/523b8219-cd28a6efac8e1cf1.js" async=""></script><script src="/_next/static/chunks/921-4158ef2dc23e4a01.js" async=""></script><script src="/_next/static/chunks/main-app-6f45568a6a7cd7b0.js" async=""></script><script src="/_next/static/chunks/e24bf851-38fffe87a7b8784a.js" async=""></script><script src="/_next/static/chunks/c1ceaa8b-c4f0232ef5c2c9ba.js" async=""></script><script src="/_next/static/chunks/3998a672-18454f939c052b39.js" async=""></script><script src="/_next/static/chunks/9746af58-344daabf5df08121.js" async=""></script><script src="/_next/static/chunks/ce84277d-3aa717f588901c96.js" async=""></script><script src="/_next/static/chunks/47d8844f-cac2989cb39ba350.js" async=""></script><script src="/_next/static/chunks/a30376cd-0e2abcaded0e4cfc.js" async=""></script><script src="/_next/static/chunks/fee69bc6-4490eb47d2aaaa72.js" async=""></script><script src="/_next/static/chunks/7a8a3e83-1a4edb77e4d0142d.js" async=""></script><script src="/_next/static/chunks/450c323b-ff537c106edf3f59.js" async=""></script><script src="/_next/static/chunks/36e1c10d-440dfddfa8195fa6.js" async=""></script><script src="/_next/static/chunks/29e3cc0d-b9131230fdb267e7.js" async=""></script><script src="/_next/static/chunks/b63b1b3f-fbe2ac2c00b4eb2f.js" async=""></script><script src="/_next/static/chunks/7f27ae6c-9c6bdf82ccd2f646.js" async=""></script><script src="/_next/static/chunks/6dc81886-d45acadb4b6674c7.js" async=""></script><script src="/_next/static/chunks/c132bf7d-3375ff4277eceb81.js" async=""></script><script src="/_next/static/chunks/cd9f8d63-ba9b342f3d5e92ac.js" async=""></script><script src="/_next/static/chunks/764-350e6bbb8a63c229.js" async=""></script><script src="/_next/static/chunks/app/page-9bc00f15470199ef.js" async=""></script><title>recce</title><meta name="description" content="Recce: Data validation toolkit for comprehensive PR review"/><link rel="icon" href="/favicon.ico" type="image/x-icon" sizes="32x32"/><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body><style data-emotion="css-global rh8y69">:host,:root,[data-theme]{--chakra-ring-inset:var(--chakra-empty,/*!*/ /*!*/);--chakra-ring-offset-width:0px;--chakra-ring-offset-color:#fff;--chakra-ring-color:rgba(66, 153, 225, 0.6);--chakra-ring-offset-shadow:0 0 #0000;--chakra-ring-shadow:0 0 #0000;--chakra-space-x-reverse:0;--chakra-space-y-reverse:0;--chakra-colors-transparent:transparent;--chakra-colors-current:currentColor;--chakra-colors-black:#000000;--chakra-colors-white:#FFFFFF;--chakra-colors-whiteAlpha-50:rgba(255, 255, 255, 0.04);--chakra-colors-whiteAlpha-100:rgba(255, 255, 255, 0.06);--chakra-colors-whiteAlpha-200:rgba(255, 255, 255, 0.08);--chakra-colors-whiteAlpha-300:rgba(255, 255, 255, 0.16);--chakra-colors-whiteAlpha-400:rgba(255, 255, 255, 0.24);--chakra-colors-whiteAlpha-500:rgba(255, 255, 255, 0.36);--chakra-colors-whiteAlpha-600:rgba(255, 255, 255, 0.48);--chakra-colors-whiteAlpha-700:rgba(255, 255, 255, 0.64);--chakra-colors-whiteAlpha-800:rgba(255, 255, 255, 0.80);--chakra-colors-whiteAlpha-900:rgba(255, 255, 255, 0.92);--chakra-colors-blackAlpha-50:rgba(0, 0, 0, 0.04);--chakra-colors-blackAlpha-100:rgba(0, 0, 0, 0.06);--chakra-colors-blackAlpha-200:rgba(0, 0, 0, 0.08);--chakra-colors-blackAlpha-300:rgba(0, 0, 0, 0.16);--chakra-colors-blackAlpha-400:rgba(0, 0, 0, 0.24);--chakra-colors-blackAlpha-500:rgba(0, 0, 0, 0.36);--chakra-colors-blackAlpha-600:rgba(0, 0, 0, 0.48);--chakra-colors-blackAlpha-700:rgba(0, 0, 0, 0.64);--chakra-colors-blackAlpha-800:rgba(0, 0, 0, 0.80);--chakra-colors-blackAlpha-900:rgba(0, 0, 0, 0.92);--chakra-colors-gray-50:#F7FAFC;--chakra-colors-gray-100:#EDF2F7;--chakra-colors-gray-200:#E2E8F0;--chakra-colors-gray-300:#CBD5E0;--chakra-colors-gray-400:#A0AEC0;--chakra-colors-gray-500:#718096;--chakra-colors-gray-600:#4A5568;--chakra-colors-gray-700:#2D3748;--chakra-colors-gray-800:#1A202C;--chakra-colors-gray-900:#171923;--chakra-colors-red-50:#FFF5F5;--chakra-colors-red-100:#FED7D7;--chakra-colors-red-200:#FEB2B2;--chakra-colors-red-300:#FC8181;--chakra-colors-red-400:#F56565;--chakra-colors-red-500:#E53E3E;--chakra-colors-red-600:#C53030;--chakra-colors-red-700:#9B2C2C;--chakra-colors-red-800:#822727;--chakra-colors-red-900:#63171B;--chakra-colors-orange-50:#FFFAF0;--chakra-colors-orange-100:#FEEBC8;--chakra-colors-orange-200:#FBD38D;--chakra-colors-orange-300:#F6AD55;--chakra-colors-orange-400:#ED8936;--chakra-colors-orange-500:#DD6B20;--chakra-colors-orange-600:#C05621;--chakra-colors-orange-700:#9C4221;--chakra-colors-orange-800:#7B341E;--chakra-colors-orange-900:#652B19;--chakra-colors-yellow-50:#FFFFF0;--chakra-colors-yellow-100:#FEFCBF;--chakra-colors-yellow-200:#FAF089;--chakra-colors-yellow-300:#F6E05E;--chakra-colors-yellow-400:#ECC94B;--chakra-colors-yellow-500:#D69E2E;--chakra-colors-yellow-600:#B7791F;--chakra-colors-yellow-700:#975A16;--chakra-colors-yellow-800:#744210;--chakra-colors-yellow-900:#5F370E;--chakra-colors-green-50:#F0FFF4;--chakra-colors-green-100:#C6F6D5;--chakra-colors-green-200:#9AE6B4;--chakra-colors-green-300:#68D391;--chakra-colors-green-400:#48BB78;--chakra-colors-green-500:#38A169;--chakra-colors-green-600:#2F855A;--chakra-colors-green-700:#276749;--chakra-colors-green-800:#22543D;--chakra-colors-green-900:#1C4532;--chakra-colors-teal-50:#E6FFFA;--chakra-colors-teal-100:#B2F5EA;--chakra-colors-teal-200:#81E6D9;--chakra-colors-teal-300:#4FD1C5;--chakra-colors-teal-400:#38B2AC;--chakra-colors-teal-500:#319795;--chakra-colors-teal-600:#2C7A7B;--chakra-colors-teal-700:#285E61;--chakra-colors-teal-800:#234E52;--chakra-colors-teal-900:#1D4044;--chakra-colors-blue-50:#ebf8ff;--chakra-colors-blue-100:#bee3f8;--chakra-colors-blue-200:#90cdf4;--chakra-colors-blue-300:#63b3ed;--chakra-colors-blue-400:#4299e1;--chakra-colors-blue-500:#3182ce;--chakra-colors-blue-600:#2b6cb0;--chakra-colors-blue-700:#2c5282;--chakra-colors-blue-800:#2a4365;--chakra-colors-blue-900:#1A365D;--chakra-colors-cyan-50:#EDFDFD;--chakra-colors-cyan-100:#C4F1F9;--chakra-colors-cyan-200:#9DECF9;--chakra-colors-cyan-300:#76E4F7;--chakra-colors-cyan-400:#0BC5EA;--chakra-colors-cyan-500:#00B5D8;--chakra-colors-cyan-600:#00A3C4;--chakra-colors-cyan-700:#0987A0;--chakra-colors-cyan-800:#086F83;--chakra-colors-cyan-900:#065666;--chakra-colors-purple-50:#FAF5FF;--chakra-colors-purple-100:#E9D8FD;--chakra-colors-purple-200:#D6BCFA;--chakra-colors-purple-300:#B794F4;--chakra-colors-purple-400:#9F7AEA;--chakra-colors-purple-500:#805AD5;--chakra-colors-purple-600:#6B46C1;--chakra-colors-purple-700:#553C9A;--chakra-colors-purple-800:#44337A;--chakra-colors-purple-900:#322659;--chakra-colors-pink-50:#FFF5F7;--chakra-colors-pink-100:#FED7E2;--chakra-colors-pink-200:#FBB6CE;--chakra-colors-pink-300:#F687B3;--chakra-colors-pink-400:#ED64A6;--chakra-colors-pink-500:#D53F8C;--chakra-colors-pink-600:#B83280;--chakra-colors-pink-700:#97266D;--chakra-colors-pink-800:#702459;--chakra-colors-pink-900:#521B41;--chakra-borders-none:0;--chakra-borders-1px:1px solid;--chakra-borders-2px:2px solid;--chakra-borders-4px:4px solid;--chakra-borders-8px:8px solid;--chakra-fonts-heading:-apple-system,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--chakra-fonts-body:-apple-system,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--chakra-fonts-mono:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--chakra-fontSizes-3xs:0.45rem;--chakra-fontSizes-2xs:0.625rem;--chakra-fontSizes-xs:0.75rem;--chakra-fontSizes-sm:0.875rem;--chakra-fontSizes-md:1rem;--chakra-fontSizes-lg:1.125rem;--chakra-fontSizes-xl:1.25rem;--chakra-fontSizes-2xl:1.5rem;--chakra-fontSizes-3xl:1.875rem;--chakra-fontSizes-4xl:2.25rem;--chakra-fontSizes-5xl:3rem;--chakra-fontSizes-6xl:3.75rem;--chakra-fontSizes-7xl:4.5rem;--chakra-fontSizes-8xl:6rem;--chakra-fontSizes-9xl:8rem;--chakra-fontWeights-hairline:100;--chakra-fontWeights-thin:200;--chakra-fontWeights-light:300;--chakra-fontWeights-normal:400;--chakra-fontWeights-medium:500;--chakra-fontWeights-semibold:600;--chakra-fontWeights-bold:700;--chakra-fontWeights-extrabold:800;--chakra-fontWeights-black:900;--chakra-letterSpacings-tighter:-0.05em;--chakra-letterSpacings-tight:-0.025em;--chakra-letterSpacings-normal:0;--chakra-letterSpacings-wide:0.025em;--chakra-letterSpacings-wider:0.05em;--chakra-letterSpacings-widest:0.1em;--chakra-lineHeights-3:.75rem;--chakra-lineHeights-4:1rem;--chakra-lineHeights-5:1.25rem;--chakra-lineHeights-6:1.5rem;--chakra-lineHeights-7:1.75rem;--chakra-lineHeights-8:2rem;--chakra-lineHeights-9:2.25rem;--chakra-lineHeights-10:2.5rem;--chakra-lineHeights-normal:normal;--chakra-lineHeights-none:1;--chakra-lineHeights-shorter:1.25;--chakra-lineHeights-short:1.375;--chakra-lineHeights-base:1.5;--chakra-lineHeights-tall:1.625;--chakra-lineHeights-taller:2;--chakra-radii-none:0;--chakra-radii-sm:0.125rem;--chakra-radii-base:0.25rem;--chakra-radii-md:0.375rem;--chakra-radii-lg:0.5rem;--chakra-radii-xl:0.75rem;--chakra-radii-2xl:1rem;--chakra-radii-3xl:1.5rem;--chakra-radii-full:9999px;--chakra-space-1:0.25rem;--chakra-space-2:0.5rem;--chakra-space-3:0.75rem;--chakra-space-4:1rem;--chakra-space-5:1.25rem;--chakra-space-6:1.5rem;--chakra-space-7:1.75rem;--chakra-space-8:2rem;--chakra-space-9:2.25rem;--chakra-space-10:2.5rem;--chakra-space-12:3rem;--chakra-space-14:3.5rem;--chakra-space-16:4rem;--chakra-space-20:5rem;--chakra-space-24:6rem;--chakra-space-28:7rem;--chakra-space-32:8rem;--chakra-space-36:9rem;--chakra-space-40:10rem;--chakra-space-44:11rem;--chakra-space-48:12rem;--chakra-space-52:13rem;--chakra-space-56:14rem;--chakra-space-60:15rem;--chakra-space-64:16rem;--chakra-space-72:18rem;--chakra-space-80:20rem;--chakra-space-96:24rem;--chakra-space-px:1px;--chakra-space-0-5:0.125rem;--chakra-space-1-5:0.375rem;--chakra-space-2-5:0.625rem;--chakra-space-3-5:0.875rem;--chakra-shadows-xs:0 0 0 1px rgba(0, 0, 0, 0.05);--chakra-shadows-sm:0 1px 2px 0 rgba(0, 0, 0, 0.05);--chakra-shadows-base:0 1px 3px 0 rgba(0, 0, 0, 0.1),0 1px 2px 0 rgba(0, 0, 0, 0.06);--chakra-shadows-md:0 4px 6px -1px rgba(0, 0, 0, 0.1),0 2px 4px -1px rgba(0, 0, 0, 0.06);--chakra-shadows-lg:0 10px 15px -3px rgba(0, 0, 0, 0.1),0 4px 6px -2px rgba(0, 0, 0, 0.05);--chakra-shadows-xl:0 20px 25px -5px rgba(0, 0, 0, 0.1),0 10px 10px -5px rgba(0, 0, 0, 0.04);--chakra-shadows-2xl:0 25px 50px -12px rgba(0, 0, 0, 0.25);--chakra-shadows-outline:0 0 0 3px rgba(66, 153, 225, 0.6);--chakra-shadows-inner:inset 0 2px 4px 0 rgba(0,0,0,0.06);--chakra-shadows-none:none;--chakra-shadows-dark-lg:rgba(0, 0, 0, 0.1) 0px 0px 0px 1px,rgba(0, 0, 0, 0.2) 0px 5px 10px,rgba(0, 0, 0, 0.4) 0px 15px 40px;--chakra-sizes-1:0.25rem;--chakra-sizes-2:0.5rem;--chakra-sizes-3:0.75rem;--chakra-sizes-4:1rem;--chakra-sizes-5:1.25rem;--chakra-sizes-6:1.5rem;--chakra-sizes-7:1.75rem;--chakra-sizes-8:2rem;--chakra-sizes-9:2.25rem;--chakra-sizes-10:2.5rem;--chakra-sizes-12:3rem;--chakra-sizes-14:3.5rem;--chakra-sizes-16:4rem;--chakra-sizes-20:5rem;--chakra-sizes-24:6rem;--chakra-sizes-28:7rem;--chakra-sizes-32:8rem;--chakra-sizes-36:9rem;--chakra-sizes-40:10rem;--chakra-sizes-44:11rem;--chakra-sizes-48:12rem;--chakra-sizes-52:13rem;--chakra-sizes-56:14rem;--chakra-sizes-60:15rem;--chakra-sizes-64:16rem;--chakra-sizes-72:18rem;--chakra-sizes-80:20rem;--chakra-sizes-96:24rem;--chakra-sizes-px:1px;--chakra-sizes-0-5:0.125rem;--chakra-sizes-1-5:0.375rem;--chakra-sizes-2-5:0.625rem;--chakra-sizes-3-5:0.875rem;--chakra-sizes-max:max-content;--chakra-sizes-min:min-content;--chakra-sizes-full:100%;--chakra-sizes-3xs:14rem;--chakra-sizes-2xs:16rem;--chakra-sizes-xs:20rem;--chakra-sizes-sm:24rem;--chakra-sizes-md:28rem;--chakra-sizes-lg:32rem;--chakra-sizes-xl:36rem;--chakra-sizes-2xl:42rem;--chakra-sizes-3xl:48rem;--chakra-sizes-4xl:56rem;--chakra-sizes-5xl:64rem;--chakra-sizes-6xl:72rem;--chakra-sizes-7xl:80rem;--chakra-sizes-8xl:90rem;--chakra-sizes-prose:60ch;--chakra-sizes-container-sm:640px;--chakra-sizes-container-md:768px;--chakra-sizes-container-lg:1024px;--chakra-sizes-container-xl:1280px;--chakra-zIndices-hide:-1;--chakra-zIndices-auto:auto;--chakra-zIndices-base:0;--chakra-zIndices-docked:10;--chakra-zIndices-dropdown:1000;--chakra-zIndices-sticky:1100;--chakra-zIndices-banner:1200;--chakra-zIndices-overlay:1300;--chakra-zIndices-modal:1400;--chakra-zIndices-popover:1500;--chakra-zIndices-skipLink:1600;--chakra-zIndices-toast:1700;--chakra-zIndices-tooltip:1800;--chakra-transition-property-common:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform;--chakra-transition-property-colors:background-color,border-color,color,fill,stroke;--chakra-transition-property-dimensions:width,height;--chakra-transition-property-position:left,right,top,bottom;--chakra-transition-property-background:background-color,background-image,background-position;--chakra-transition-easing-ease-in:cubic-bezier(0.4, 0, 1, 1);--chakra-transition-easing-ease-out:cubic-bezier(0, 0, 0.2, 1);--chakra-transition-easing-ease-in-out:cubic-bezier(0.4, 0, 0.2, 1);--chakra-transition-duration-ultra-fast:50ms;--chakra-transition-duration-faster:100ms;--chakra-transition-duration-fast:150ms;--chakra-transition-duration-normal:200ms;--chakra-transition-duration-slow:300ms;--chakra-transition-duration-slower:400ms;--chakra-transition-duration-ultra-slow:500ms;--chakra-blur-none:0;--chakra-blur-sm:4px;--chakra-blur-base:8px;--chakra-blur-md:12px;--chakra-blur-lg:16px;--chakra-blur-xl:24px;--chakra-blur-2xl:40px;--chakra-blur-3xl:64px;--chakra-breakpoints-base:0em;--chakra-breakpoints-sm:30em;--chakra-breakpoints-md:48em;--chakra-breakpoints-lg:62em;--chakra-breakpoints-xl:80em;--chakra-breakpoints-2xl:96em;}.chakra-ui-light :host:not([data-theme]),.chakra-ui-light :root:not([data-theme]),.chakra-ui-light [data-theme]:not([data-theme]),[data-theme=light] :host:not([data-theme]),[data-theme=light] :root:not([data-theme]),[data-theme=light] [data-theme]:not([data-theme]),:host[data-theme=light],:root[data-theme=light],[data-theme][data-theme=light]{--chakra-colors-chakra-body-text:var(--chakra-colors-gray-800);--chakra-colors-chakra-body-bg:var(--chakra-colors-white);--chakra-colors-chakra-border-color:var(--chakra-colors-gray-200);--chakra-colors-chakra-inverse-text:var(--chakra-colors-white);--chakra-colors-chakra-subtle-bg:var(--chakra-colors-gray-100);--chakra-colors-chakra-subtle-text:var(--chakra-colors-gray-600);--chakra-colors-chakra-placeholder-color:var(--chakra-colors-gray-500);}.chakra-ui-dark :host:not([data-theme]),.chakra-ui-dark :root:not([data-theme]),.chakra-ui-dark [data-theme]:not([data-theme]),[data-theme=dark] :host:not([data-theme]),[data-theme=dark] :root:not([data-theme]),[data-theme=dark] [data-theme]:not([data-theme]),:host[data-theme=dark],:root[data-theme=dark],[data-theme][data-theme=dark]{--chakra-colors-chakra-body-text:var(--chakra-colors-whiteAlpha-900);--chakra-colors-chakra-body-bg:var(--chakra-colors-gray-800);--chakra-colors-chakra-border-color:var(--chakra-colors-whiteAlpha-300);--chakra-colors-chakra-inverse-text:var(--chakra-colors-gray-800);--chakra-colors-chakra-subtle-bg:var(--chakra-colors-gray-700);--chakra-colors-chakra-subtle-text:var(--chakra-colors-gray-400);--chakra-colors-chakra-placeholder-color:var(--chakra-colors-whiteAlpha-400);}</style><style data-emotion="css-global fubdgu">html{line-height:1.5;-webkit-text-size-adjust:100%;font-family:system-ui,sans-serif;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;touch-action:manipulation;}body{position:relative;min-height:100%;margin:0;font-feature-settings:"kern";}:where(*, *::before, *::after){border-width:0;border-style:solid;box-sizing:border-box;word-wrap:break-word;}main{display:block;}hr{border-top-width:1px;box-sizing:content-box;height:0;overflow:visible;}:where(pre, code, kbd,samp){font-family:SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:1em;}a{background-color:transparent;color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit;}abbr[title]{border-bottom:none;-webkit-text-decoration:underline;text-decoration:underline;-webkit-text-decoration:underline dotted;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;}:where(b, strong){font-weight:bold;}small{font-size:80%;}:where(sub,sup){font-size:75%;line-height:0;position:relative;vertical-align:baseline;}sub{bottom:-0.25em;}sup{top:-0.5em;}img{border-style:none;}:where(button, input, optgroup, select, textarea){font-family:inherit;font-size:100%;line-height:1.15;margin:0;}:where(button, input){overflow:visible;}:where(button, select){text-transform:none;}:where(
2
2
  button::-moz-focus-inner,
3
3
  [type="button"]::-moz-focus-inner,
4
4
  [type="reset"]::-moz-focus-inner,
@@ -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-5ab3237140d2c0f8.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[65035,[],\"\"]\n4:I[59969,[],\"ClientPageRoot\"]\n5:I[39890,[\"266\",\"static/chunks/e24bf851-38fffe87a7b8784a.js\",\"517\",\"static/chunks/c1ceaa8b-c4f0232ef5c2c9ba.js\",\"678\",\"static/chunks/3998a672-18454f939c052b39.js\",\"509\",\"static/chunks/9746af58-344daabf5df08121.js\",\"895\",\"static/chunks/ce84277d-3cee88b51629d895.js\",\"989\",\"static/chunks/47d8844f-cac2989cb39ba350.js\",\"147\",\"static/chunks/a30376cd-0e2abcaded0e4cfc.js\",\"995\",\"static/chunks/fee69bc6-4490eb47d2aaaa72.js\",\"739\",\"static/chunks/7a8a3e83-1a4edb77e4d0142d.js\",\"283\",\"static/chunks/450c323b-ff537c106edf3f59.js\",\"303\",\"static/chunks/36e1c10d-440dfddfa8195fa6.js\",\"22\",\"static/chunks/29e3cc0d-b9131230fdb267e7.js\",\"25\",\"static/chunks/b63b1b3f-fbe2ac2c00b4eb2f.js\",\"355\",\"static/chunks/7f27ae6c-9c6bdf82ccd2f646.js\",\"495\",\"static/chunks/6dc81886-d45acadb4b6674c7.js\",\"599\",\"static/chunks/c132bf7d-3375ff4277eceb81.js\",\"971\",\"static/chunks/cd9f8d63-ba9b342f3d5e92ac.js\",\"764\",\"static/chunks/764-350e6bbb8a63c229.js\",\"931\",\"static/chunks/app/page-6ff79de000e5b4bd.js\"],\"default\",1]\n6:I[49712,[],\"\"]\n7:I[30691,[],\"\"]\n9:I[36979,[],\"\"]\na:[]\n0:[\"$\",\"$L2\",null,{\"buildId\":\"KZBcKj-BHQq_dqlxZTfGX\",\"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,Helv"])</script><script>self.__next_f.push([1,"etica,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-5ab3237140d2c0f8.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[65035,[],\"\"]\n4:I[59969,[],\"ClientPageRoot\"]\n5:I[1822,[\"266\",\"static/chunks/e24bf851-38fffe87a7b8784a.js\",\"517\",\"static/chunks/c1ceaa8b-c4f0232ef5c2c9ba.js\",\"678\",\"static/chunks/3998a672-18454f939c052b39.js\",\"509\",\"static/chunks/9746af58-344daabf5df08121.js\",\"895\",\"static/chunks/ce84277d-3aa717f588901c96.js\",\"989\",\"static/chunks/47d8844f-cac2989cb39ba350.js\",\"147\",\"static/chunks/a30376cd-0e2abcaded0e4cfc.js\",\"995\",\"static/chunks/fee69bc6-4490eb47d2aaaa72.js\",\"739\",\"static/chunks/7a8a3e83-1a4edb77e4d0142d.js\",\"283\",\"static/chunks/450c323b-ff537c106edf3f59.js\",\"303\",\"static/chunks/36e1c10d-440dfddfa8195fa6.js\",\"22\",\"static/chunks/29e3cc0d-b9131230fdb267e7.js\",\"25\",\"static/chunks/b63b1b3f-fbe2ac2c00b4eb2f.js\",\"355\",\"static/chunks/7f27ae6c-9c6bdf82ccd2f646.js\",\"495\",\"static/chunks/6dc81886-d45acadb4b6674c7.js\",\"599\",\"static/chunks/c132bf7d-3375ff4277eceb81.js\",\"971\",\"static/chunks/cd9f8d63-ba9b342f3d5e92ac.js\",\"764\",\"static/chunks/764-350e6bbb8a63c229.js\",\"931\",\"static/chunks/app/page-9bc00f15470199ef.js\"],\"default\",1]\n6:I[49712,[],\"\"]\n7:I[30691,[],\"\"]\n9:I[36979,[],\"\"]\na:[]\n0:[\"$\",\"$L2\",null,{\"buildId\":\"m8B4OtT1DK5I_5uAc51bn\",\"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,Helve"])</script><script>self.__next_f.push([1,"tica,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>
recce/data/index.txt CHANGED
@@ -1,7 +1,7 @@
1
1
  2:I[59969,[],"ClientPageRoot"]
2
- 3:I[39890,["266","static/chunks/e24bf851-38fffe87a7b8784a.js","517","static/chunks/c1ceaa8b-c4f0232ef5c2c9ba.js","678","static/chunks/3998a672-18454f939c052b39.js","509","static/chunks/9746af58-344daabf5df08121.js","895","static/chunks/ce84277d-3cee88b51629d895.js","989","static/chunks/47d8844f-cac2989cb39ba350.js","147","static/chunks/a30376cd-0e2abcaded0e4cfc.js","995","static/chunks/fee69bc6-4490eb47d2aaaa72.js","739","static/chunks/7a8a3e83-1a4edb77e4d0142d.js","283","static/chunks/450c323b-ff537c106edf3f59.js","303","static/chunks/36e1c10d-440dfddfa8195fa6.js","22","static/chunks/29e3cc0d-b9131230fdb267e7.js","25","static/chunks/b63b1b3f-fbe2ac2c00b4eb2f.js","355","static/chunks/7f27ae6c-9c6bdf82ccd2f646.js","495","static/chunks/6dc81886-d45acadb4b6674c7.js","599","static/chunks/c132bf7d-3375ff4277eceb81.js","971","static/chunks/cd9f8d63-ba9b342f3d5e92ac.js","764","static/chunks/764-350e6bbb8a63c229.js","931","static/chunks/app/page-6ff79de000e5b4bd.js"],"default",1]
2
+ 3:I[1822,["266","static/chunks/e24bf851-38fffe87a7b8784a.js","517","static/chunks/c1ceaa8b-c4f0232ef5c2c9ba.js","678","static/chunks/3998a672-18454f939c052b39.js","509","static/chunks/9746af58-344daabf5df08121.js","895","static/chunks/ce84277d-3aa717f588901c96.js","989","static/chunks/47d8844f-cac2989cb39ba350.js","147","static/chunks/a30376cd-0e2abcaded0e4cfc.js","995","static/chunks/fee69bc6-4490eb47d2aaaa72.js","739","static/chunks/7a8a3e83-1a4edb77e4d0142d.js","283","static/chunks/450c323b-ff537c106edf3f59.js","303","static/chunks/36e1c10d-440dfddfa8195fa6.js","22","static/chunks/29e3cc0d-b9131230fdb267e7.js","25","static/chunks/b63b1b3f-fbe2ac2c00b4eb2f.js","355","static/chunks/7f27ae6c-9c6bdf82ccd2f646.js","495","static/chunks/6dc81886-d45acadb4b6674c7.js","599","static/chunks/c132bf7d-3375ff4277eceb81.js","971","static/chunks/cd9f8d63-ba9b342f3d5e92ac.js","764","static/chunks/764-350e6bbb8a63c229.js","931","static/chunks/app/page-9bc00f15470199ef.js"],"default",1]
3
3
  4:I[49712,[],""]
4
4
  5:I[30691,[],""]
5
- 0:["KZBcKj-BHQq_dqlxZTfGX",[[["",{"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:["m8B4OtT1DK5I_5uAc51bn",[[["",{"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
recce/util/cll.py CHANGED
@@ -5,7 +5,7 @@ from typing import Dict, List, Literal
5
5
  from sqlglot import parse_one, Dialect
6
6
  from sqlglot.errors import SqlglotError, OptimizeError
7
7
  from sqlglot.expressions import Column, Alias, Func, Binary, Paren, Case, Expression, If, Union, Intersect
8
- from sqlglot.optimizer import traverse_scope
8
+ from sqlglot.optimizer import traverse_scope, Scope
9
9
  from sqlglot.optimizer.qualify import qualify
10
10
 
11
11
  from recce.exceptions import RecceException
@@ -91,7 +91,7 @@ def _cll_expression(expression, table_alias_map) -> ColumnLevelDependencyColumn:
91
91
  if alias is None:
92
92
  table = next(iter(table_alias_map.values()))
93
93
  else:
94
- table = table_alias_map[alias]
94
+ table = table_alias_map.get(alias, alias)
95
95
 
96
96
  return ColumnLevelDependencyColumn(
97
97
  type='passthrough',
@@ -232,7 +232,13 @@ def cll(sql, schema=None, dialect=None) -> Dict[str, ColumnLevelDependencyColumn
232
232
  for col_dep in column_cll.depends_on:
233
233
  col_dep_node = col_dep.node
234
234
  col_dep_column = col_dep.column
235
+ # cte
235
236
  cte_scope = scope.cte_sources.get(col_dep_node)
237
+ # inline derived table
238
+ source_scope = None
239
+ if isinstance(scope.sources.get(col_dep_node), Scope):
240
+ source_scope = scope.sources.get(col_dep_node)
241
+
236
242
  if cte_scope is not None:
237
243
  cte_cll = global_lineage[cte_scope]
238
244
  if cte_cll is None or cte_cll.get(col_dep_column) is None:
@@ -240,6 +246,11 @@ def cll(sql, schema=None, dialect=None) -> Dict[str, ColumnLevelDependencyColumn
240
246
  continue
241
247
  cte_type = cte_cll.get(col_dep_column).type
242
248
  flatten_col_depends_on.extend(cte_cll.get(col_dep_column).depends_on)
249
+ elif source_scope is not None:
250
+ source_cll = global_lineage[source_scope]
251
+ if source_cll is None or source_cll.get(col_dep_column) is None:
252
+ continue
253
+ flatten_col_depends_on.extend(source_cll.get(col_dep_column).depends_on)
243
254
  else:
244
255
  flatten_col_depends_on.append(col_dep)
245
256
 
@@ -255,8 +266,11 @@ def cll(sql, schema=None, dialect=None) -> Dict[str, ColumnLevelDependencyColumn
255
266
  # transformation type
256
267
  type = column_cll.type
257
268
  if type == 'derived':
258
- # keep current scope type
259
- pass
269
+ if len(dedup_col_depends_on) == 0:
270
+ type = 'source'
271
+ else:
272
+ # keep current scope type
273
+ pass
260
274
  elif cte_type is not None:
261
275
  if len(dedup_col_depends_on) > 1:
262
276
  type = 'derived'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: recce-nightly
3
- Version: 0.57.0.20250310
3
+ Version: 0.58.0.20250312
4
4
  Summary: Environment diff tool for dbt
5
5
  Home-page: https://github.com/InfuseAI/recce
6
6
  Author: InfuseAI Dev Team
@@ -1,7 +1,7 @@
1
- recce/VERSION,sha256=77PR86RA3qPr9Uic28-vbhYT0vZYPRhtkPbh1Sx4gZE,16
1
+ recce/VERSION,sha256=XfBzFspneqsM8bl4-lb_TYalH93ZUq1isQIP1kKm45o,16
2
2
  recce/__init__.py,sha256=PUViz81KEpWnnIvX3wRaz3hq7FVUorVoZdbLNfSBaoM,1879
3
3
  recce/artifact.py,sha256=a7P1cXd6lglEZF2OYeNvsEg9ME-ocJo5oPU4VZVeaz0,6586
4
- recce/cli.py,sha256=vmZ-OwSlcWsYuIrxHpZdbdJOO67ZDQm8LLgBI6sMY4o,30295
4
+ recce/cli.py,sha256=ZnDmPlJC8YkjMNrqV4HwwwHisHCWXcB1JhM2YbrXPNI,30265
5
5
  recce/config.py,sha256=ajvh4ZOblIU4ho684ca2ESUtMlKv8_Q2EG9WqL1Ruwc,4673
6
6
  recce/core.py,sha256=dwa-2mKYnBjJPJGf_siG_h2DO6Tj1Q5APfCJ5e368io,10463
7
7
  recce/diff.py,sha256=xLcBt4sW4sJCJ9tTCIpnV4SUHtYvMfYB1kX136iQbc0,794
@@ -16,19 +16,17 @@ recce/summary.py,sha256=yPAaGCkOmfhLjwF2rGpS66XR88TjyNG6GI3T6lsRIeg,18809
16
16
  recce/adapter/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
17
17
  recce/adapter/base.py,sha256=rCdRJklpgAnQ864Ez0c0tzU_YPCWIb4clNiJ87niDcg,3582
18
18
  recce/adapter/sqlmesh_adapter.py,sha256=_nnWHhd46p1MIW5-riQFYMf638OlSdwugIKgTwYiRYM,5160
19
- recce/adapter/dbt_adapter/__init__.py,sha256=HQis4rEGIfS3_ONSMNy-cRqe6bbu6_u5-LXvJiSquzY,46642
19
+ recce/adapter/dbt_adapter/__init__.py,sha256=ErbZLYIgSoWyw7DEusm6BE7Z08mdc7W0INM4tLqvugM,47035
20
20
  recce/adapter/dbt_adapter/dbt_version.py,sha256=CwsOEu101fzMUwUYD3Y7btDPAALQNwA7J6C4Auc_wzM,1225
21
21
  recce/apis/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
22
22
  recce/apis/check_api.py,sha256=S4OYx3vR5iezo1vnWpk56JUZiprAr9UgYcz-HEIsROs,6211
23
23
  recce/apis/check_func.py,sha256=onhGppZ7LDrVmipHaXZI-WaTVRFZDwb2oQhbYe0tSXY,4316
24
24
  recce/apis/run_api.py,sha256=FdNFWt7JrPbCv2CQkswbsaw5gZNGesjQBi749jbQtK0,3326
25
25
  recce/apis/run_func.py,sha256=ndEqhNzZtWvQsWUFhfPJ7GcjzJaI5vfBpDsU1adqOrI,7136
26
- recce/data/404.html,sha256=OO_Hs_dbWm5hT4HDljFe6pQSDtNjkjw9ghIc11dqZek,6206
26
+ recce/data/404.html,sha256=X4bfw8JQ3Wwj3v8DAwdkHAe0TR6PltQ3_zh5hlCOc44,6206
27
27
  recce/data/favicon.ico,sha256=B2mBumUOnzvUrXrqNkrc5QfdDXjzEXRcWkWur0fJ6sM,2565
28
- recce/data/index.html,sha256=ZvcdltU8gGArBVrYTxT8YfNxiUxCROuNl_DCwVPN5EQ,38924
29
- recce/data/index.txt,sha256=609HPGK24sL4ytEwj4RuJAVLisfCgriYgtAB2oDCNsQ,3283
30
- recce/data/_next/static/KZBcKj-BHQq_dqlxZTfGX/_buildManifest.js,sha256=exkbHO1leuEKEXHHfj0lbuMtCwdCvEooo-IROnmIziM,224
31
- recce/data/_next/static/KZBcKj-BHQq_dqlxZTfGX/_ssgManifest.js,sha256=Z49s4suAsf5y_GfnQSvm4qtq2ggxEbZPfEDTXjy6XgA,80
28
+ recce/data/index.html,sha256=4QiHlGJp6qfIaAV6DchZfOh2cEwED0yNdZmuLMmNnt4,38923
29
+ recce/data/index.txt,sha256=fr7idwE4YktrurHaNVdqarBeLBona41w8pquupKoJJs,3282
32
30
  recce/data/_next/static/chunks/29e3cc0d-b9131230fdb267e7.js,sha256=37FmTMjhQVxlEmYqvJJ216ETHQvHptSPibf99Lu80Hw,700
33
31
  recce/data/_next/static/chunks/36e1c10d-440dfddfa8195fa6.js,sha256=qt9sigGpLVxFi4TEdU2DApSGcCdTP0At0ADCIttRXaY,7834
34
32
  recce/data/_next/static/chunks/3998a672-18454f939c052b39.js,sha256=AYGoGBDH2RnulfT1bZn9h-lxrI1T9qxcB-vCkQakYvs,9024
@@ -46,7 +44,7 @@ recce/data/_next/static/chunks/b63b1b3f-fbe2ac2c00b4eb2f.js,sha256=GDnIPq_pAw9bB
46
44
  recce/data/_next/static/chunks/c132bf7d-3375ff4277eceb81.js,sha256=1RngtzcdyN0cn7-AaIe0MAGHGZGzIPOYnC0wjSGDvd8,198537
47
45
  recce/data/_next/static/chunks/c1ceaa8b-c4f0232ef5c2c9ba.js,sha256=Qa9sq70raxPDIqGfMNGsqMvcvn_4oSOW0qLhW_x4J2I,81301
48
46
  recce/data/_next/static/chunks/cd9f8d63-ba9b342f3d5e92ac.js,sha256=mFQ9Kal5Uo1h3I_pdTFZAkXDfzmTahHK1jaBUX6_hpk,82989
49
- recce/data/_next/static/chunks/ce84277d-3cee88b51629d895.js,sha256=UO9OUHwfPe7OLUUijS1ZTnII4LBIm0HIbMFb3x6jVIw,1151
47
+ recce/data/_next/static/chunks/ce84277d-3aa717f588901c96.js,sha256=S1giaEo5WIRpXC0AEQRmBMokzjuzmXKK29duKJeEIR0,2562
50
48
  recce/data/_next/static/chunks/e24bf851-38fffe87a7b8784a.js,sha256=RJCLHr-FOgG9e3P7oPqkVGngvJjowxp0lGUOjeBrAHQ,154153
51
49
  recce/data/_next/static/chunks/fee69bc6-4490eb47d2aaaa72.js,sha256=VUqzkEYmj__weFY-sKMolY5fnZ5xPq2lN2ot3RwJD2c,484
52
50
  recce/data/_next/static/chunks/framework-ded83d71b51ce901.js,sha256=0Xsxxnmw5fjRHz8ni6vlaF9tQjfjNGZcZv2oMy7A_T4,140000
@@ -55,11 +53,13 @@ recce/data/_next/static/chunks/main-app-6f45568a6a7cd7b0.js,sha256=hGpeb-FK-N-AX
55
53
  recce/data/_next/static/chunks/polyfills-42372ed130431b0a.js,sha256=CXPB1kyIrcjjyVBBDLWLKI9yEY1ZZbeASUON648vloM,112594
56
54
  recce/data/_next/static/chunks/webpack-5ab3237140d2c0f8.js,sha256=UhIOPFOodp6y1VtJwVwZ3pJpFRAcL8fxH3StMg_GmKI,3839
57
55
  recce/data/_next/static/chunks/app/layout-2ba8d6f3664176aa.js,sha256=a7GPQIB1NRTmOOtJjq6T6jgW94croNWWad7y8nVUTyY,162
58
- recce/data/_next/static/chunks/app/page-6ff79de000e5b4bd.js,sha256=bc7OKDHHhk3El7KB0p3eyPH0ubJ-3VM_3CI9Mi7ece4,191582
56
+ recce/data/_next/static/chunks/app/page-9bc00f15470199ef.js,sha256=nIqBb5RIT2YzWfphhaoH4c46QEmyhJYADjhYR5LU5bw,192839
59
57
  recce/data/_next/static/chunks/app/_not-found/page-8fb2dd95da4548ae.js,sha256=KHevuFyLhcoxj_GPVwKGwjm6TlpxZwKerTojSKeA0vY,1749
60
58
  recce/data/_next/static/chunks/pages/_app-bbd1966052cb1e5d.js,sha256=J3yb8gzUVS_QjdgYlepNJ9mPJWsQ73io3cS5S8aa_yE,284
61
59
  recce/data/_next/static/chunks/pages/_error-2456b9a2e0600a52.js,sha256=OQiA3e-DyZV7_RmSuJcxYK7KPaWYAhOTx8gW6cdaNI8,250
62
60
  recce/data/_next/static/css/c9ecb46a4b21c126.css,sha256=JbGypR8aDNuZavNvH6dhPtSbMVSCsy0ycPrz_6XkiVc,21925
61
+ recce/data/_next/static/m8B4OtT1DK5I_5uAc51bn/_buildManifest.js,sha256=exkbHO1leuEKEXHHfj0lbuMtCwdCvEooo-IROnmIziM,224
62
+ recce/data/_next/static/m8B4OtT1DK5I_5uAc51bn/_ssgManifest.js,sha256=Z49s4suAsf5y_GfnQSvm4qtq2ggxEbZPfEDTXjy6XgA,80
63
63
  recce/data/_next/static/media/montserrat-cyrillic-800-normal.22628180.woff2,sha256=P5Sx5PNkdTlDYzAdulW_OPRfMokDLi6XTpmS8KJSRoI,11148
64
64
  recce/data/_next/static/media/montserrat-cyrillic-800-normal.31d693bb.woff,sha256=ITxULbMzWscxwUi_v3GpzTSYVWlwq_z9fpEvAkEvHJw,11020
65
65
  recce/data/_next/static/media/montserrat-cyrillic-ext-800-normal.7e2c1e62.woff,sha256=6J3PqBk_hOFVM8PpfZeSfwZQumQd6LTPPjnaVha2KQ0,12672
@@ -96,7 +96,7 @@ recce/tasks/valuediff.py,sha256=7GcSy7emPSLXjqcJomJ5aK9V8Eamo864ln-iOyNnW5A,1511
96
96
  recce/util/__init__.py,sha256=0lcJectK7Z7k9h0EaYCcv4Bgw2PN03OdJoxb3tbV5j8,37
97
97
  recce/util/breaking.py,sha256=GnUHuk1xm1pEKu8u8kZx4rGhy1BQvUrD8oTSNTNMOq8,2052
98
98
  recce/util/cache.py,sha256=QB6wzxe0M3jNTwP0M27Ys8F2hF-oda4-LyXXG9THuZQ,646
99
- recce/util/cll.py,sha256=hrKd4DGqu51T3rju3C_nI-HZIpJ_Tz6lDH8ESIbAwys,11463
99
+ recce/util/cll.py,sha256=fEh13utsobam6fEqyDRXvtxUqXfqZRN-rlTxXXK7NDI,12206
100
100
  recce/util/io.py,sha256=uMBpJBKKOUPHTBgntkVkuaVUkY8grDIlA8ORCtFLE5E,3372
101
101
  recce/util/logger.py,sha256=Vmd2PuyzBkML7zvPmJKe3yNfELFjRZqX7abA23wquzg,746
102
102
  recce/util/pydantic_model.py,sha256=KumKuyCjbTzEMsKLE4-b-eZfp0gLhYDdmVtw1-hxiJw,587
@@ -107,7 +107,7 @@ tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
107
107
  tests/test_cli.py,sha256=tEQJVT8TbrAOPkIqkVJR6e2k-4dGJZMQVdsYC4DSQAE,5613
108
108
  tests/test_config.py,sha256=FM55tG0Yaqu8x9l6EiJtFJDUu6F2n96vW4_xbX3O7DY,1579
109
109
  tests/test_core.py,sha256=J75kZPY5B4LdT2T9o61ljiAb2QPk198qVhbh6l4MZJo,769
110
- tests/test_dbt.py,sha256=FGgUg94oa5ClYGL2KmQYM29Z52h9HJ6-DQD8AvqYtps,7588
110
+ tests/test_dbt.py,sha256=KOW-RfcwrBS6NUkdpoHY00nJPOaaGD2-TEjrK9X93Gs,1537
111
111
  tests/test_pull_request.py,sha256=DJl4NIxDiNfcskSuRf2qFgWDb7CSVoCB3EzzUwvRn-o,3562
112
112
  tests/test_server.py,sha256=TgHjn3J1GGqgEpx2FEaf0IIdCIipiSjt97Kt_ISgjgc,3377
113
113
  tests/test_state.py,sha256=bKMjJ9Cq9rXDIEkWeZMNbdTZzwcVpTSiKlztJQO-ajY,4951
@@ -115,8 +115,9 @@ tests/test_summary.py,sha256=d8V7dhJuQHsEkEOGq7nCiV_a0m2uEEoFwhlH7atBHE0,2735
115
115
  tests/adapter/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
116
116
  tests/adapter/dbt_adapter/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
117
117
  tests/adapter/dbt_adapter/conftest.py,sha256=xLt7XJctbPqY4KtAkD1fcxhoAk0v0QUFNzAyJiGunkA,271
118
- tests/adapter/dbt_adapter/dbt_test_helper.py,sha256=wpASqGIu8GmZOdk2V_cKnRszsn675w50JWQlByc1Mqc,7831
118
+ tests/adapter/dbt_adapter/dbt_test_helper.py,sha256=qLdjlyy-cEuxz4fEpG2YN-vIg-yk-SazMT3weqAUp0A,9912
119
119
  tests/adapter/dbt_adapter/test_dbt_adapter.py,sha256=ZksKGGEo2rIziPjVG-dAh3xaj8YDBbHg_D5q2GPQRR8,1520
120
+ tests/adapter/dbt_adapter/test_dbt_cll.py,sha256=U8kjdXLpUTO4bOecG8ekDauE3YiBhi3xmB169i7Z0Sg,4114
120
121
  tests/adapter/dbt_adapter/test_selector.py,sha256=z6mStaj31d4BuNjvfpoMq4QbWZKLyo4rTFYL0rQvMK0,6255
121
122
  tests/tasks/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
122
123
  tests/tasks/conftest.py,sha256=UefgbNfJufLOmgHLiEFXIjOVmu8-58GbS6m5-NcEu20,143
@@ -129,9 +130,9 @@ tests/tasks/test_row_count.py,sha256=hjrKP1u2aZ9V0EWb0WGXDz4-V2kYaiNeiJ_Mqin8BPg
129
130
  tests/tasks/test_schema.py,sha256=O2zLJzzYZBwoKA5BVYDE7UuaeQtAznKzFDXNw7xzMU4,2897
130
131
  tests/tasks/test_top_k.py,sha256=hqYWSd9xE1GU0wgvpgKeLHbPVd5CABYcTJvgA49JRyA,1707
131
132
  tests/tasks/test_valuediff.py,sha256=_z1Ci4ba4lFSWwbj7cbKBRtWqLgV_1HIZGqQlEFl61o,1863
132
- recce_nightly-0.57.0.20250310.dist-info/LICENSE,sha256=CQjjMy9aYPhfe8xG_bcpIfKtNkdxLZ5IOb8oPygtUhY,11343
133
- recce_nightly-0.57.0.20250310.dist-info/METADATA,sha256=NLO2OskdFUmNsRiQjT9vWPQqVUhyb3cKnNyMfBKgPgc,13218
134
- recce_nightly-0.57.0.20250310.dist-info/WHEEL,sha256=52BFRY2Up02UkjOa29eZOS2VxUrpPORXg1pkohGGUS8,91
135
- recce_nightly-0.57.0.20250310.dist-info/entry_points.txt,sha256=oqoY_IiwIqXbgrIsPnlqUqao2eiIeP2dprowkOlmeyg,40
136
- recce_nightly-0.57.0.20250310.dist-info/top_level.txt,sha256=6PKGVpf75idP0C6KEaldDzzZUauIxNu1ZDstau1pI4I,12
137
- recce_nightly-0.57.0.20250310.dist-info/RECORD,,
133
+ recce_nightly-0.58.0.20250312.dist-info/LICENSE,sha256=CQjjMy9aYPhfe8xG_bcpIfKtNkdxLZ5IOb8oPygtUhY,11343
134
+ recce_nightly-0.58.0.20250312.dist-info/METADATA,sha256=-1oI005s6N_thvR-fTfp_KipHRjO0SPmJJ-pXwocw0Y,13218
135
+ recce_nightly-0.58.0.20250312.dist-info/WHEEL,sha256=52BFRY2Up02UkjOa29eZOS2VxUrpPORXg1pkohGGUS8,91
136
+ recce_nightly-0.58.0.20250312.dist-info/entry_points.txt,sha256=oqoY_IiwIqXbgrIsPnlqUqao2eiIeP2dprowkOlmeyg,40
137
+ recce_nightly-0.58.0.20250312.dist-info/top_level.txt,sha256=6PKGVpf75idP0C6KEaldDzzZUauIxNu1ZDstau1pI4I,12
138
+ recce_nightly-0.58.0.20250312.dist-info/RECORD,,
@@ -1,9 +1,11 @@
1
1
  import os
2
2
  import textwrap
3
3
  import uuid
4
+ from datetime import datetime
4
5
  from io import StringIO
5
6
 
6
- from dbt.contracts.graph.nodes import ModelNode, SnapshotNode
7
+ from dbt.contracts.graph.nodes import ModelNode, SnapshotNode, SeedNode, SourceDefinition
8
+ from dbt.contracts.results import CatalogArtifact, ColumnMetadata, CatalogTable, TableMetadata
7
9
 
8
10
  from recce.adapter.dbt_adapter import DbtAdapter, as_manifest, load_manifest
9
11
  from recce.core import RecceContext
@@ -38,6 +40,21 @@ class DbtTestHelper:
38
40
 
39
41
  self.curr_manifest = as_manifest(curr_writable_manifest)
40
42
  self.base_manifest = as_manifest(base_writable_manifest)
43
+ now = datetime.now()
44
+ self.curr_catalog = CatalogArtifact.from_results(
45
+ generated_at=now,
46
+ nodes={},
47
+ sources={},
48
+ compile_results=None,
49
+ errors=None,
50
+ )
51
+ self.base_catalog = CatalogArtifact.from_results(
52
+ generated_at=now,
53
+ nodes={},
54
+ sources={},
55
+ compile_results=None,
56
+ errors=None,
57
+ )
41
58
  self.context = context
42
59
 
43
60
  self.adapter.execute(f"CREATE schema IF NOT EXISTS {self.base_schema}")
@@ -46,7 +63,9 @@ class DbtTestHelper:
46
63
  base_writable_manifest,
47
64
  curr_writable_manifest,
48
65
  self.curr_manifest,
49
- self.base_manifest
66
+ self.base_manifest,
67
+ self.base_catalog,
68
+ self.curr_catalog,
50
69
  )
51
70
 
52
71
  def create_model(
@@ -59,21 +78,52 @@ class DbtTestHelper:
59
78
  depends_on=[],
60
79
  disabled=False,
61
80
  unique_id=None,
81
+ resource_type="model",
62
82
  package_name="recce_test",
83
+ base_columns: dict[str, str] = None,
84
+ curr_columns: dict[str, str] = None,
85
+ patch_func=None,
63
86
  ):
64
87
  # unique_id = f"model.{package_name}.{model_name}"
65
88
  unique_id = unique_id if unique_id else model_name
66
89
 
67
- def _add_model_to_manifest(base, raw_code):
90
+ def _add_model_to_manifest(base):
68
91
  if base:
69
92
  schema = self.base_schema
70
93
  manifest = self.base_manifest
94
+ catalog = self.base_catalog
95
+ csv = base_csv
96
+ sql = base_sql
97
+ columns = base_columns
71
98
  else:
72
99
  schema = self.curr_schema
73
100
  manifest = self.curr_manifest
101
+ catalog = self.curr_catalog
102
+ csv = curr_csv
103
+ sql = curr_sql
104
+ columns = curr_columns
105
+
106
+ if csv:
107
+ dbt_adapter = self.adapter
108
+ csv = textwrap.dedent(csv)
109
+ with dbt_adapter.connection_named('create model'):
110
+ import pandas as pd
111
+ df = pd.read_csv(StringIO(csv))
112
+ dbt_adapter.execute(f"CREATE TABLE {schema}.{model_name} AS SELECT * FROM df")
113
+ raw_code = sql if sql else csv
74
114
 
75
- node = ModelNode.from_dict({
76
- "resource_type": "model",
115
+ if columns:
116
+ index = 1
117
+ table = CatalogTable(
118
+ TableMetadata(type="BASE TABLE", schema=schema, name=model_name), {}, {})
119
+ catalog.nodes[unique_id] = table
120
+ for column, column_type in columns.items():
121
+ col_data = ColumnMetadata(type=column_type, index=index, name=column)
122
+ catalog.nodes[unique_id].columns[column] = col_data
123
+ index = index + 1
124
+
125
+ node_dict = {
126
+ "resource_type": resource_type,
77
127
  "name": model_name,
78
128
  "package_name": package_name,
79
129
  "path": "",
@@ -98,7 +148,16 @@ class DbtTestHelper:
98
148
  "depends_on": {
99
149
  "nodes": depends_on
100
150
  },
101
- })
151
+ }
152
+ if patch_func:
153
+ patch_func(node_dict)
154
+
155
+ if resource_type == "snapshot":
156
+ node = SnapshotNode.from_dict(node_dict)
157
+ elif resource_type == "seed":
158
+ node = SeedNode.from_dict(node_dict)
159
+ else:
160
+ node = ModelNode.from_dict(node_dict)
102
161
 
103
162
  if disabled:
104
163
  manifest.add_disabled_nofile(node)
@@ -106,32 +165,19 @@ class DbtTestHelper:
106
165
  manifest.add_node_nofile(node)
107
166
  return node
108
167
 
109
- dbt_adapter = self.adapter
110
- with dbt_adapter.connection_named('create model'):
111
- import pandas as pd
112
- if base_csv:
113
- base_csv = textwrap.dedent(base_csv)
114
- _add_model_to_manifest(True, base_csv)
115
- df_base = pd.read_csv(StringIO(base_csv))
116
- dbt_adapter.execute(f"CREATE TABLE {self.base_schema}.{model_name} AS SELECT * FROM df_base")
117
- elif base_sql:
118
- bas_sql = textwrap.dedent(base_sql)
119
- _add_model_to_manifest(True, base_sql)
120
-
121
- if curr_csv:
122
- curr_csv = textwrap.dedent(curr_csv)
123
- _add_model_to_manifest(False, curr_csv)
124
- df_curr = pd.read_csv(StringIO(curr_csv))
125
- dbt_adapter.execute(f"CREATE TABLE {self.curr_schema}.{model_name} AS SELECT * FROM df_curr")
126
- elif curr_sql:
127
- curr_sql = textwrap.dedent(curr_sql)
128
- _add_model_to_manifest(False, curr_sql)
168
+ if base_csv or base_sql:
169
+ _add_model_to_manifest(True)
170
+
171
+ if curr_csv or curr_sql:
172
+ _add_model_to_manifest(False)
129
173
 
130
174
  self.adapter.set_artifacts(
131
175
  self.base_manifest.writable_manifest(),
132
176
  self.curr_manifest.writable_manifest(),
133
177
  self.curr_manifest,
134
- self.base_manifest)
178
+ self.base_manifest,
179
+ self.base_catalog,
180
+ self.curr_catalog)
135
181
 
136
182
  def remove_model(self, model_name):
137
183
  dbt_adapter = self.adapter
@@ -139,76 +185,97 @@ class DbtTestHelper:
139
185
  dbt_adapter.execute(f"DROP TABLE IF EXISTS {self.base_schema}.{model_name}")
140
186
  dbt_adapter.execute(f"DROP TABLE IF EXISTS {self.curr_schema}.{model_name} ")
141
187
 
142
- def cleanup(self):
143
- dbt_adapter = self.adapter
144
- with dbt_adapter.connection_named('cleanup'):
145
- dbt_adapter.execute(f"DROP SCHEMA IF EXISTS {self.base_schema} CASCADE")
146
- dbt_adapter.execute(f"DROP SCHEMA IF EXISTS {self.curr_schema} CASCADE")
147
-
148
- def create_snapshot(self, sanpshot_name, base_csv, curr_csv, depends_on=[]):
149
- package_name = "recce_test"
188
+ def create_source(
189
+ self,
190
+ source_name,
191
+ table_name,
192
+ base_csv=None,
193
+ curr_csv=None,
194
+ unique_id=None,
195
+ package_name="recce_test",
196
+ base_columns: dict[str, str] = None,
197
+ curr_columns: dict[str, str] = None,
198
+ patch_func=None,
199
+ ):
150
200
  # unique_id = f"model.{package_name}.{model_name}"
151
- unique_id = sanpshot_name
201
+ unique_id = unique_id if unique_id else f"{source_name}.{table_name}"
152
202
 
153
- def _add_snapshot_to_manifest(base, raw_code):
203
+ def _add_source_to_manifest(base):
154
204
  if base:
155
205
  schema = self.base_schema
156
206
  manifest = self.base_manifest
207
+ catalog = self.base_catalog
208
+ csv = base_csv
209
+ columns = base_columns
157
210
  else:
158
211
  schema = self.curr_schema
159
212
  manifest = self.curr_manifest
213
+ catalog = self.curr_catalog
214
+ csv = curr_csv
215
+ columns = curr_columns
216
+
217
+ if csv:
218
+ dbt_adapter = self.adapter
219
+ csv = textwrap.dedent(csv)
220
+ with dbt_adapter.connection_named('create source'):
221
+ import pandas as pd
222
+ df = pd.read_csv(StringIO(csv))
223
+ dbt_adapter.execute(f"CREATE TABLE {schema}.{table_name} AS SELECT * FROM df")
160
224
 
161
- node = SnapshotNode.from_dict({
162
- "resource_type": "snapshot",
163
- "name": sanpshot_name,
225
+ if columns:
226
+ index = 1
227
+ table = CatalogTable(
228
+ TableMetadata(type="BASE TABLE", schema=schema, name=table_name), {}, {})
229
+ catalog.sources[unique_id] = table
230
+ for column, column_type in columns.items():
231
+ col_data = ColumnMetadata(type=column_type, index=index, name=column)
232
+ catalog.sources[unique_id].columns[column] = col_data
233
+ index = index + 1
234
+
235
+ node_dict = {
236
+ "resource_type": "source",
237
+ "source_name": source_name,
238
+ "name": table_name,
239
+ "identifier": table_name,
240
+ "source_description": "test source",
241
+ "loader": "",
164
242
  "package_name": package_name,
165
243
  "path": "",
166
244
  "original_file_path": "",
167
245
  "unique_id": unique_id,
168
246
  "fqn": [
169
247
  package_name,
170
- sanpshot_name,
248
+ source_name,
249
+ table_name,
171
250
  ],
172
251
  "schema": schema,
173
- "alias": sanpshot_name,
174
- "checksum": {
175
- "name": "sha256",
176
- "checksum": hash(raw_code),
177
- },
178
- "raw_code": raw_code,
179
- "config": {
180
- "materialized": "snapshot",
181
- "tags": ["test_tag"],
182
- },
183
- "tags": ["test_tag"],
184
- "depends_on": {
185
- "nodes": depends_on
186
- },
187
- })
188
- manifest.add_node_nofile(node)
189
- return node
252
+ }
253
+ if patch_func:
254
+ patch_func(node_dict)
190
255
 
191
- base_csv = textwrap.dedent(base_csv)
192
- curr_csv = textwrap.dedent(curr_csv)
256
+ source = SourceDefinition.from_dict(node_dict)
257
+ manifest.sources[unique_id] = source
258
+ return source
193
259
 
194
- _add_snapshot_to_manifest(True, base_csv)
195
- _add_snapshot_to_manifest(False, curr_csv)
260
+ if base_csv:
261
+ _add_source_to_manifest(True)
262
+
263
+ if curr_csv:
264
+ _add_source_to_manifest(False)
196
265
 
197
- import pandas as pd
198
- df_base = pd.read_csv(StringIO(base_csv))
199
- df_curr = pd.read_csv(StringIO(curr_csv))
200
- dbt_adapter = self.adapter
201
- with dbt_adapter.connection_named('create model'):
202
- dbt_adapter.execute(f"CREATE TABLE {self.base_schema}.{sanpshot_name} AS SELECT * FROM df_base")
203
- dbt_adapter.execute(f"CREATE TABLE {self.curr_schema}.{sanpshot_name} AS SELECT * FROM df_curr")
204
266
  self.adapter.set_artifacts(
205
267
  self.base_manifest.writable_manifest(),
206
268
  self.curr_manifest.writable_manifest(),
207
269
  self.curr_manifest,
208
- self.base_manifest)
270
+ self.base_manifest,
271
+ self.base_catalog,
272
+ self.curr_catalog)
209
273
 
210
- def remove_snapshot(self, snapshot_name):
274
+ def cleanup(self):
211
275
  dbt_adapter = self.adapter
212
276
  with dbt_adapter.connection_named('cleanup'):
213
- dbt_adapter.execute(f"DROP TABLE IF EXISTS {self.base_schema}.{snapshot_name}")
214
- dbt_adapter.execute(f"DROP TABLE IF EXISTS {self.curr_schema}.{snapshot_name} ")
277
+ dbt_adapter.execute(f"DROP SCHEMA IF EXISTS {self.base_schema} CASCADE")
278
+ dbt_adapter.execute(f"DROP SCHEMA IF EXISTS {self.curr_schema} CASCADE")
279
+
280
+ def create_snapshot(self, sanpshot_name, base_csv, curr_csv, depends_on=[]):
281
+ self.create_model(sanpshot_name, base_csv, curr_csv, depends_on=depends_on, resource_type="snapshot")