{
  "_id": "6a1a1e351d7bb097a09ce986",
  "Package": "joinspy",
  "Title": "Diagnostic Tools for Data Frame Joins",
  "Version": "0.8.0",
  "Authors@R": "person(\"Gilles\", \"Colling\", email = \"gilles.colling051@gmail.com\",\nrole = c(\"aut\", \"cre\", \"cph\"),\ncomment = c(ORCID = \"0000-0003-3070-6066\"))",
  "Language": "en-US",
  "Description": "Provides diagnostic tools for understanding and debugging\ndata frame joins. Analyzes key columns before joining to detect\nduplicates, mismatches, encoding issues, and other common\nproblems. Explains unexpected row count changes and provides\nsafe join wrappers with cardinality enforcement. Concepts and\ndiagnostics build on tidy data principles as described in\n'Wickham' (2014) <doi:10.18637/jss.v059.i10>.",
  "License": "MIT + file LICENSE",
  "Encoding": "UTF-8",
  "Roxygen": "list(markdown = TRUE)",
  "RoxygenNote": "7.3.3",
  "VignetteBuilder": "knitr",
  "Config/testthat/edition": "3",
  "URL": "https://gillescolling.com/joinspy/,\nhttps://github.com/gcol33/joinspy",
  "BugReports": "https://github.com/gcol33/joinspy/issues",
  "Repository": "https://gcol33.r-universe.dev",
  "Date/Publication": "2026-05-29 11:16:32 UTC",
  "RemoteUrl": "https://github.com/gcol33/joinspy",
  "RemoteRef": "HEAD",
  "RemoteSha": "bc3863eae61acb36021c9689a50c866dca037fb5",
  "NeedsCompilation": "no",
  "Packaged": {
    "Date": "2026-05-29 23:13:05 UTC",
    "User": "root"
  },
  "Author": "Gilles Colling [aut, cre, cph] (ORCID:\n<https://orcid.org/0000-0003-3070-6066>)",
  "Maintainer": "Gilles Colling <gilles.colling051@gmail.com>",
  "MD5sum": "5e45675fd112c16a9ddcc760407a09c2",
  "_user": "gcol33",
  "_type": "src",
  "_file": "joinspy_0.8.0.tar.gz",
  "_fileid": "3d49b4e8232eb1f04721afcf0c59eb7f1b0494aa309e11d22bcd89737b648b9b",
  "_filesize": 280044,
  "_sha256": "3d49b4e8232eb1f04721afcf0c59eb7f1b0494aa309e11d22bcd89737b648b9b",
  "_created": "2026-05-29T23:13:05.000Z",
  "_published": "2026-05-29T23:16:05.468Z",
  "_distro": "noble",
  "_jobs": [
    {
      "job": 78602231743,
      "time": 142,
      "config": "linux-devel-x86_64",
      "r": "4.7.0",
      "check": "OK",
      "artifact": "7302920984"
    },
    {
      "job": 78602231747,
      "time": 134,
      "config": "linux-release-x86_64",
      "r": "4.6.0",
      "check": "OK",
      "artifact": "7302919555"
    },
    {
      "job": 78602231754,
      "time": 103,
      "config": "macos-oldrel-arm64",
      "r": "4.5.3",
      "check": "OK",
      "artifact": "7302913472"
    },
    {
      "job": 78602231734,
      "time": 99,
      "config": "macos-release-arm64",
      "r": "4.6.0",
      "check": "OK",
      "artifact": "7302912943"
    },
    {
      "job": 78601906258,
      "time": 203,
      "config": "source",
      "r": "4.6.0",
      "check": "OK",
      "artifact": "7302893825"
    },
    {
      "job": 78602231715,
      "time": 104,
      "config": "wasm-release",
      "r": "4.6.0",
      "check": "OK",
      "artifact": "7302913759"
    },
    {
      "job": 78602231716,
      "time": 97,
      "config": "windows-devel",
      "r": "4.7.0",
      "check": "OK",
      "artifact": "7302912532"
    },
    {
      "job": 78602231731,
      "time": 95,
      "config": "windows-oldrel",
      "r": "4.5.3",
      "check": "OK",
      "artifact": "7302912061"
    },
    {
      "job": 78602231724,
      "time": 122,
      "config": "windows-release",
      "r": "4.6.0",
      "check": "OK",
      "artifact": "7302917236"
    }
  ],
  "_buildurl": "https://github.com/r-universe/gcol33/actions/runs/26666821396",
  "_status": "success",
  "_host": "GitHub-Actions",
  "_upstream": "https://github.com/gcol33/joinspy",
  "_commit": {
    "id": "bc3863eae61acb36021c9689a50c866dca037fb5",
    "author": "Gilles Colling <gilles.colling051@gmail.com>",
    "committer": "Gilles Colling <gilles.colling051@gmail.com>",
    "message": "docs: rewrite README in readme-aura style with plain break line\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\n",
    "time": 1780053392
  },
  "_maintainer": {
    "name": "Gilles Colling",
    "email": "gilles.colling051@gmail.com",
    "login": "gcol33",
    "linkedin": "in/gilles-colling-0b3747306",
    "orcid": "0000-0003-3070-6066",
    "twitter": "@Gilles__Colling",
    "description": "Building tools for ecology in R, C++, and Rust.\nWhy did Microsoft have to buy it. Sadge :(",
    "uuid": 25009600
  },
  "_registered": true,
  "_dependencies": [
    {
      "package": "R",
      "version": ">= 4.1",
      "role": "Depends"
    },
    {
      "package": "cli",
      "role": "Imports"
    },
    {
      "package": "rlang",
      "role": "Imports"
    },
    {
      "package": "dplyr",
      "role": "Suggests"
    },
    {
      "package": "data.table",
      "role": "Suggests"
    },
    {
      "package": "tibble",
      "role": "Suggests"
    },
    {
      "package": "testthat",
      "version": ">= 3.0.0",
      "role": "Suggests"
    },
    {
      "package": "knitr",
      "role": "Suggests"
    },
    {
      "package": "rmarkdown",
      "role": "Suggests"
    },
    {
      "package": "shiny",
      "role": "Suggests"
    },
    {
      "package": "miniUI",
      "role": "Suggests"
    }
  ],
  "_owner": "gcol33",
  "_selfowned": true,
  "_usedby": 0,
  "_updates": [
    {
      "week": "2026-03",
      "n": 17
    },
    {
      "week": "2026-04",
      "n": 5
    },
    {
      "week": "2026-10",
      "n": 1
    },
    {
      "week": "2026-14",
      "n": 11
    },
    {
      "week": "2026-21",
      "n": 1
    },
    {
      "week": "2026-22",
      "n": 2
    }
  ],
  "_tags": [
    {
      "name": "v0.7.0",
      "date": "2026-01-14"
    },
    {
      "name": "v0.7.1",
      "date": "2026-01-14"
    },
    {
      "name": "v0.7.2",
      "date": "2026-01-14"
    },
    {
      "name": "v0.7.3",
      "date": "2026-01-19"
    },
    {
      "name": "v0.7.4",
      "date": "2026-01-19"
    },
    {
      "name": "v0.8.0",
      "date": "2026-03-31"
    }
  ],
  "_topics": [
    "data-wrangling",
    "diagnostics",
    "dyplr",
    "joins"
  ],
  "_stars": 3,
  "_contributors": [
    {
      "user": "gcol33",
      "count": 36,
      "uuid": 25009600
    }
  ],
  "_userbio": {
    "uuid": 25009600,
    "type": "user",
    "name": "Gilles Colling",
    "description": "Building tools for ecology in R, C++, and Rust.\nWhy did Microsoft have to buy it. Sadge :("
  },
  "_downloads": {
    "count": 145,
    "source": "https://cranlogs.r-pkg.org/downloads/total/last-month/joinspy"
  },
  "_devurl": "https://github.com/gcol33/joinspy",
  "_pkgdown": "https://gillescolling.com/joinspy/",
  "_searchresults": 9,
  "_rbuild": "4.6.0",
  "_assets": [
    "extra/citation.cff",
    "extra/citation.html",
    "extra/citation.json",
    "extra/citation.txt",
    "extra/contents.json",
    "extra/joinspy.html",
    "extra/NEWS.html",
    "extra/NEWS.txt",
    "extra/readme.html",
    "extra/readme.md",
    "manual.pdf"
  ],
  "_homeurl": "https://github.com/gcol33/joinspy",
  "_realowner": "gcol33",
  "_cranurl": true,
  "_releases": [
    {
      "version": "0.7.3",
      "date": "2026-01-23"
    },
    {
      "version": "0.8.0",
      "date": "2026-03-31"
    }
  ],
  "_exports": [
    "analyze_join_chain",
    "check_cartesian",
    "detect_cardinality",
    "full_join_spy",
    "get_log_file",
    "inner_join_spy",
    "is_join_report",
    "join_diff",
    "join_explain",
    "join_repair",
    "join_spy",
    "join_strict",
    "key_check",
    "key_duplicates",
    "last_report",
    "left_join_spy",
    "log_report",
    "right_join_spy",
    "set_log_file",
    "suggest_repairs"
  ],
  "_help": [
    {
      "page": "analyze_join_chain",
      "title": "Analyze Multi-Table Join Chain",
      "topics": [
        "analyze_join_chain"
      ]
    },
    {
      "page": "check_cartesian",
      "title": "Detect Potential Cartesian Product",
      "topics": [
        "check_cartesian"
      ]
    },
    {
      "page": "detect_cardinality",
      "title": "Detect Join Relationship Type",
      "topics": [
        "detect_cardinality"
      ]
    },
    {
      "page": "full_join_spy",
      "title": "Full Join with Diagnostics",
      "topics": [
        "full_join_spy"
      ]
    },
    {
      "page": "get_log_file",
      "title": "Get Current Log File",
      "topics": [
        "get_log_file"
      ]
    },
    {
      "page": "inner_join_spy",
      "title": "Inner Join with Diagnostics",
      "topics": [
        "inner_join_spy"
      ]
    },
    {
      "page": "is_join_report",
      "title": "Check if Object is a JoinReport",
      "topics": [
        "is_join_report"
      ]
    },
    {
      "page": "join_diff",
      "title": "Compare Data Frame Before and After Join",
      "topics": [
        "join_diff"
      ]
    },
    {
      "page": "join_explain",
      "title": "Explain Row Count Changes After a Join",
      "topics": [
        "join_explain"
      ]
    },
    {
      "page": "join_repair",
      "title": "Repair Common Key Issues",
      "topics": [
        "join_repair"
      ]
    },
    {
      "page": "join_spy",
      "title": "Comprehensive Pre-Join Diagnostic Report",
      "topics": [
        "join_spy"
      ]
    },
    {
      "page": "join_strict",
      "title": "Strict Join with Cardinality Enforcement",
      "topics": [
        "join_strict"
      ]
    },
    {
      "page": "key_check",
      "title": "Quick Key Quality Check",
      "topics": [
        "key_check"
      ]
    },
    {
      "page": "key_duplicates",
      "title": "Find Duplicate Keys",
      "topics": [
        "key_duplicates"
      ]
    },
    {
      "page": "last_report",
      "title": "Get the Last Join Report",
      "topics": [
        "last_report"
      ]
    },
    {
      "page": "left_join_spy",
      "title": "Left Join with Diagnostics",
      "topics": [
        "left_join_spy"
      ]
    },
    {
      "page": "log_report",
      "title": "Log Join Report to File",
      "topics": [
        "log_report"
      ]
    },
    {
      "page": "plot.JoinReport",
      "title": "Plot Method for JoinReport",
      "topics": [
        "plot.JoinReport"
      ]
    },
    {
      "page": "print.JoinReport",
      "title": "Print Method for JoinReport",
      "topics": [
        "print.JoinReport"
      ]
    },
    {
      "page": "right_join_spy",
      "title": "Right Join with Diagnostics",
      "topics": [
        "right_join_spy"
      ]
    },
    {
      "page": "set_log_file",
      "title": "Configure Automatic Logging",
      "topics": [
        "set_log_file"
      ]
    },
    {
      "page": "suggest_repairs",
      "title": "Suggest Repair Code",
      "topics": [
        "suggest_repairs"
      ]
    },
    {
      "page": "summary.JoinReport",
      "title": "Summary Method for JoinReport",
      "topics": [
        "summary.JoinReport"
      ]
    }
  ],
  "_readme": "https://github.com/gcol33/joinspy/raw/HEAD/README.md",
  "_rundeps": [
    "cli",
    "rlang"
  ],
  "_vignettes": [
    {
      "source": "common-issues.Rmd",
      "filename": "common-issues.html",
      "title": "Common Join Problems",
      "author": "Gilles Colling",
      "engine": "knitr::rmarkdown",
      "headings": [
        "Trailing and leading whitespace",
        "Case mismatches",
        "Encoding and invisible characters",
        "Empty strings masquerading as data",
        "Near-matches and typos",
        "Duplicate keys",
        "NA keys",
        "Type mismatches",
        "Many-to-many explosions",
        "No matches at all",
        "Troubleshooting workflow",
        "See Also"
      ],
      "created": "2026-01-14 10:26:28",
      "modified": "2026-03-31 22:04:22",
      "commits": 9
    },
    {
      "source": "production.Rmd",
      "filename": "production.html",
      "title": "Joins in Production",
      "author": "Gilles Colling",
      "engine": "knitr::rmarkdown",
      "headings": [
        "Assertions with key_check()",
        "Silent Joins in Pipelines",
        "Cardinality Guards",
        "Logging and Audit Trails",
        "Manual logging",
        "Automatic logging",
        "Sampling for Large Datasets",
        "A Complete Production Pattern"
      ],
      "created": "2026-03-31 07:33:28",
      "modified": "2026-03-31 22:04:22",
      "commits": 5
    },
    {
      "source": "quickstart.Rmd",
      "filename": "quickstart.html",
      "title": "Quick Start",
      "author": "Gilles Colling",
      "engine": "knitr::rmarkdown",
      "headings": [
        "String Diagnostics",
        "Whitespace",
        "Case Mismatches",
        "Encoding and Invisible Characters",
        "Combining Multiple Issues",
        "Duplicate Keys",
        "Auto-Repair",
        "Dry Run",
        "Applying Repairs",
        "Repair Suggestions from a Report",
        "Row Count Predictions",
        "Post-Join Diagnostics",
        "Explaining Row Count Changes",
        "Before/After Comparison",
        "Safe Join Wrappers",
        "Quiet Mode and Deferred Reports",
        "Cardinality Enforcement",
        "Advanced Features",
        "Cartesian Product Detection",
        "Multi-Table Join Chains",
        "Backend Support",
        "Quick Reference",
        "Further Reading"
      ],
      "created": "2026-01-23 23:41:49",
      "modified": "2026-03-31 23:09:10",
      "commits": 9
    },
    {
      "source": "why-keys-dont-match.Rmd",
      "filename": "why-keys-dont-match.html",
      "title": "Why Your Keys Don't Match",
      "author": "Gilles Colling",
      "engine": "knitr::rmarkdown",
      "headings": [
        "Scenario 1: The Excel Export",
        "Scenario 2: Two Databases, Two Conventions",
        "Scenario 3: The PDF Copy-Paste",
        "Scenario 4: The Slowly Growing Mismatch",
        "Scenario 5: Compound Keys",
        "The Pattern"
      ],
      "created": "2026-03-31 07:33:28",
      "modified": "2026-03-31 21:20:19",
      "commits": 4
    },
    {
      "source": "backends.Rmd",
      "filename": "backends.html",
      "title": "Working with Backends",
      "author": "Gilles Colling",
      "engine": "knitr::rmarkdown",
      "headings": [
        "Auto-detection",
        "Explicit override",
        "Class preservation",
        "Diagnostics are backend-agnostic",
        "Backend differences at a glance",
        "See Also"
      ],
      "created": "2026-03-31 07:33:28",
      "modified": "2026-03-31 08:38:08",
      "commits": 3
    }
  ],
  "_score": 5.653212513775344,
  "_indexed": true,
  "_nocasepkg": "joinspy",
  "_universes": [
    "gcol33"
  ],
  "_binaries": [
    {
      "r": "4.7.0",
      "os": "linux",
      "version": "0.8.0",
      "date": "2026-05-29T23:15:17.000Z",
      "distro": "noble",
      "commit": "bc3863eae61acb36021c9689a50c866dca037fb5",
      "fileid": "5a1b7a6ed9fc2921624679b7722c86c2283a8c54b42f509ba69a6bd6b1bed7ce",
      "status": "success",
      "check": "OK",
      "buildurl": "https://github.com/r-universe/gcol33/actions/runs/26666821396"
    },
    {
      "r": "4.6.0",
      "os": "linux",
      "version": "0.8.0",
      "date": "2026-05-29T23:15:11.000Z",
      "distro": "noble",
      "commit": "bc3863eae61acb36021c9689a50c866dca037fb5",
      "fileid": "2faf54d9dd10f1d2eaed3f310a2cd0e11914246c6e3763ebff9529322405cf37",
      "status": "success",
      "check": "OK",
      "buildurl": "https://github.com/r-universe/gcol33/actions/runs/26666821396"
    },
    {
      "r": "4.5.3",
      "os": "mac",
      "version": "0.8.0",
      "date": "2026-05-29T23:14:42.000Z",
      "commit": "bc3863eae61acb36021c9689a50c866dca037fb5",
      "fileid": "d1e4c646b8e404d3a6db7052e3b2696a127d40b7d4e14bf15f332a3ed66d5dc7",
      "status": "success",
      "check": "OK",
      "buildurl": "https://github.com/r-universe/gcol33/actions/runs/26666821396"
    },
    {
      "r": "4.6.0",
      "os": "mac",
      "version": "0.8.0",
      "date": "2026-05-29T23:14:36.000Z",
      "commit": "bc3863eae61acb36021c9689a50c866dca037fb5",
      "fileid": "6e681de2095c268226dd739f09b4ffe146a36c89c41028c8a0e8e447b3d9da6f",
      "status": "success",
      "check": "OK",
      "buildurl": "https://github.com/r-universe/gcol33/actions/runs/26666821396"
    },
    {
      "r": "4.6.0",
      "os": "wasm",
      "version": "0.8.0",
      "date": "2026-05-29T23:15:04.000Z",
      "commit": "bc3863eae61acb36021c9689a50c866dca037fb5",
      "fileid": "9698988208dc949b4f4dee6d70e4a0b0465699883a803210f8f27ada1202a30d",
      "status": "success",
      "buildurl": "https://github.com/r-universe/gcol33/actions/runs/26666821396"
    },
    {
      "r": "4.7.0",
      "os": "win",
      "version": "0.8.0",
      "date": "2026-05-29T23:14:28.000Z",
      "commit": "bc3863eae61acb36021c9689a50c866dca037fb5",
      "fileid": "bc0bd0791c0b611bedb7a224f25e3d64d556b92c6456e7d3b110d1cba4f23913",
      "status": "success",
      "check": "OK",
      "buildurl": "https://github.com/r-universe/gcol33/actions/runs/26666821396"
    },
    {
      "r": "4.5.3",
      "os": "win",
      "version": "0.8.0",
      "date": "2026-05-29T23:14:23.000Z",
      "commit": "bc3863eae61acb36021c9689a50c866dca037fb5",
      "fileid": "4ad6ce709bfcf42975ea83f77fbe51f7f8689ca9e05d00a50815c874b9743c2e",
      "status": "success",
      "check": "OK",
      "buildurl": "https://github.com/r-universe/gcol33/actions/runs/26666821396"
    },
    {
      "r": "4.6.0",
      "os": "win",
      "version": "0.8.0",
      "date": "2026-05-29T23:14:23.000Z",
      "commit": "bc3863eae61acb36021c9689a50c866dca037fb5",
      "fileid": "7b7622543780be690feacd8e5e3d7f54b062c8db4b825b1f9799807e7e3044ba",
      "status": "success",
      "check": "OK",
      "buildurl": "https://github.com/r-universe/gcol33/actions/runs/26666821396"
    }
  ]
}