Skip to content

build(deps): bump log from 0.4.22 to 0.4.25#2439

Merged
jqnatividad merged 1 commit into
masterfrom
dependabot/cargo/log-0.4.25
Jan 14, 2025
Merged

build(deps): bump log from 0.4.22 to 0.4.25#2439
jqnatividad merged 1 commit into
masterfrom
dependabot/cargo/log-0.4.25

Conversation

@dependabot

@dependabot dependabot Bot commented on behalf of github Jan 14, 2025

Copy link
Copy Markdown
Contributor

Bumps log from 0.4.22 to 0.4.25.

Release notes

Sourced from log's releases.

0.4.25

What's Changed

Full Changelog: rust-lang/log@0.4.24...0.4.25

0.4.24 (yanked)

What's Changed

Full Changelog: rust-lang/log@0.4.23...0.4.24

0.4.23 (yanked)

What's Changed

New Contributors

Full Changelog: rust-lang/log@0.4.22...0.4.23

Changelog

Sourced from log's changelog.

[0.4.25] - 2025-01-14

What's Changed

Full Changelog: rust-lang/log@0.4.24...0.4.25

[0.4.24] - 2025-01-11

What's Changed

Full Changelog: rust-lang/log@0.4.23...0.4.24

[0.4.23] - 2025-01-10 (yanked)

What's Changed

New Contributors

Full Changelog: rust-lang/log@0.4.22...0.4.23

Commits
  • 22be810 Merge pull request #663 from rust-lang/cargo/0.4.25
  • 0279730 prepare for 0.4.25 release
  • 4099bcb Merge pull request #662 from rust-lang/fix/cargo-features
  • 36e7e3f revert loosening of kv cargo features
  • 2282191 Merge pull request #660 from rust-lang/cargo/0.4.24
  • 2994f0a prepare for 0.4.24 release
  • 5fcb50e Merge pull request #659 from rust-lang/fix/feature-builds
  • 29fe9e6 fix up feature activation
  • b1824f2 use cargo hack in CI to test all feature combinations
  • e6b643d Merge pull request #656 from rust-lang/cargo/0.4.23
  • Additional commits viewable in compare view

Dependabot compatibility score

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


Dependabot commands and options

You can trigger Dependabot actions by commenting on this PR:

  • @dependabot rebase will rebase this PR
  • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
  • @dependabot merge will merge this PR after your CI passes on it
  • @dependabot squash and merge will squash and merge this PR after your CI passes on it
  • @dependabot cancel merge will cancel a previously requested merge and block automerging
  • @dependabot reopen will reopen this PR if it is closed
  • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
  • @dependabot show <dependency name> ignore conditions will show all of the ignore conditions of the specified dependency
  • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
  • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
  • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)

