{
  "_id": "6a2db0d43efcd9bda4301301",
  "Package": "joinspy",
  "Title": "Diagnostic Tools for Data Frame Joins",
  "Version": "0.8.3",
  "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",
  "VignetteBuilder": "knitr",
  "Config/testthat/edition": "3",
  "URL": "https://gillescolling.com/joinspy/,\nhttps://github.com/gcol33/joinspy",
  "BugReports": "https://github.com/gcol33/joinspy/issues",
  "Config/roxygen2/version": "8.0.0",
  "NeedsCompilation": "no",
  "Packaged": {
    "Date": "2026-06-13 19:31:40 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>",
  "Repository": "https://cran.r-universe.dev",
  "Date/Publication": "2026-06-13 16:10:18 UTC",
  "RemoteUrl": "https://github.com/cran/joinspy",
  "RemoteRef": "HEAD",
  "RemoteSha": "4b8b74a9d3d2ad90fe39c92dcd7983b457fba682",
  "MD5sum": "66a6a78202199d8b5f56cd23c9e06aab",
  "_user": "cran",
  "_type": "src",
  "_file": "joinspy_0.8.3.tar.gz",
  "_fileid": "e26b3378265dcb158264e20374f9b806ab98e37bcd35879edc39cd8987c32c96",
  "_filesize": 485761,
  "_sha256": "e26b3378265dcb158264e20374f9b806ab98e37bcd35879edc39cd8987c32c96",
  "_created": "2026-06-13T19:31:40.000Z",
  "_published": "2026-06-13T19:34:44.381Z",
  "_distro": "noble",
  "_jobs": [
    {
      "job": 81217589673,
      "time": 140,
      "config": "linux-devel-x86_64",
      "r": "4.7.0",
      "check": "OK",
      "artifact": "7613829396"
    },
    {
      "job": 81217589675,
      "time": 140,
      "config": "linux-release-x86_64",
      "r": "4.6.0",
      "check": "OK",
      "artifact": "7613829452"
    },
    {
      "job": 81217382600,
      "time": 183,
      "config": "source",
      "r": "4.6.0",
      "check": "OK",
      "artifact": "7613811585"
    },
    {
      "job": 81217589676,
      "time": 114,
      "config": "wasm-release",
      "r": "4.6.0",
      "check": "OK",
      "artifact": "7613825403"
    }
  ],
  "_buildurl": "https://github.com/r-universe/cran/actions/runs/27476558263",
  "_status": "success",
  "_host": "GitHub-Actions",
  "_upstream": "https://github.com/cran/joinspy",
  "_commit": {
    "id": "4b8b74a9d3d2ad90fe39c92dcd7983b457fba682",
    "author": "Gilles Colling <gilles.colling051@gmail.com>",
    "committer": "cran-robot <csardi.gabor+cran@gmail.com>",
    "message": "version 0.8.3\n",
    "time": 1781367018
  },
  "_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": "cran",
  "_selfowned": false,
  "_usedby": 0,
  "_updates": [
    {
      "week": "2026-04",
      "n": 1
    },
    {
      "week": "2026-14",
      "n": 1
    },
    {
      "week": "2026-24",
      "n": 2
    }
  ],
  "_tags": [
    {
      "name": "0.7.3",
      "date": "2026-01-23"
    },
    {
      "name": "0.8.0",
      "date": "2026-03-31"
    },
    {
      "name": "0.8.2",
      "date": "2026-06-12"
    },
    {
      "name": "0.8.3",
      "date": "2026-06-13"
    }
  ],
  "_stars": 0,
  "_contributors": [
    {
      "user": "gcol33",
      "count": 4,
      "uuid": 25009600
    }
  ],
  "_userbio": {
    "uuid": 6899542,
    "type": "organization",
    "name": "cran",
    "followers": 606,
    "description": "Unofficial read-only mirror of all CRAN R packages"
  },
  "_downloads": {
    "count": 183,
    "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",
    "LICENSE",
    "manual.pdf"
  ],
  "_homeurl": "https://github.com/gcol33/joinspy",
  "_realowner": "gcol33",
  "_cranurl": false,
  "_releases": [
    {
      "version": "0.7.3",
      "date": "2026-01-23"
    },
    {
      "version": "0.8.0",
      "date": "2026-03-31"
    },
    {
      "version": "0.8.2",
      "date": "2026-06-12"
    },
    {
      "version": "0.8.3",
      "date": "2026-06-13"
    }
  ],
  "_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/cran/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",
        "Factor keys",
        "Near-matches and typos",
        "Duplicate keys",
        "NA keys",
        "Type mismatches",
        "Numeric keys with floating-point noise",
        "Many-to-many explosions",
        "No matches at all",
        "Differently named key columns",
        "Troubleshooting workflow",
        "See Also"
      ],
      "created": "2026-01-23 14:30:06",
      "modified": "2026-06-13 16:10:18",
      "commits": 4
    },
    {
      "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",
        "Inspecting Reports Programmatically",
        "Cardinality Guards",
        "Testing Join Contracts with testthat",
        "Logging and Audit Trails",
        "Manual logging",
        "Automatic logging",
        "Reading JSON Logs Downstream",
        "Diagnosing a Multi-Join Pipeline",
        "Sampling for Large Datasets",
        "A Complete Production Pattern",
        "The Cost of Diagnostics"
      ],
      "created": "2026-03-31 11:15:38",
      "modified": "2026-06-13 16:10:18",
      "commits": 3
    },
    {
      "source": "quickstart.Rmd",
      "filename": "quickstart.html",
      "title": "Quick Start",
      "author": "Gilles Colling",
      "engine": "knitr::rmarkdown",
      "headings": [
        "String Diagnostics",
        "Whitespace",
        "A Quick Gate: key_check()",
        "Keys with Different Names",
        "Case Mismatches",
        "Encoding and Invisible Characters",
        "Near Matches",
        "Type Mismatches",
        "Combining Multiple Issues",
        "Duplicate Keys",
        "The JoinReport Object",
        "print(), summary(), and plot()",
        "Auto-Repair",
        "Dry Run",
        "Applying Repairs",
        "Repairing a Single Table",
        "What Repair Does Not Fix",
        "Repair Suggestions from a Report",
        "Row Count Predictions",
        "Sampling Large Tables",
        "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",
        "Logging and Audit Trails",
        "Quick Reference",
        "Further Reading"
      ],
      "created": "2026-03-31 11:15:38",
      "modified": "2026-06-13 16:10:18",
      "commits": 3
    },
    {
      "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": [
        "What a Join Actually Compares",
        "What join_spy() Scans For",
        "Whitespace",
        "Case",
        "Invisible characters and encodings",
        "Empty strings",
        "Types, factors, and numeric keys",
        "Duplicates, NAs, and predicted row counts",
        "Near matches",
        "Compound keys",
        "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 11:15:38",
      "modified": "2026-06-13 16:10:18",
      "commits": 3
    },
    {
      "source": "backends.Rmd",
      "filename": "backends.html",
      "title": "Working with Backends",
      "author": "Gilles Colling",
      "engine": "knitr::rmarkdown",
      "headings": [
        "Auto-detection",
        "From wrapper to engine call",
        "Explicit override",
        "Class preservation",
        "Backend differences, demonstrated",
        "Column-name collisions",
        "Row ordering",
        "NA keys match each other",
        "join_strict(), .quiet, and the report flow",
        "Diagnostics are backend-agnostic",
        "Choosing a backend",
        "See Also"
      ],
      "created": "2026-03-31 11:15:38",
      "modified": "2026-06-13 16:10:18",
      "commits": 3
    }
  ],
  "_score": 3.8750612633917,
  "_indexed": false,
  "_nocasepkg": "joinspy",
  "_universes": [
    "cran"
  ],
  "_indexurl": "https://gcol33.r-universe.dev/joinspy",
  "_previous": "0.8.2",
  "_binaries": [
    {
      "r": "4.7.0",
      "os": "linux",
      "version": "0.8.3",
      "date": "2026-06-13T19:34:05.000Z",
      "distro": "noble",
      "commit": "4b8b74a9d3d2ad90fe39c92dcd7983b457fba682",
      "fileid": "5bca67d7ba40fed8c508b64e09d1251b4412bb76fb9b3592f16091989f34670c",
      "status": "success",
      "check": "OK",
      "buildurl": "https://github.com/r-universe/cran/actions/runs/27476558263"
    },
    {
      "r": "4.6.0",
      "os": "linux",
      "version": "0.8.3",
      "date": "2026-06-13T19:34:05.000Z",
      "distro": "noble",
      "commit": "4b8b74a9d3d2ad90fe39c92dcd7983b457fba682",
      "fileid": "4fe66548867bd02ec594529675d939e816037ce8fe25be68dbbe1048a0a4c690",
      "status": "success",
      "check": "OK",
      "buildurl": "https://github.com/r-universe/cran/actions/runs/27476558263"
    },
    {
      "r": "4.6.0",
      "os": "wasm",
      "version": "0.8.3",
      "date": "2026-06-13T19:33:54.000Z",
      "commit": "4b8b74a9d3d2ad90fe39c92dcd7983b457fba682",
      "fileid": "1a6304c7ca29e312d047424a98450c31b8d3036cb9902659e39607ddb2e43bfd",
      "status": "success",
      "buildurl": "https://github.com/r-universe/cran/actions/runs/27476558263"
    }
  ]
}