#![doc(
html_logo_url = "https://raw.githubusercontent.com/Blackcat-Informatics/purrdf/main/docs/purrdf-logo.svg"
)]
#![doc(
html_favicon_url = "https://raw.githubusercontent.com/Blackcat-Informatics/purrdf/main/docs/purrdf-logo.svg"
)]
pub use purrdf_rdf::*;
pub mod profile;
pub use profile::{OntologyProfile, ReifierVocab};
pub mod reasoning;
pub use reasoning::{QueryEntailment, ReasoningError, query_with_entailment};
pub mod columnar {
pub use purrdf_columnar::*;
}
pub use purrdf_rdf::native_codecs::jsonld::StatementMetadataVocab;
pub use purrdf_shapes::json_schema::{
Namespaces, SchemaClassPropertyCoverage, SchemaCompilation, SchemaCompilationInput,
SchemaCompilationKey, SchemaCompileError, SchemaCompileRequest, SchemaCoveragePrecision,
SchemaCoverageProvenance, SchemaCoverageReport, SchemaCoverageStatus, SchemaPropertyCoverage,
SchemaSurfaceMode, compile_schema,
};
pub use purrdf_slice::SliceVocab;
pub mod gts {
pub use purrdf_gts::*;
pub use purrdf_rdf::gts::*;
}
pub mod sparql {
pub use purrdf_sparql_algebra::*;
pub use purrdf_sparql_eval::*;
pub use purrdf_sparql_results::*;
pub use purrdf_sparql_algebra::error;
}
pub mod xsd {
pub use purrdf_xsd::*;
}
pub mod iri {
pub use purrdf_iri::*;
}
pub mod events {
pub use purrdf_events::*;
}
pub mod slice {
pub use purrdf_slice::*;
}
pub mod viz {
pub use purrdf_rdf::viz::*;
}
pub mod shapes {
pub use purrdf_shapes::*;
}
pub mod shex {
pub use purrdf_shex::*;
}
pub mod entail {
pub use purrdf_entail::*;
}
pub mod validate {
pub use purrdf_validate::*;
}
pub mod prelude {
pub use purrdf_rdf::prelude::*;
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn facade_exposes_rdf_slice_shapes_and_shex() {
let _ = RdfDatasetBuilder::new();
let _ = slice::rdf_query::DatasetAccumulator::new();
let _ = shapes::SanitizePolicy::Rename;
let _ = shapes::report::ValidationReport {
conforms: true,
results: Vec::new(),
};
let _ = shex::parse_shexc("PREFIX ex: <https://example.org/>\nex:S { ex:p . }", None)
.expect("shex facade parses");
}
#[test]
fn facade_exposes_purremb_at_the_root() {
assert!(matches!(
EmbeddingView::from_bytes(b"not a PURREMB artifact"),
Err(EmbeddingError::Truncated)
));
}
#[test]
fn facade_exposes_typed_sssom_document_envelope() {
let layout = SssomColumnLayout::new(["subject_id", "object_id"])
.expect("valid facade column layout");
let mut set =
SssomMappingSet::new(SssomMeta::default(), Vec::new()).with_column_layout(layout);
set.append_provenance("facade provenance")
.expect("valid facade provenance");
let comment: &SssomSetComment = &set.set_comments[0];
assert_eq!(comment.kind(), SssomCommentKind::Provenance);
assert_eq!(comment.placement(), SssomCommentPlacement::BeforeTable);
let invalid: Result<SssomSetComment, SssomCommentError> =
SssomSetComment::from_raw("ordinary", SssomCommentPlacement::AfterTable);
assert_eq!(invalid, Err(SssomCommentError::MissingMarker));
}
#[test]
fn facade_exposes_graphql_package_and_value_codec() {
let compiled = shapes::json_schema::CompiledSchema {
schema_json: "{\"$defs\":{\"Note\":{\"type\":\"string\"}}}\n".to_owned(),
openapi_json: "{}\n".to_owned(),
losses: LossLedger::new(),
};
let config = shapes::GraphqlConfig::new(
"FacadeSchema",
"Caller-owned package documentation.",
"Caller-owned module documentation.",
"JsonCarrier",
)
.expect("valid GraphQL configuration");
let package = shapes::emit_graphql(&compiled, &config).expect("GraphQL package emits");
assert!(package.losses.is_empty());
assert!(package.artifacts.contains_key(shapes::GRAPHQL_SCHEMA_PATH));
assert!(
package
.artifacts
.contains_key(shapes::GRAPHQL_NAME_MAP_PATH)
);
}
#[test]
fn facade_exposes_all_schema_reverse_entry_points() {
let _: fn(
&str,
&shapes::SchemaImportConfig,
) -> Result<shapes::ImportedShapes, shapes::SchemaImportError> = shapes::import_json_schema;
let _: fn(
&shapes::json_schema::CompiledSchema,
&shapes::SchemaImportConfig,
) -> Result<shapes::ImportedShapes, shapes::SchemaImportError> =
shapes::import_compiled_schema;
let _: fn(
&shapes::LinkmlDocument,
&shapes::SchemaImportConfig,
) -> Result<shapes::ImportedShapes, shapes::LinkmlError> = shapes::import_linkml;
let _: fn(
&shapes::LinkmlPackage,
&shapes::SchemaImportConfig,
) -> Result<shapes::ImportedShapes, shapes::LinkmlError> = shapes::import_linkml_package;
let _: fn(
&shapes::PydanticPackage,
&shapes::SchemaImportConfig,
) -> Result<shapes::ImportedShapes, shapes::PydanticError> =
shapes::import_pydantic_package;
let _: fn(
&shapes::TypeScriptPackage,
&shapes::SchemaImportConfig,
) -> Result<shapes::ImportedShapes, shapes::TypeScriptError> =
shapes::import_typescript_package;
let _: fn(
&shapes::GraphqlPackage,
&shapes::SchemaImportConfig,
) -> Result<shapes::ImportedShapes, shapes::GraphqlError> = shapes::import_graphql_package;
let module = shapes::PydanticModuleConfig::new(
"domain.people",
"Caller-owned facade module documentation.",
)
.expect("module");
let class = shapes::PydanticClassConfig::new(
"Person",
"domain.people",
"Caller-owned facade class documentation.",
std::collections::BTreeMap::new(),
)
.expect("class");
let topology = shapes::PydanticPackageTopology::new([module], [class])
.expect("topology through facade");
let stamp = shapes::PydanticVersionStamp::new(
"1.2.3+facade.1",
"Caller-owned facade version documentation.",
)
.expect("version through facade");
let config = shapes::PydanticConfig::new(
"facade_models",
"Caller-owned facade package documentation.",
"Caller-owned facade support documentation.",
)
.expect("config through facade")
.with_topology(topology)
.expect("topology config through facade")
.with_version_stamp(stamp)
.expect("version config through facade");
assert_eq!(config.package_name(), "facade_models");
}
#[test]
fn facade_exposes_ontology_schema_compilation_contract() {
let _: fn(&SchemaCompileRequest<'_>) -> Result<SchemaCompilation, SchemaCompileError> =
compile_schema;
let mode = SchemaSurfaceMode::OntologyComplete;
assert!(matches!(mode, SchemaSurfaceMode::OntologyComplete));
let _: Option<SchemaCoverageReport> = None;
let _: Option<SchemaCompilationKey> = None;
}
#[test]
fn facade_exposes_the_completed_umbrella() {
assert_eq!(columnar::Table::ALL.len(), 5);
assert!(!format!("{:?}", gts::model::TermKind::Iri).is_empty());
let adapter: fn(&[u8], bool) -> _ = gts::read_graph;
assert!(
adapter(&[], false).is_err(),
"empty input is not a GTS graph"
);
assert!(!format!("{:?}", sparql::SparqlResultsFormat::Json).is_empty());
assert!(iri::parse("https://example.org/x").is_ok());
assert!(!format!("{:?}", events::TextDirection::Ltr).is_empty());
assert_eq!(
entail::Regime::from_iri("http://www.w3.org/ns/entailment/RDFS"),
Some(entail::Regime::Rdfs)
);
assert_eq!(validate::SARIF_VERSION, "2.1.0");
let empty = RdfDatasetBuilder::new().freeze().expect("empty dataset");
let pack = PackBuilder::build_bytes(&empty).expect("pack empty dataset");
let restored = restore_pack(&pack).expect("restore empty dataset");
assert_eq!(restored.quad_count(), 0);
let limits = PagedQueryLimits::new(1, 1024);
assert_eq!(limits.max_pages, 1);
let _: Option<sparql::CompleteSparqlResult<PagedQueryEvidence>> = None;
}
#[test]
fn facade_exposes_unified_consumer_config() {
let profile = OntologyProfile::for_namespace("https://example.org/vocab/");
let sv: SliceVocab = profile.slice_vocab();
let ns: Namespaces = profile.namespaces().expect("primary prefix resolves");
let smv: StatementMetadataVocab<'_> = profile.statement_metadata_vocab();
assert_eq!(sv.ns(), "https://example.org/vocab/");
assert_eq!(ns.compact_iri("https://example.org/vocab/Cat"), "vocab:Cat");
assert!(smv.statement_metadata.ends_with("StatementMetadata"));
}
#[test]
fn facade_exposes_configured_jsonld_serialization() {
let dataset = RdfDatasetBuilder::new().freeze().expect("empty dataset");
let options = JsonLdSerializeOptions::expanded();
let direct = serialize_dataset_to_jsonld_with_options(&dataset, &options)
.expect("configured JSON-LD through umbrella facade");
let generic = serialize_dataset_to_format_with_jsonld_options(
&dataset,
NativeRdfFormat::JsonLd,
None,
&options,
)
.expect("generic configured JSON-LD through umbrella facade");
assert_eq!(direct.as_bytes(), generic.bytes);
}
}