Bumps [log](https://github.com/rust-lang/log) from 0.4.22 to 0.4.25.
- [Release notes](https://github.com/rust-lang/log/releases)
- [Changelog](https://github.com/rust-lang/log/blob/master/CHANGELOG.md)
- [Commits](rust-lang/log@0.4.22...0.4.25)

---
updated-dependencies:
- dependency-name: log
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
@dependabot dependabot Bot added dependencies Pull requests that update a dependency file rust Pull requests that update Rust code labels Jan 14, 2025
@jqnatividad jqnatividad merged commit 490717c into master Jan 14, 2025
@jqnatividad jqnatividad deleted the dependabot/cargo/log-0.4.25 branch January 14, 2025 16:24
jqnatividad added a commit that referenced this pull request May 25, 2026
…nputs (#3901)

* refactor(profile): port DP+ jinja2 helpers from Python to Rust (minijinja)

Replaces the PyO3-based formula engine with a native Rust implementation
built on minijinja. The Python files are not yet deleted (Phase 0d) and
the python feature gate is still in place (Phase 0e), but the runtime
code path no longer touches Python — qsv profile evaluates spec formulas
entirely in-process.

* formula_engine.rs preserves the evaluate_spec / FormulaResult API
  exactly so profile.rs::merge_formula_results was untouched beyond the
  module import.
* formula_helpers.rs ports all 17 DP+ helpers; the 2 SQL-backed ones
  (temporal_resolution, guess_accrual_periodicity) return errors today,
  matching the old Python-stub behavior; Phase 0c wires them to Polars.

Verified: 22 new unit tests pass, all 5 existing integration tests pass
(including the spatial_extent_wkt end-to-end formula round-trip).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* refactor(profile): remove Python; wire SQL helpers to Polars (Phase 0c-e)

Phase 0c: temporal_resolution and guess_accrual_periodicity now query
the input CSV via Polars SQL (new src/cmd/profile/sql_backend.rs). Each
helper call rebuilds a fresh LazyFrame + SQLContext, registers the CSV
as table `data`, runs a CAST-to-VARCHAR DISTINCT/ORDER BY query, then
parses the result strings as dates and computes interval thresholds
identical to DP+'s Python semantics. The backend is installed on the
current thread by evaluate_spec for the render-pass duration and
cleared after; thread_local storage avoids cross-test contamination.

Phase 0d: deleted src/cmd/profile/py/ and src/cmd/profile/py_engine.rs;
removed the jinja2_helpers.py entry from .github/workflows/devskim.yml.

Phase 0e (partial): profile feature is now [feature_capable, polars,
yaml_serde] — python is out, polars is in. profile is removed from the
python pull in distrib_features.

Adding profile to datapusher_plus is DEFERRED: it triggers feature-cfg
overlap in sortcheck.rs (and likely other files) since the profile
feature carries feature_capable. Needs a broader feature-cfg audit;
queued as a follow-up.

USAGE banner updated to drop the python3+jinja2 requirement language.
docs/help/profile.md regenerated. Two tangential clippy-fix nits in
describegpt.rs and moarstats.rs picked up by --fix.

Verified: 29 unit tests pass (including 6 new SQL-backed tests), all 5
integration tests pass, cargo +nightly fmt + cargo clippy clean.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* refactor(profile/dcat): split build() into per-section helpers (Phase 1)

Pure refactor — bit-identical output. The build() function becomes a
thin orchestrator over six dedicated helpers:

  add_context_and_type    — @context + @type
  add_core_identity       — dct:title/description/identifier/modified/issued
  add_provenance          — dct:license + dct:publisher
  add_classification      — dcat:keyword + dcat:theme
  add_coverage            — dct:spatial + dct:temporal
  add_governance          — dcat-us:accessLevel
  add_distributions       — dcat:distribution array

Each helper has an inline NOTE comment pointing at the upcoming Phase 2
shape change (spatial/temporal → array, license → Distribution,
conformsTo as Standard object, language ISO 639-1) so subsequent diffs
land in the obvious spot.

Adds a take_first_str(obj, &[primary, fallback]) helper to replace the
string_opt(...).or_else(...) chains scattered through the dataset
builder.

Verified: 4 dcat unit tests + 5 integration tests pass; spatial/temporal
JSON shapes and key-order are preserved exactly so downstream consumers
see no change.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* feat(profile/dcat): DCAT-US v3 shape migrations (Phase 2)

Breaking changes to the dcat output shape per the DCAT-US v1.1 → v3
migration guide (https://resources.data.gov/resources/dcat-us-3-migration/).

* 2a: dct:spatial is now an array of dct:Location objects (was a single
  object). Affects both the WKT-suggestion branch and the bbox fallback.
* 2b: dct:temporal is now an array of dct:PeriodOfTime, with one entry
  per inferred date column (previously only the first DATE_FIELDS entry
  was consumed).
* 2c: dct:license moved from Dataset to Distribution. Read order:
  resource.license_id → resource.license → package.license_id →
  package.license. New CLI flag --dcat-legacy-license re-emits at the
  Dataset level for transitional back-compat (default off).
* 2d: dct:conformsTo is always emitted as a dct:Standard object pointing
  at https://resources.data.gov/resources/dcat-us3/. dct:language, when
  provided, is normalized to ISO 639-1 (en-US → en, "English" → en);
  unrecognized values are dropped (Phase 5 will warn instead).
* 2e: dct:modified rejects ISO 8601 interval syntax (R/P1Y, P1Y,
  start/end ranges) — DCAT-US v3 requires a discrete date here.
  Frequency-of-update values belong on dct:accrualPeriodicity (Phase 5).

The two existing integration-test assertions that touched dct:spatial
were updated to index into the array. Added 7 new dcat unit tests
covering each shape change.

Verified: 11 dcat unit tests pass (4 existing + 7 new), all 5
integration tests pass, format + clippy clean.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* feat(profile): accept http(s) URL inputs, download to tempfile (Phase 3a)

When the input arg looks like a URL (http:// or https:// prefix,
case-insensitive), download it to a NamedTempFile via reqwest::blocking
and feed the local tempfile path to the rest of the pipeline (stats,
frequency, sqlp-backed helpers). The tempfile handle is held in a local
binding so its Drop fires only when run() returns.

The original URL is preserved and stamped onto resource.url (if the
resource doesn't already declare one) so the DCAT projection's
dcat:downloadURL slot gets populated automatically. The existing
absolute-IRI guard in build_distribution keeps non-IRI inputs from
polluting the slot.

DCAT-markup discovery (Link: rel=describedBy, sibling JSON-LD URLs,
HTML script-tag JSON-LD) is queued for Phase 3b. The
--no-dcat-discovery and --dcat-discovery-timeout flags also land with
3b.

Verified: new url_detection unit test passes; all 36 existing profile
unit tests + 5 integration tests still pass.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* feat(profile): DCAT-markup discovery on URL inputs (Phase 3b)

New module src/cmd/profile/dcat_discover.rs implements best-effort
DCAT-US v3 sniff for URL inputs. Ships with the most authoritative
mechanism — HTTP Link: rel=describedBy header — and is structured so
the two remaining mechanisms (sibling URLs by convention, JSON-LD
<script> blocks in HTML landing pages) can land as follow-up commits
without API churn.

* RFC 8288 Link header parser handles multi-token rel values, multiple
  comma-separated links, and case-insensitive rel matching.
* Relative IRIs resolve against the original URL via the url crate.
* extract_dcat_dataset handles the three common shapes: bare object,
  @graph array, and shape-fallback for non-conforming publishers.
* All network / parse errors are non-fatal — discovery is enrichment;
  failures fall through silently.
* Discovered DCAT surfaces under output.dcat_discovered for now. Phase
  4 will merge it with the auto-inferred projection per the documented
  precedence chain (force:true > discovered > inferred > plain seed >
  formulas).

New CLI flags wired through Args:
  --no-dcat-discovery
  --dcat-discovery-timeout <secs>  (default 5)

12 new unit tests cover Link-header parsing, IRI resolution, and the
dataset-extraction shapes. All 49 profile unit tests + 5 integration
tests pass; format + clippy clean. docs/help/profile.md regenerated.

One nightly-fmt drift in describegpt.rs picked up too.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* feat(profile): --initial-context replaces --package-meta/--resource-meta (Phase 4a)

Single unified JSON input replaces the two old seed-meta flags. Top-level
keys:

  * package      — CKAN-shaped seed for the dataset block
  * resource     — CKAN-shaped seed for the resource block
  * dataset_info — RFC 6901 JSON-Pointer overrides into the final output

dataset_info is the escape hatch: each entry sets a value at the named
pointer in the assembled output JSON, applied last so it wins
unconditionally over inference, discovered DCAT, the CKAN block, and
formula output. Missing parent objects are auto-created; non-pointer
keys and malformed paths are silently skipped.

The fixture tests/resources/profile/dcat-init-context.json documents
every field the projection currently reads or will read in Phase 5,
with a sibling README mapping each slot to its DCAT-US v3 target
property + a per-property `force` semantics primer for Phase 4b.

Per-property `{value, force}` wrapper detection and the merge with
discovered DCAT (the actual precedence chain — force:true > discovered
> inferred > plain seed > formulas) land in Phase 4b.

Verified: 4 new unit tests for apply_pointer_overrides + 1 new
integration test (profile_initial_context_seeds_package_and_overrides_via_dataset_info)
exercise the full --initial-context flow end-to-end including
JSON-Pointer overrides, ISO 639-1 language normalization (en-US → en),
ISO 8601 interval rejection on dct:modified, and license-on-Distribution.
All 49 unit + 6 integration tests pass.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* feat(profile): wrapper detection + discovered-DCAT merge (Phase 4b)

* load_initial_context now normalizes per-property {value, force}
  wrappers. The wrapper is detected by exact two-key shape (value +
  boolean force), so structural fields like contact_point: {fn, hasEmail}
  pass through untouched. Nested wrappers (inside Maps or Arrays)
  unwrap recursively.
* merge_discovered overlays publisher-stated DCAT onto the inferred
  projection with "fill gaps" semantics: inferred values (including
  --initial-context seed values) always win on collision; discovered
  fills only the slots inferred left absent. @context, @type, and
  dcat:distribution are never overwritten (per-distribution merging
  needs an identity scheme first; out of scope).
* The raw discovered DCAT still surfaces under output.dcat_discovered
  for diffing / auditing.

The force flag is currently accepted forward-compat but no-op under
fill-gaps — since seeded values pre-populate inferred, plain values
and force:true wrappers produce identical output today. Full
override-discovered semantics can layer onto merge_discovered without
an init-context schema break.

Verified: 7 new wrapper-normalization tests + 3 new merge tests; all
63 profile unit tests and 6 integration tests pass.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* feat(profile/dcat): add all DCAT-US v3 mandatory + recommended fields (Phase 5)

dcat::build signature changes from `-> Value` to `-> (Value, Vec<DcatWarning>)`.
profile.rs::run threads the warnings into the top-level output JSON as
`dcat_warnings` (elided when empty). Each entry is {field, severity,
message} where severity is Required (mandatory v3) or Recommended.

Dataset-level additions:
* dcat:contactPoint (vcard:Individual) — MANDATORY. Reads
  package.contact_point.{fn, hasEmail}; falls back to
  package.maintainer + package.maintainer_email. Missing → Required warning.
* dcat-us:bureauCode / programCode — accepts arrays or comma-separated
  strings. Missing → Recommended warning each.
* dct:accrualPeriodicity — slug → EU controlled-vocab IRI (annual,
  monthly, daily, etc., plus R/P* aliases). Also reads
  dpp_suggestions.accrual_periodicity for formula-derived values.
* dcat:temporalResolution — pass-through ISO 8601 duration; reads
  dpp_suggestions.temporal_resolution for formula-derived values.
* dct:accessRights, dct:rights, dcat:landingPage (IRI-validated),
  dcat:describedBy (IRI-validated), dcat-us:purpose, skos:scopeNote,
  dcat-us:liabilityStatement, dcat:inSeries (IRI-validated).

Distribution-level additions:
* dcat:accessURL (IRI-validated), dct:rights, dct:modified,
  dcat-us:accessRestriction / useRestriction / cuiRestriction
  (structured objects, passed through verbatim).

Tests: 9 new dcat unit tests (contact-point happy-path/fallback/missing,
US-codes array/csv/missing, accrual-periodicity slug mapping, extended
metadata pass-through, distribution v3 additions) + 2 new integration
tests (full-v3 population emits every mandatory+recommended slot with
no warnings; missing contactPoint surfaces a Required-severity warning).
All 20 dcat + 8 integration tests pass; format + clippy clean.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* feat(profile): opt-in JSON Schema validation (Phase 6)

New src/cmd/profile/dcat_validate.rs exposes validate_dataset(value)
backed by jsonschema = 0.46 (already a workspace dep). Returns one
DcatWarning per violation — Required severity when the schema reports a
`required` violation, else Recommended.

The schema is an embedded minimal v3 enforcement of the mandatory
keys per https://resources.data.gov/resources/dcat-us3/:
@type=dcat:Dataset, dct:title/description/identifier (non-empty),
dct:publisher (with foaf:name), dcat:contactPoint (vcard:Individual
with vcard:fn + mailto-prefixed vcard:hasEmail), dct:conformsTo
(dct:Standard with @id), and dcat:distribution (≥1). Recommended
fields are intentionally NOT enforced by schema — those are surfaced
by the in-projection helpers (add_contact_point, add_us_codes, etc.)
which give richer guidance per missing field.

Follow-up: vendor the full GSA dcat-us jsonschema bundle from
https://github.com/GSA/dcat-us/tree/main/jsonschema under
resources/dcat-us-v3/ pinned to an upstream commit SHA and switch
embedded_minimal_schema() to load it via $ref resolution. The
Validator::options().build pattern already mirrors src/cmd/validate.rs
for an easy swap.

CLI flags wired through Args:
  --validate-dcat   Append schema violations to dcat_warnings.
  --strict-dcat     Under --validate-dcat, fail the command instead.

5 unit tests + 3 integration tests cover: passing minimal dataset,
missing contactPoint surfacing Required severity, bad email format
(mailto check), wrong @type rejection, missing distribution array,
full-init-context validates clean, missing-cp triggers warning, and
--strict-dcat fails the command without writing the output file.

docs/help/profile.md regenerated.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* fix(profile): address roborev #2439 — 6 Medium findings

1. SqlBackend now honors --delimiter and --no-headers. Added
   with_delimiter / with_has_header builders and threaded ctx_args
   values through evaluate_spec. SQL-backed helpers
   (temporal_resolution, guess_accrual_periodicity) now see the same
   columns stats/frequency saw on TSV/SSV/no-header inputs.

2. URL downloads stream via std::io::copy instead of buffering the
   full response with response.bytes() — large remote CSVs no longer
   risk OOM.

3. New tempfile_suffix_for_url helper parses the URL via url::Url,
   uses Url::path() to strip query strings and fragments, and
   preserves CSV-family compound extensions (.csv.gz, .tsv.gz,
   .csv.zst, .csv.bz2, .csv.xz, …). Previous Path::extension() on the
   raw URL turned `data.csv.gz?token=x` into garbage and dropped the
   .csv from compound extensions.

4. Reordered profile.rs::run so --initial-context dataset_info
   JSON-Pointer overrides apply BEFORE --validate-dcat / --strict-dcat
   runs. A user supplying a missing mandatory field via
   /dcat/dcat:contactPoint now satisfies validation. Build-time
   warnings are stashed under __pending_dcat_warnings during the
   intermediate phase and unstashed after the schema pass.

5. set_by_pointer now descends into existing arrays via numeric path
   segments. Previously /dcat/dcat:distribution/0/dct:license
   replaced the distribution array with {"0": {...}}, corrupting the
   DCAT shape. Out-of-range indices and non-numeric tokens against an
   array silently skip rather than convert it to an object.

6. Added Kwargs support to truncate_with_ellipsis, format_number,
   format_date, format_range, format_coordinates, and
   spatial_extent_feature_collection. Existing DP+ formulas using
   `format_date(format='%B %d, %Y')`, `truncate_with_ellipsis(length=5,
   ellipsis='…')`, `spatial_extent_feature_collection(name=, bbox=,
   feature_type=)` etc. now work. spatial_extent_feature_collection
   uses a kwargs-only signature (minijinja can't cleanly bind typed
   positional + Kwargs in an all-kwargs call); the docstring documents
   the constraint.

Tests: 4 new sql_backend (TSV, no-header roundtrip), 5 new profile.rs
(URL suffix compound/query/array-pointer regressions), 1 kwargs
end-to-end, 1 dataset_info-rescues-strict integration. All 86 unit +
12 integration tests pass.

DcatWarning + Severity gained #[derive(Deserialize)] so the
intermediate stash/unstash round-trips cleanly.

Closes roborev job 2439.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* fix(profile): derive dct:title from URL basename, not tempfile stem

When the input is a URL, the title slots (dct:title on Dataset,
dct:title on Distribution) previously surfaced the random tempfile
suffix (qsv-profile-XkZGBK) since context::build seeds resource.name
from the local file path and dcat::build's title fallback uses
Path::file_stem on the same. Both are useless to downstream consumers.

New url_title_default(url) helper parses the URL with url::Url, strips
CSV-family compound extensions (.csv.gz, .tsv.gz, .csv.zst, …) and
single extensions, then returns the last non-empty path segment.
Opaque/UUID basenames (e.g. CKAN's /datastore/dump/<uuid>) pass through
unchanged — still better than the random tempfile suffix and traceable
back to the input. Host-only / malformed URLs return None and the
caller falls back to today's tempfile-stem default.

profile.rs::run seeds:
  * package.title  — via .entry().or_insert(), so a real seed wins.
  * resource.name  — replaced only when its current value matches the
    tempfile stem context::build would have inserted; user-supplied
    values via --initial-context or formulas survive untouched.

Verified live against the WPRDC Pittsburgh 311 endpoint
(https://data.wprdc.org/datastore/dump/5202679a-...): both
dct:title and the Distribution dct:title now read
"5202679a-d243-402e-b82a-63189995a942" (the UUID basename) instead
of "qsv-profile-PL3u1k" (the tempfile stem). qsv:sourcePath still
records the tempfile path for traceability.

Tests: 6 new url_title_default unit tests + the 5 existing URL-suffix
ones still pass. All 92 profile unit + 12 integration tests pass.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* fix(profile): address roborev #2440 — 3 Medium findings

1. profile.rs: stashed build-time dcat_warnings are now filtered
   against the final dcat block before being re-emitted. New helper
   final_dcat_has_field looks up each warning's field name (top-level
   key, or JSON-Pointer path for nested fields) in the post-override
   dcat snapshot and drops the warning if the slot is populated.
   Result: a `dataset_info` override that supplies a previously-
   missing mandatory field no longer leaves a "missing X" warning
   stale in the output.

2. context.rs::load_initial_context now applies normalize_value_force
   to dataset_info too — previously only package and resource were
   unwrapped. A documented override like
     "/dcat/dcat:contactPoint": {"value": {...}, "force": true}
   now unwraps to the inner Value before being written to the output
   via set_by_pointer, so the wrapper itself doesn't become the
   dcat:contactPoint value. This rescues --strict-dcat instead of
   tripping it.

3. spatial_extent_feature_collection regained positional-arg support
   alongside kwargs. minijinja's Function impl doesn't route
   `Rest<Value> + Kwargs` cleanly — Rest greedily consumes the kwargs
   container as its only positional, leaving Kwargs empty (confirmed
   via debug print: `args.len()=1, kwargs.args()=[]`). Workaround:
   accept Rest<Value> only and detect a trailing kwargs-shaped Value
   ourselves via the public Kwargs::try_from impl, splitting it off
   as kwargs and processing the leading slice as positionals. Both
   call styles documented in DP+'s docstring now work:
     spatial_extent_feature_collection("Name", bbox, "manual")
     spatial_extent_feature_collection(name="X", bbox=[...], feature_type="m")
     spatial_extent_feature_collection("Mix", bbox=[...], feature_type="m")

Tests: 2 new helper unit tests (positional + mixed-pos-and-kw call
styles) and 2 new integration tests (stale warnings cleared by
dataset_info override; wrapped {value, force} dataset_info override
rescues --strict-dcat). All 94 profile unit tests + 14 integration
tests pass; format + clippy clean.

Closes roborev job 2440.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* typos: add more exceptions

* docs(features): drop `python` from all_features + distrib_features

CI docs-drift-check caught a docs gap from the Phase 0e Cargo.toml
change: `profile` no longer depends on `python`, and `python` was
dropped from the `distrib_features` enumeration in Cargo.toml, but the
two doc lines in docs/FEATURES.md still listed it.

`python` is still a defined feature (`python = ["pyo3"]` exists for
the standalone `py` command), so this is purely a docs-enumeration
sync — no Cargo.toml or behavior change.

Verified: scripts/docs-drift-check.py reports "no drift detected".

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* docs(features): include `python` in distrib_features exception clause

Roborev 2444#1: the prior commit dropped `python` from the explicit
distrib_features enumeration but left the surrounding prose claiming
distrib_features is "all features except self_update, ui and magika".
Since `python` is also excluded now, add it to the exception clause
so the description matches reality.

Verified: scripts/docs-drift-check.py reports "no drift detected".

Closes roborev job 2444.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* address review: Copilot PR #3901 + devskim suppressions

Six Copilot review findings:

* formula_helpers.rs module docs: drop the stale "SQL globals
  currently short-circuit to an error" claim — Phase 0c shipped the
  Polars SQL backend and the helpers are wired through it.
* mode() determinism: previously HashMap-based, so ties were broken
  non-deterministically and could change guess_accrual_periodicity
  output across runs. Now tracks first-seen index alongside the count
  and breaks ties via Reverse(first_seen) so the earliest-encountered
  value wins (matches Python Counter.most_common(1)).
* parse_date_strings now accepts ISO 8601 datetimes with fractional
  seconds — %Y-%m-%dT%H:%M:%S%.f and %Y-%m-%d %H:%M:%S%.f — before
  falling through to second-precision / date-only / RFC 3339. DP+'s
  datetime.fromisoformat accepts these and temporal_resolution /
  guess_accrual_periodicity were hard-failing without them.
* resolve_input now uses util::create_reqwest_blocking_client (same
  helper validate / describegpt / fetch use) for consistent
  user-agent, gzip/brotli/zstd compression, rustls, and 503 retry.
* dcat_discover::discover swaps to util::create_reqwest_blocking_client
  for the same reasons. The describedBy fetch in
  discover_via_link_header is now capped at 4 MiB via
  std::io::Read::take, so a publisher-controlled Link target can't
  blow up qsv's memory if it points at a multi-GB resource.
* dcat-init-context.README.md status column: every "⏳ Phase 5" entry
  flipped to "✅ today" since the Phase 5 fields all landed; the
  surrounding prose updated to match.

GitHub Advanced Security devskim noise (17 findings):

* The http:// IRIs in accrual_periodicity_iri (EU
  publications.europa.eu frequency vocab) are stable opaque
  identifiers published with the http scheme by spec, same as the
  Creative Commons / Open Data Commons IRIs in license_iri. Added
  `// DevSkim: ignore DS137138` to each.
* Same situation for the W3C DCAT canonical type IRI
  `http://www.w3.org/ns/dcat#Dataset` in dcat_discover::is_dcat_dataset
  and its two extract_dataset_* test fixtures.
* The two bare http:// strings in url_detection_recognizes_http_https_case_insensitive
  are detector inputs — exactly what is_http_url is testing — so the
  test gets DS137138 suppressions too.
* The two "TODO Phase 3b'/3b''" markers in dcat_discover.rs's
  module docstring tripped devskim's "suspicious comment" rule
  (DS176209); reworded to "(Phase 3b' follow-up)" /
  "(Phase 3b'' follow-up)" — same intent, no TODO/FIXME keyword.

Tests: 2 new mode/parse-date unit tests + all 96 unit + 14 integration
tests pass; format + clippy clean.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependencies Pull requests that update a dependency file rust Pull requests that update Rust code

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant