ingestr is a CLI tool to copy data between any databases with a single command seamlessly.
This report summarizes scanner evidence for bruin-data/ingestr, a Go project with 4,039 GitHub stars. SynthScan examined 490,872 lines of code across 1632 source files, recording 414 pattern matches distributed across 17 syntactic categories. The legacy adjusted pattern signal is 1.6 (Low pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Payload schema: 1.0.0 · Engine: 2.0.0 · Scoring: heuristic-density-v1 · Scan date: 2026-10-31.
Can maintainers explain intent, assumptions, and trade-offs? 294 finding(s).
Are imports declared and package/API names verified? 79 finding(s).
Are wrappers, guards, and repeated structures necessary? 87 finding(s).
Which changes need focused human review? 414 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 414 distinct pattern matches across 17 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | docs/supported-sources/applovin_max.md | 9 | applovinmax://?api_key=<your_api_key> | CODE |
| HIGH | docs/supported-sources/allium.md | 36 | --source-uri 'allium://?api_key=your_api_key' \ | CODE |
| HIGH | docs/supported-sources/allium.md | 90 | --source-uri 'allium://?api_key=your_api_key' \ | CODE |
| HIGH | docs/supported-sources/allium.md | 100 | --source-uri 'allium://?api_key=your_api_key' \ | CODE |
| HIGH | docs/supported-sources/allium.md | 112 | --source-uri 'allium://?api_key=your_api_key' \ | CODE |
| HIGH | docs/supported-sources/allium.md | 126 | --source-uri 'allium://?api_key=your_api_key' \ | CODE |
| HIGH | docs/supported-sources/allium.md | 140 | --source-uri 'allium://?api_key=your_api_key' \ | CODE |
| HIGH | docs/supported-sources/fundraiseup.md | 20 | Assuming your API key is `your_api_key`, you can ingest donations into DuckDB using: | CODE |
| HIGH | docs/supported-sources/fundraiseup.md | 24 | --source-uri 'fundraiseup://?api_key=your_api_key' \ | CODE |
| HIGH⚡ | docs/supported-sources/fundraiseup.md | 58 | --source-uri 'fundraiseup://?api_key=your_api_key' \ | CODE |
| HIGH⚡ | docs/supported-sources/fundraiseup.md | 65 | --source-uri 'fundraiseup://?api_key=your_api_key' \ | CODE |
| HIGH⚡ | docs/supported-sources/fundraiseup.md | 72 | --source-uri 'fundraiseup://?api_key=your_api_key' \ | CODE |
| HIGH⚡ | docs/supported-sources/fundraiseup.md | 79 | --source-uri 'fundraiseup://?api_key=your_api_key' \ | CODE |
| HIGH | docs/supported-sources/applovin.md | 10 | applovin://?api_key=<your_api_key> | CODE |
| HIGH | docs/supported-sources/cursor.md | 33 | --source-uri 'cursor://?api_key=your_api_key' \ | CODE |
| HIGH | docs/supported-sources/cursor.md | 60 | --source-uri 'cursor://?api_key=your_api_key' \ | CODE |
| HIGH | docs/supported-sources/cursor.md | 70 | --source-uri 'cursor://?api_key=your_api_key' \ | CODE |
| HIGH | docs/supported-sources/cursor.md | 84 | --source-uri 'cursor://?api_key=your_api_key' \ | CODE |
| HIGH | docs/supported-sources/cursor.md | 96 | --source-uri 'cursor://?api_key=your_api_key' \ | CODE |
| HIGH | docs/supported-sources/cursor.md | 108 | --source-uri 'cursor://?api_key=your_api_key' \ | CODE |
| HIGH | docs/supported-sources/sumble.md | 19 | --source-uri 'sumble://?api_key=your-api-key' \ | CODE |
| HIGH | docs/supported-sources/sumble.md | 57 | --source-uri 'sumble://?api_key=your-api-key' \ | CODE |
| HIGH | docs/supported-sources/dune.md | 34 | --source-uri 'dune://?api_key=your_api_key' \ | CODE |
| HIGH⚡ | docs/supported-sources/dune.md | 78 | --source-uri 'dune://?api_key=your_api_key' \ | CODE |
| HIGH⚡ | docs/supported-sources/dune.md | 88 | --source-uri 'dune://?api_key=your_api_key' \ | CODE |
| HIGH⚡ | docs/supported-sources/dune.md | 98 | --source-uri 'dune://?api_key=your_api_key' \ | CODE |
| HIGH⚡ | docs/supported-sources/dune.md | 108 | --source-uri 'dune://?api_key=your_api_key' \ | CODE |
| HIGH | docs/supported-sources/fireflies.md | 33 | --source-uri 'fireflies://?api_key=your-api-key-here' \ | CODE |
| HIGH | docs/supported-sources/fireflies.md | 47 | --source-uri 'fireflies://?api_key=your-api-key-here' \ | CODE |
| HIGH | docs/supported-sources/fireflies.md | 76 | --source-uri 'fireflies://?api_key=your-api-key-here' \ | CODE |
| HIGH | docs/supported-sources/primer.md | 12 | primer://?api_key=<your-api-key> | CODE |
| HIGH | docs/supported-sources/mailchimp.md | 34 | ingestr ingest --source-uri 'mailchimp://?api_key=your_api_key&server=us10' --source-table 'campaigns' --dest-uri duckdb | CODE |
| HIGH | docs/supported-sources/mailchimp.md | 82 | --source-uri 'mailchimp://?api_key=your_api_key&server=us10' \ | CODE |
| HIGH | docs/supported-sources/customerio.md | 34 | --source-uri 'customerio://?api_key=your_api_key®ion=us' \ | CODE |
| HIGH | docs/supported-sources/customerio.md | 91 | --source-uri 'customerio://?api_key=your_api_key®ion=us' \ | CODE |
| HIGH | docs/supported-sources/customerio.md | 98 | --source-uri 'customerio://?api_key=your_api_key®ion=us' \ | CODE |
| HIGH | docs/supported-sources/customerio.md | 109 | --source-uri 'customerio://?api_key=your_api_key®ion=us' \ | CODE |
| HIGH | docs/supported-sources/customerio.md | 116 | --source-uri 'customerio://?api_key=your_api_key®ion=us' \ | CODE |
| HIGH | docs/supported-sources/customerio.md | 128 | --source-uri 'customerio://?api_key=your_api_key®ion=us' \ | CODE |
| HIGH | docs/supported-sources/granola.md | 19 | --source-uri 'granola://?api_key=your-api-key' \ | CODE |
| HIGH | docs/supported-sources/granola.md | 38 | --source-uri 'granola://?api_key=your-api-key' \ | CODE |
| HIGH | docs/supported-sources/plusvibeai.md | 34 | ingestr ingest --source-uri 'plusvibeai://?api_key=your_api_key&workspace_id=your_workspace_id' --source-table 'campaign | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | docs/tutorials/load-stripe-postgres.md | 30 | ## Step 1: Install `ingestr` | COMMENT |
| LOW | docs/tutorials/load-stripe-postgres.md | 37 | ## Step 2: Retrieve Stripe API Credentials | COMMENT |
| LOW | docs/tutorials/load-stripe-postgres.md | 48 | ## Step 3: Retrieve PostgreSQL Credentials | COMMENT |
| LOW | docs/tutorials/load-stripe-postgres.md | 58 | ## Step 4: Run the `ingestr` Command | COMMENT |
| LOW | docs/tutorials/load-stripe-postgres.md | 73 | ## Step 5: Verify Data in PostgreSQL via DBeaver | COMMENT |
| LOW | docs/tutorials/load-personio-duckdb.md | 30 | ### Step 1: Install `ingestr` | COMMENT |
| LOW | docs/tutorials/load-personio-duckdb.md | 33 | ### Step 2: Get Personio Credentials | COMMENT |
| LOW | docs/tutorials/load-personio-duckdb.md | 44 | ### Step 3: Install DuckDB | COMMENT |
| LOW | docs/tutorials/load-personio-duckdb.md | 51 | ### Step 4: Run the `ingestr` Command | COMMENT |
| LOW⚡ | docs/tutorials/load-personio-duckdb.md | 69 | ### Step 1: Open DuckDB | COMMENT |
| LOW⚡ | docs/tutorials/load-personio-duckdb.md | 75 | ### Step 2: List Available Tables | COMMENT |
| LOW⚡ | docs/tutorials/load-personio-duckdb.md | 81 | ### Step 3: View Data in the `employees` Table | COMMENT |
| LOW⚡ | docs/tutorials/load-personio-duckdb.md | 87 | ### Step 4: Validate Data | COMMENT |
| LOW | docs/tutorials/load-kinesis-bigquery.md | 34 | ### Step 1: Install ingestr | COMMENT |
| LOW | docs/tutorials/load-kinesis-bigquery.md | 38 | ### Step 2: Get AWS Credentials | COMMENT |
| LOW | docs/tutorials/load-kinesis-bigquery.md | 49 | ### Step 3: Configure Kinesis as Source | COMMENT |
| LOW | docs/tutorials/load-kinesis-bigquery.md | 70 | ### Step 4: Configure BigQuery as Destination | COMMENT |
| LOW | docs/tutorials/load-kinesis-bigquery.md | 91 | ### Step 5: Run the ingestr Command | COMMENT |
| LOW | docs/tutorials/load-kinesis-bigquery.md | 103 | ### Step 6: Verify Data in BigQuery | COMMENT |
| LOW⚡ | docs/supported-sources/snowflake.md | 41 | #### Step 1: Generate a key pair | COMMENT |
| LOW⚡ | docs/supported-sources/snowflake.md | 50 | #### Step 2: Set public key for Snowflake user | COMMENT |
| LOW⚡ | docs/supported-sources/snowflake.md | 59 | #### Step 3: Verify | COMMENT |
| LOW⚡ | docs/supported-sources/snowflake.md | 67 | #### Step 4: Use the private key in the URI | COMMENT |
| LOW⚡ | docs/supported-sources/google_search_console.md | 37 | ### Step 1: Create a Google Cloud Project | COMMENT |
| LOW⚡ | docs/supported-sources/google_search_console.md | 42 | ### Step 2: Enable the Search Console API | COMMENT |
| LOW⚡ | docs/supported-sources/google_search_console.md | 48 | ### Step 3: Create a Service Account | COMMENT |
| LOW⚡ | docs/supported-sources/google_search_console.md | 55 | ### Step 4: Generate a JSON Key | COMMENT |
| LOW⚡ | docs/supported-sources/google_search_console.md | 62 | ### Step 5: Grant Access in Search Console | COMMENT |
| LOW⚡ | docs/supported-sources/slack.md | 25 | ### Step 1: Create a Slack App | COMMENT |
| LOW⚡ | docs/supported-sources/slack.md | 33 | ### Step 2: Choose a Token Type | COMMENT |
| LOW⚡ | docs/supported-sources/slack.md | 40 | ### Step 3: Configure OAuth Scopes | COMMENT |
| LOW⚡ | docs/supported-sources/slack.md | 50 | ### Step 4: Install the App and Get the Token | COMMENT |
| LOW⚡ | docs/supported-sources/google_analytics.md | 33 | ### Step 1: Create a Google Cloud Project | COMMENT |
| LOW⚡ | docs/supported-sources/google_analytics.md | 39 | ### Step 2: Enable the Google Analytics Data API | COMMENT |
| LOW⚡ | docs/supported-sources/google_analytics.md | 45 | ### Step 3: Create a Service Account | COMMENT |
| LOW⚡ | docs/supported-sources/google_analytics.md | 52 | ### Step 4: Generate a JSON Key | COMMENT |
| LOW⚡ | docs/supported-sources/google_analytics.md | 60 | ### Step 5: Grant Access in Google Analytics | COMMENT |
| LOW | docs/supported-sources/intercom.md | 26 | ### Step 1: Create a Private App | COMMENT |
| LOW | docs/supported-sources/intercom.md | 35 | ### Step 2: Configure Permissions | COMMENT |
| LOW | docs/supported-sources/intercom.md | 46 | ### Step 3: Get the Access Token | COMMENT |
| LOW | docs/supported-sources/github.md | 26 | ### Step 1: Create a Personal Access Token | COMMENT |
| LOW⚡ | docs/supported-sources/notion.md | 22 | ### Step 1: Create an Integration | COMMENT |
| LOW⚡ | docs/supported-sources/notion.md | 31 | ### Step 2: Get the API Key | COMMENT |
| LOW⚡ | docs/supported-sources/notion.md | 37 | ### Step 3: Share Your Database with the Integration | COMMENT |
| LOW⚡ | docs/supported-sources/notion.md | 45 | ### Step 4: Get Your Database ID | COMMENT |
| LOW | docs/supported-sources/personio.md | 25 | ### Step 1: Access API Settings | COMMENT |
| LOW | docs/supported-sources/personio.md | 30 | ### Step 2: Create API Credentials | COMMENT |
| LOW | docs/supported-sources/personio.md | 42 | ### Step 3: Copy Credentials | COMMENT |
| LOW⚡ | docs/supported-sources/gsheets.md | 38 | ### Step 1: Create a Google Cloud Project | COMMENT |
| LOW⚡ | docs/supported-sources/gsheets.md | 44 | ### Step 2: Enable the Google Sheets API | COMMENT |
| LOW⚡ | docs/supported-sources/gsheets.md | 50 | ### Step 3: Create a Service Account | COMMENT |
| LOW⚡ | docs/supported-sources/gsheets.md | 57 | ### Step 4: Generate a JSON Key | COMMENT |
| LOW⚡ | docs/supported-sources/gsheets.md | 65 | ### Step 5: Share Your Spreadsheet | COMMENT |
| LOW⚡ | docs/supported-sources/stripe.md | 25 | ### Step 1: Access Your API Keys | COMMENT |
| LOW⚡ | docs/supported-sources/stripe.md | 31 | ### Step 2: Choose Your API Key | COMMENT |
| LOW⚡ | docs/supported-sources/stripe.md | 39 | ### Step 3: Copy or Create a Restricted Key | COMMENT |
| LOW | docs/supported-sources/s3.md | 43 | ### Step 1: Create an IAM User (if needed) | COMMENT |
| LOW | docs/supported-sources/s3.md | 51 | ### Step 2: Assign S3 Permissions | COMMENT |
| LOW | docs/supported-sources/s3.md | 77 | ### Step 3: Get Access Keys | COMMENT |
| LOW⚡ | docs/supported-sources/athena.md | 36 | ### Step 1: Create an S3 Bucket for Results | COMMENT |
| 68 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | pkg/source/facebook_ads/facebook_ads.go | 784 | // Step 1: find lead gen campaigns (OUTCOME_LEADS or LEAD_GENERATION objective) | COMMENT |
| LOW | pkg/source/facebook_ads/facebook_ads.go | 797 | // Step 2: list ads from those campaigns only | COMMENT |
| LOW | pkg/source/facebook_ads/facebook_ads.go | 810 | // Step 3: fetch leads for those ads | COMMENT |
| LOW | pkg/source/jira/jira.go | 861 | // Step 1: fetch issue keys per project in parallel. | COMMENT |
| LOW | pkg/source/jira/jira.go | 899 | // Step 2: bulk-fetch changelogs in parallel batches. | COMMENT |
| LOW⚡ | pkg/source/clevertap/clevertap_test.go | 535 | // Step 1: open the cursor. | COMMENT |
| LOW⚡ | pkg/source/clevertap/clevertap_test.go | 542 | // Step 2: one page of records within the interval, then terminate | COMMENT |
| LOW | pkg/destination/clickhouse/clickhouse.go | 421 | // Step 1: Close changed records (update _scd_valid_to and _scd_is_current) | COMMENT |
| LOW | pkg/destination/clickhouse/clickhouse.go | 459 | // Step 2: Soft-delete missing records (only if no incremental_key) | COMMENT |
| LOW | pkg/destination/clickhouse/clickhouse.go | 487 | // Step 3: Insert new versions + net-new records | COMMENT |
| LOW | pkg/destination/trino/trino.go | 445 | // Step 1: Close changed records (update _scd_valid_to and _scd_is_current) | COMMENT |
| LOW | pkg/destination/trino/trino.go | 469 | // Step 2: Soft-delete missing records (only if no incremental_key) | COMMENT |
| LOW | pkg/destination/trino/trino.go | 493 | // Step 3: Insert new versions + net-new records | COMMENT |
| LOW | pkg/destination/onelake/transform.go | 293 | // Step 3: insert staging rows whose PK is not currently active in the target. | COMMENT |
| LOW | pkg/destination/bigquery/bigquery.go | 2345 | // Step 1: Close changed records (update _scd_valid_to and _scd_is_current) | COMMENT |
| LOW | pkg/destination/bigquery/bigquery.go | 2365 | // Step 2: Soft-delete missing records (only if no incremental_key) | COMMENT |
| LOW | pkg/destination/bigquery/bigquery.go | 2395 | // Step 3: Insert new versions + net-new records | COMMENT |
| LOW | pkg/destination/snowflake/snowflake.go | 1159 | // Step 1: Close changed records (update _scd_valid_to and _scd_is_current) | COMMENT |
| LOW | pkg/destination/snowflake/snowflake.go | 1181 | // Step 2: Soft-delete missing records (only if no incremental_key) | COMMENT |
| LOW | pkg/destination/snowflake/snowflake.go | 1202 | // Step 3: Insert new versions + net-new records | COMMENT |
| LOW | pkg/destination/sqlite/sqlite.go | 760 | // Step 1: Close changed records (update _scd_valid_to and _scd_is_current) | COMMENT |
| LOW | pkg/destination/sqlite/sqlite.go | 783 | // Step 2: Soft-delete missing records (only if no incremental_key) | COMMENT |
| LOW | pkg/destination/sqlite/sqlite.go | 805 | // Step 3: Insert new versions + net-new records | COMMENT |
| LOW | pkg/destination/cratedb/cratedb.go | 492 | // Step 1: Close changed records — only where data actually differs | COMMENT |
| LOW | pkg/destination/cratedb/cratedb.go | 521 | // Step 2: Soft-delete missing records (only if no incremental_key) | COMMENT |
| LOW | pkg/destination/cratedb/cratedb.go | 547 | // Step 3: Insert rows from staging that don't have a matching current row in target | COMMENT |
| LOW | pkg/destination/postgres/postgres.go | 1038 | // Step 1: Upsert latest non-deleted rows (data changes). | COMMENT |
| LOW | pkg/destination/postgres/postgres.go | 1100 | // Step 2: Mark deletes only when the latest change is a delete | COMMENT |
| LOW | pkg/destination/postgres/postgres.go | 1292 | // Step 1: Close changed records (update _scd_valid_to and _scd_is_current) | COMMENT |
| LOW | pkg/destination/postgres/postgres.go | 1314 | // Step 2: Soft-delete missing records (only if no incremental_key) | COMMENT |
| LOW | pkg/destination/postgres/postgres.go | 1335 | // Step 3: Insert new versions + net-new records | COMMENT |
| LOW | pkg/destination/mysql/mysql.go | 1495 | // Step 1: Close changed records (update _scd_valid_to and _scd_is_current) | COMMENT |
| LOW | pkg/destination/mysql/mysql.go | 1516 | // Step 2: Soft-delete missing records (only if no incremental_key) | COMMENT |
| LOW | pkg/destination/mysql/mysql.go | 1539 | // Step 3: Insert new versions + net-new records | COMMENT |
| LOW | pkg/destination/duckdb/duckdb.go | 1474 | // Step 1: Close changed records (update _scd_valid_to and _scd_is_current) | COMMENT |
| LOW | pkg/destination/duckdb/duckdb.go | 1495 | // Step 2: Soft-delete missing records (only if no incremental_key) | COMMENT |
| LOW | pkg/destination/duckdb/duckdb.go | 1515 | // Step 3: Insert new versions + net-new records | COMMENT |
| LOW | pkg/destination/fabric/fabric.go | 610 | // Step 1: Close changed records. | COMMENT |
| LOW | pkg/destination/fabric/fabric.go | 632 | // Step 2: Soft-delete missing records (only if no incremental_key). | COMMENT |
| LOW | pkg/destination/fabric/fabric.go | 654 | // Step 3: Insert new versions + net-new records. | COMMENT |
| LOW | pkg/destination/mssql/mssql.go | 1372 | // Step 1: Close changed records (update _scd_valid_to and _scd_is_current) | COMMENT |
| LOW | pkg/destination/mssql/mssql.go | 1394 | // Step 2: Soft-delete missing records (only if no incremental_key) | COMMENT |
| LOW | pkg/destination/mssql/mssql.go | 1416 | // Step 3: Insert new versions + net-new records | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | benchmarks/scripts/runner.py | 53 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | benchmarks/scripts/runner.py | 55 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | benchmarks/scripts/runner.py | 310 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | benchmarks/scripts/runner.py | 312 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | benchmarks/scripts/runner.py | 354 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | benchmarks/scripts/runner.py | 356 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | benchmarks/scripts/runner.py | 423 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | benchmarks/scripts/runner.py | 425 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | benchmarks/scripts/runner.py | 606 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | benchmarks/scripts/runner.py | 608 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | benchmarks/scripts/runner.py | 688 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | benchmarks/scripts/runner.py | 690 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | benchmarks/scripts/runner.py | 712 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | benchmarks/scripts/runner.py | 714 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | benchmarks/scripts/runner.py | 725 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | benchmarks/scripts/runner.py | 727 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | benchmarks/scripts/runner.py | 817 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | benchmarks/scripts/runner.py | 819 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | benchmarks/scripts/runner.py | 1283 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | benchmarks/scripts/runner.py | 1285 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | benchmarks/scripts/runner.py | 1406 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | benchmarks/scripts/runner.py | 1408 | # --------------------------------------------------------------------------- | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/integration/streaming_cdc_idle_test.go | 21 | // stall against a live Postgres. | COMMENT |
| LOW | …ration/postgres_cdc_starrocks_hard_delete_soak_test.go | 1 | //go:build stress | COMMENT |
| LOW | tests/integration/postgres_cdc_starrocks_stress_test.go | 1 | //go:build stress | COMMENT |
| LOW | tests/integration/bigquery_dedup_test.go | 21 | // These tests validate BigQuery's swap, merge, and delete-insert dedup behavior | COMMENT |
| LOW | tests/integration/mysql_cdc_starrocks_stress_test.go | 1 | //go:build stress | COMMENT |
| LOW | tests/integration/postgres_cdc_stress_test.go | 1 | //go:build stress | COMMENT |
| LOW | …ration/postgres_cdc_starrocks_scenarios_stress_test.go | 1 | //go:build stress | COMMENT |
| LOW | tests/integration/mssql_cdc_stress_test.go | 1 | //go:build stress | COMMENT |
| LOW | tests/integration/staging_inspect_test.go | 21 | ) | COMMENT |
| LOW | tests/integration/mysql_cdc_stress_test.go | 1 | //go:build stress | COMMENT |
| LOW | tests/integration/restricted_permissions_test.go | 21 | // target schema but lacks `CREATE DATABASE`/`CREATE SCHEMA` privileges. The | COMMENT |
| LOW | internal/output/output.go | 1 | // Package output centralizes all user-facing process output for the ingestr CLI. | COMMENT |
| LOW | internal/annotation/annotation.go | 1 | // Package annotation builds the query annotations ingestr attaches to the SQL | COMMENT |
| LOW | benchmarks/scripts/bench_dlt.py | 1 | # /// script | COMMENT |
| LOW | pkg/source/source.go | 161 | // CDCSnapshotResumed marks a replacement marker that continues a snapshot | COMMENT |
| LOW | pkg/source/source.go | 181 | // kind/table prefix that is not a valid source cursor. | COMMENT |
| LOW | pkg/source/source.go | 421 | COMMENT | |
| LOW | pkg/source/fakturoid/fakturoid.go | 1 | // Package fakturoid implements an ingestr source for the Fakturoid API v3 — | COMMENT |
| LOW | pkg/source/satismeter/satismeter.go | 1 | // Package satismeter implements an ingestr source for the SatisMeter REST API | COMMENT |
| LOW | pkg/source/mssql_cdc/source.go | 1181 | } | COMMENT |
| LOW | pkg/source/sharepoint/sharepoint_integration_test.go | 21 | // the source's structural contract: metadata columns, raw all-VARCHAR data, | COMMENT |
| LOW | pkg/source/sharepoint/excel.go | 21 | // unzipXMLInMemLimit is the per-part threshold above which excelize spills a | COMMENT |
| LOW | pkg/source/postgres_cdc/values.go | 141 | // so the emitted stream stays applicable at the destination. It runs after | COMMENT |
| LOW | pkg/source/postgres_cdc/relation.go | 181 | // pgoutput resends a Relation message whenever a table's shape changes, so | COMMENT |
| LOW | pkg/source/postgres_cdc/commit_state.go | 21 | // silenceProbeAfter is how long the server may stay silent before the next | COMMENT |
| LOW | pkg/source/postgres_cdc/commit_state.go | 141 | if !pending { | COMMENT |
| LOW | pkg/source/postgres_cdc/multitable_reader.go | 241 | } | COMMENT |
| LOW | pkg/source/postgres_cdc/multitable_reader.go | 381 | historicalRelIDs map[string][]uint32 | COMMENT |
| LOW | pkg/source/postgres_cdc/multitable_reader.go | 881 | } | COMMENT |
| LOW | pkg/source/postgres_cdc/source.go | 61 | uri string | COMMENT |
| LOW | pkg/source/postgres_cdc/source.go | 81 | // standbyGapWarned is the last list of tables reported as missing from the | COMMENT |
| LOW | pkg/source/postgres_cdc/source.go | 681 | } | COMMENT |
| LOW | pkg/source/twocheckout/twocheckout.go | 1 | // Package twocheckout implements an ingestr source for the 2Checkout (Verifone) | COMMENT |
| LOW | pkg/source/twocheckout/twocheckout.go | 61 | // fixGross: apply the cumulative-gross correction (orders only). | COMMENT |
| LOW | pkg/source/twocheckout/twocheckout.go | 81 | // Declared columns are ADDITIVE — arrowconv seeds the field list from them and | COMMENT |
| LOW | pkg/source/twocheckout/twocheckout.go | 101 | // | COMMENT |
| LOW | pkg/source/twocheckout/twocheckout.go | 121 | // 20k results, so an unfiltered pull of a large account is impossible rather | COMMENT |
| LOW | pkg/source/twocheckout/twocheckout.go | 341 | // | COMMENT |
| LOW | pkg/source/adbc/dialect.go | 41 | // SchemaQuery returns the SQL query for fetching table column information. | COMMENT |
| LOW | pkg/source/adbc/dialect.go | 141 | EnforcesPrimaryKeys() bool | COMMENT |
| LOW | pkg/destination/destination.go | 61 | CommitToken source.DurableID | COMMENT |
| LOW | pkg/destination/destination.go | 641 | SupportsDirectReplaceDeduplication() bool | COMMENT |
| LOW | pkg/destination/onelake/delta_io.go | 81 | version int64 | COMMENT |
| LOW | pkg/destination/snowflake/snowflake_test.go | 1381 | // through the same *SnowflakeDestination/*sql.DB, with combined worker | COMMENT |
| LOW | pkg/destination/hubspot/hubspot_test.go | 1401 | }{ | COMMENT |
| LOW | pkg/destination/hubspot/hubspot_test.go | 1421 | {10, "product catalog", "products?id_property=sku", "merge", []string{"sku"}, want{idProperty: "sku"}}, | COMMENT |
| LOW | pkg/destination/hubspot/hubspot.go | 161 | // archive soft-deletes the records (or association links) instead of writing. | COMMENT |
| LOW | pkg/destination/hubspot/hubspot.go | 1761 | COMMENT | |
| LOW | pkg/destination/salesforce/salesforce.go | 141 | COMMENT | |
| LOW | pkg/destination/salesforce/salesforce.go | 161 | idColumn string | COMMENT |
| LOW | pkg/destination/salesforce/salesforce.go | 181 | sawSource atomic.Bool | COMMENT |
| LOW | pkg/destination/starrocks/mysql_cdc.go | 21 | COMMENT | |
| LOW | pkg/schemaevolution/evolve.go | 1 | package schemaevolution | COMMENT |
| LOW | pkg/naming/snake_case.go | 21 | camelCaseRegex2 = regexp.MustCompile(`([a-z\d])([A-Z])`) | COMMENT |
| LOW | pkg/strategy/merge.go | 121 | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | ingestr/_data.py | 164 | def _prepare_stream_process_options(self) -> None: | CODE |
| LOW | ingestr/_data.py | 655 | def _looks_like_pandas_dataframe(value: Any) -> bool: | CODE |
| LOW | ingestr/_data.py | 659 | def _looks_like_dataframe_or_arrow(value: Any) -> bool: | CODE |
| LOW | ingestr/_data.py | 700 | def _reject_managed_process_input(process_options: Mapping[str, Any]) -> None: | CODE |
| LOW | ingestr/_runner.py | 614 | def _format_query_annotations(value: Any) -> Any: | CODE |
| LOW | tests/test_install.py | 152 | def test_verification_before_extraction_in_both_output_paths(self): | STRING |
| LOW⚡ | tests/test_install.py | 173 | def test_system_hash_fallbacks_and_wget(self): | STRING |
| LOW⚡ | tests/test_install.py | 180 | def test_other_supported_architectures(self): | STRING |
| LOW⚡ | tests/test_install.py | 185 | def test_cancellation_waits_for_destination_write(self): | STRING |
| LOW⚡ | tests/python/test_ingestr_package.py | 182 | def test_run_rejects_shell_command_string(self): | CODE |
| LOW⚡ | tests/python/test_ingestr_package.py | 186 | def test_binary_path_uses_explicit_override(self): | CODE |
| LOW⚡ | tests/python/test_ingestr_package.py | 194 | def test_binary_path_uses_local_build(self): | CODE |
| LOW⚡ | tests/python/test_ingestr_package.py | 203 | def test_binary_path_downloads_release_binary(self): | CODE |
| LOW⚡ | tests/python/test_ingestr_package.py | 376 | def test_release_platform_rejects_unsupported_arch(self): | CODE |
| LOW⚡ | tests/python/test_ingestr_package.py | 382 | def test_release_platform_rejects_musl_linux(self): | CODE |
| LOW⚡ | tests/python/test_ingestr_package.py | 390 | def test_ingest_streams_records_to_stdin(self): | CODE |
| LOW | tests/python/test_ingestr_package.py | 53 | def test_build_ingest_args_maps_python_values_to_cli_flags(self): | CODE |
| LOW | tests/python/test_ingestr_package.py | 128 | def test_run_invokes_resolved_binary(self): | CODE |
| LOW | tests/python/test_ingestr_package.py | 143 | def test_run_cli_runs_generated_args(self): | CODE |
| LOW | tests/python/test_ingestr_package.py | 238 | def test_binary_path_reports_first_download_to_stderr(self): | CODE |
| LOW | tests/python/test_ingestr_package.py | 269 | def test_binary_path_uses_tag_specific_checksum_for_tag_override(self): | CODE |
| LOW | tests/python/test_ingestr_package.py | 307 | def test_binary_path_rejects_missing_tag_checksum(self): | CODE |
| LOW | tests/python/test_ingestr_package.py | 337 | def test_binary_path_rejects_checksum_mismatch(self): | CODE |
| LOW | tests/python/test_ingestr_package.py | 362 | def test_release_platform_uses_goreleaser_asset_names(self): | CODE |
| LOW | tests/python/test_ingestr_package.py | 419 | def test_ingest_stream_capture_output_collects_child_pipes(self): | CODE |
| LOW | tests/python/test_ingestr_package.py | 440 | def test_ingest_flattens_pages_into_arrow_stream(self): | CODE |
| LOW | tests/python/test_ingestr_package.py | 464 | def test_ingest_accepts_generator_function(self): | CODE |
| LOW | tests/python/test_ingestr_package.py | 488 | def test_ingest_rejects_async_generator_function(self): | CODE |
| LOW | tests/python/test_ingestr_package.py | 500 | def test_ingest_context_manager_streams_yielded_data(self): | CODE |
| LOW | tests/python/test_ingestr_package.py | 527 | def test_ingest_streams_arrow_table(self): | CODE |
| LOW | tests/python/test_ingestr_package.py | 549 | def test_stream_transport_skips_empty_record_batches(self): | CODE |
| LOW | tests/python/test_ingestr_package.py | 576 | def test_ingest_can_use_mmap_transport(self): | CODE |
| LOW | tests/python/test_ingestr_package.py | 603 | def test_mmap_transport_skips_empty_record_batches(self): | CODE |
| LOW | tests/python/test_ingestr_package.py | 633 | def test_mmap_transport_rejects_managed_process_input(self): | CODE |
| LOW | tests/python/test_ingestr_package.py | 652 | def test_context_manager_preserves_result_when_stream_close_fails(self): | CODE |
| LOW | tests/python/test_ingestr_package.py | 672 | def test_ingest_normalizes_common_python_row_values(self): | CODE |
| LOW | tests/python/test_ingestr_package.py | 697 | def test_stream_transport_rejects_text_mode(self): | CODE |
| LOW | benchmarks/scripts/runner.py | 117 | def clickhouse_connection_from_uri(uri: str) -> dict: | CODE |
| LOW | benchmarks/scripts/runner.py | 131 | def quote_clickhouse_identifier(name: str) -> str: | CODE |
| LOW | benchmarks/scripts/runner.py | 180 | def snowflake_connection_from_uri(uri: str) -> dict: | CODE |
| LOW | benchmarks/scripts/runner.py | 215 | def quote_snowflake_identifier(name: str) -> str: | CODE |
| LOW | benchmarks/scripts/bench_dlt.py | 58 | def patch_dlt_mssql_json_type(): | CODE |
| LOW | benchmarks/scripts/bench_dlt.py | 71 | def clickhouse_credentials_from_uri(uri: str) -> dict: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | ingestr/_data.py | 286 | except Exception: | CODE |
| HIGH | ingestr/_data.py | 307 | except FileNotFoundError: | CODE |
| HIGH | ingestr/_data.py | 716 | except FileNotFoundError: | CODE |
| HIGH | ingestr/_data.py | 766 | except Exception: | CODE |
| HIGH | ingestr/_runner.py | 360 | except (OSError, ValueError): | CODE |
| HIGH | benchmarks/scripts/bench_airbyte.py | 142 | except Exception: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH⚡ | ingestr/_data.py | 538 | if schema is not None and not data.schema.equals(schema): | CODE |
| HIGH⚡ | ingestr/_data.py | 544 | if schema is not None and not table.schema.equals(schema): | CODE |
| HIGH⚡ | ingestr/_data.py | 554 | if schema is not None and not table.schema.equals(schema): | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | docs/supported-sources/asana.md | 28 | Let's say you have a workspace with id `workspace-1337` and you want to ingest all tasks into a duckdb database called ` | CODE |
| LOW | docs/supported-sources/asana.md | 33 | --source-uri "asana://workspace-1337?access_token=fake_token" \ | CODE |
| LOW | docs/supported-sources/monday.md | 25 | Let's say you want to ingest all boards into a DuckDB database called `monday.db`. For this example the value of `api_to | CODE |
| LOW | docs/supported-sources/monday.md | 30 | --source-uri "monday://?api_token=fake_token" \ | CODE |
| LOW | pkg/transformer/column_renamer_test.go | 229 | {stringPtr("placeholder"), stringPtr("placeholder"), stringPtr("placeholder"), stringPtr("placeholder")}, | CODE |
| LOW | pkg/transformer/column_renamer_test.go | 260 | [][]*string{{stringPtr("placeholder")}, {stringPtr(`["` + sourceName + `"]`)}}, | CODE |
| LOW | pkg/transformer/column_renamer_test.go | 276 | {stringPtr("placeholder"), stringPtr("placeholder")}, | CODE |
| LOW | pkg/transformer/column_renamer_test.go | 277 | {stringPtr("placeholder"), stringPtr("changed")}, | CODE |
| LOW | pkg/transformer/column_renamer_test.go | 295 | [][]*string{{stringPtr("placeholder")}, {stringPtr(`{"configData":true}`)}}, | CODE |
| LOW | pkg/source/freshdesk/freshdesk_integration_test.go | 183 | "name": "Acme Inc", | CODE |
| LOW | pkg/source/balldontlie/balldontlie_test.go | 76 | _, _ = fmt.Fprint(w, `{"data":[{"id":11,"match_number":11,"datetime":"2026-06-14T21:00:00Z","status":"scheduled","seas | CODE |
| LOW | pkg/source/jobtread/jobtread_test.go | 151 | {"id": "1", "name": "Acme Corp"}, | CODE |
| LOW | pkg/source/jira/jira_test.go | 28 | email: "user@example.com", | CODE |
| LOW | pkg/source/jira/jira_test.go | 37 | email: "user@example.com", | CODE |
| LOW | pkg/source/zendesk/zendesk_test.go | 40 | email: "user@example.com", | CODE |
| LOW | pkg/source/salesforce/salesforce_integration_test.go | 188 | "phone": "555-0103", | CODE |
| LOW | pkg/source/salesforce/salesforce_integration_test.go | 212 | "phone": "555-0102", | CODE |
| LOW | pkg/source/salesforce/salesforce_integration_test.go | 234 | "name": "John Doe", | CODE |
| LOW | pkg/source/salesforce/salesforce_integration_test.go | 260 | "phone": "555-0105", | CODE |
| LOW | pkg/destination/hubspot/hubspot_test.go | 90 | _, _ = io.WriteString(w, `{"status":"COMPLETE","results":[{"id":"1","properties":{"email":"foo@bar.com"}}]}`) | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | ingestr/_data.py | 286 | except Exception: | CODE |
| LOW | ingestr/_data.py | 614 | except Exception: | CODE |
| LOW | ingestr/_data.py | 626 | except Exception: | CODE |
| LOW | ingestr/_data.py | 631 | except Exception: | CODE |
| LOW | ingestr/_data.py | 766 | except Exception: | CODE |
| MEDIUM | ingestr/_data.py | 282 | def _abort(self) -> None: | CODE |
| LOW | ingestr/_runner.py | 327 | except Exception as exc: | CODE |
| LOW | tests/cdc_multitable/validate.py | 276 | except Exception as e: | CODE |
| LOW | tests/cdc_multitable/validate.py | 360 | except Exception as e: | CODE |
| MEDIUM | tests/cdc_multitable/validate.py | 361 | print(f"Error: {e}") | CODE |
| LOW | benchmarks/scripts/runner.py | 1109 | except Exception: | CODE |
| LOW | benchmarks/scripts/bench_airbyte.py | 142 | except Exception: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | ingestr/_data.py | 1 | CODE | |
| LOW | ingestr/__init__.py | 1 | CODE | |
| LOW | ingestr/__init__.py | 1 | CODE | |
| LOW | ingestr/__init__.py | 2 | CODE | |
| LOW | ingestr/__init__.py | 2 | CODE | |
| LOW | ingestr/__init__.py | 2 | CODE | |
| LOW | ingestr/__init__.py | 2 | CODE | |
| LOW | ingestr/__init__.py | 2 | CODE | |
| LOW | ingestr/_runner.py | 1 | CODE | |
| LOW | tests/cdc_multitable/validate.py | 9 | CODE | |
| LOW | tests/cdc_multitable/validate.py | 10 | CODE | |
| LOW | benchmarks/scripts/bench_airbyte.py | 13 | CODE | |
| LOW | benchmarks/scripts/bench_airbyte.py | 39 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | ingestr/_data.py | 490 | CODE | |
| LOW | ingestr/_data.py | 577 | CODE | |
| LOW | tests/test_install.py | 22 | CODE | |
| LOW | tests/python/test_ingestr_package.py | 203 | CODE | |
| LOW | tests/python/test_ingestr_package.py | 238 | CODE | |
| LOW | tests/python/test_ingestr_package.py | 269 | CODE | |
| LOW | tests/python/test_ingestr_package.py | 307 | CODE | |
| LOW | tests/python/test_ingestr_package.py | 337 | CODE | |
| LOW | tests/python/test_ingestr_package.py | 382 | CODE | |
| LOW | tests/python/test_ingestr_package.py | 500 | CODE | |
| LOW | tests/python/test_ingestr_package.py | 652 | CODE | |
| LOW | tests/cdc_multitable/validate.py | 157 | CODE | |
| LOW | tests/cdc_multitable/validate.py | 233 | CODE | |
| LOW | benchmarks/scripts/runner.py | 821 | CODE | |
| LOW | benchmarks/scripts/runner.py | 1171 | CODE | |
| LOW | benchmarks/scripts/bench_dlt.py | 130 | CODE | |
| LOW | benchmarks/scripts/seed_kafka.py | 15 | CODE | |
| LOW | benchmarks/scripts/bench_airbyte.py | 233 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | benchmarks/scripts/seed_mongodb_bson.js | 88 | print("seeded " + collection.countDocuments() + " BSON documents into " + databaseName + "." + collectionName); | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | benchmarks/scripts/validate.sh | 6 | # Usage: | COMMENT |
| LOW | benchmarks/scripts/report.sh | 6 | # Usage: | COMMENT |
| LOW | benchmarks/scripts/run.sh | 7 | # Usage: | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | ingestr/_runner.py | 83 | CODE | |
| LOW | ingestr/_runner.py | 170 | CODE | |
| LOW | tests/test_install.py | 22 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/cdc_multitable/validate.py | 87 | # Check if _cdc_deleted column exists | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | ingestr/__init__.py | 16 | __all__ = [ | CODE |