wordlift-sdk 2.10.3__tar.gz → 2.12.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/PKG-INFO +5 -2
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/README.md +4 -1
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/pyproject.toml +1 -1
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/validation/generator.py +157 -15
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/validation/shacls/google-breadcrumb.ttl +17 -18
- wordlift_sdk-2.12.0/wordlift_sdk/validation/shacls/google-carousel.ttl +40 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/validation/shacls/google-course.ttl +4 -4
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/validation/shacls/google-education-qa.ttl +23 -24
- wordlift_sdk-2.12.0/wordlift_sdk/validation/shacls/google-faqpage.ttl +36 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/validation/shacls/google-merchant-listing.ttl +56 -57
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/validation/shacls/google-product-snippet.ttl +37 -34
- wordlift_sdk-2.12.0/wordlift_sdk/validation/shacls/google-profile-page.ttl +130 -0
- wordlift_sdk-2.12.0/wordlift_sdk/validation/shacls/google-qapage.ttl +360 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/validation/shacls/google-recipe.ttl +42 -49
- wordlift_sdk-2.10.3/wordlift_sdk/validation/shacls/google-carousel.ttl +0 -37
- wordlift_sdk-2.10.3/wordlift_sdk/validation/shacls/google-faqpage.ttl +0 -38
- wordlift_sdk-2.10.3/wordlift_sdk/validation/shacls/google-profile-page.ttl +0 -130
- wordlift_sdk-2.10.3/wordlift_sdk/validation/shacls/google-qapage.ttl +0 -195
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/__init__.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/client/__init__.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/client/client_configuration_factory.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/configuration/__init__.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/configuration/configuration_provider.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/configuration/get_config_value.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/container/__init__.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/container/application_container.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/deprecated/__init__.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/deprecated/create_entities_with_top_query_dataframe.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/entity/__init__.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/entity/enrich.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/entity/patch.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/google_search_console/__init__.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/google_search_console/create_google_search_console_data_import.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/google_search_console/raise_error_if_account_analytics_not_configured.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/google_sheets/__init__.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/google_sheets/google_sheets_lookup.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/graph/graph_bag.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/graph/ttl_liquid/__init__.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/graph/ttl_liquid/ttl_liquid_graph_factory.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/graphql/__init__.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/graphql/client/__init__.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/graphql/client/client.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/graphql/client/factory.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/graphql/client/gql_client_provider.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/graphql/data/entities_by_type.graphql +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/graphql/data/entities_embedding_value.graphql +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/graphql/data/entities_top_query.graphql +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/graphql/data/entities_url_id.graphql +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/graphql/data/entities_url_iri.graphql +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/graphql/data/entities_url_iri_with_source_equal_to_web_page_import.graphql +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/graphql/query.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/graphql/utils/__init__.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/graphql/utils/query/__init__.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/graphql/utils/query/entity_top_query.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/graphql/utils/query/entity_with_top_query.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/id_generator/__init__.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/id_generator/id_generator.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/id_generator/id_generator_interface.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/internal_link/__init__.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/internal_link/utils.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/kg/__init__.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/kg/entity.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/kg/entity_store.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/kg/entity_store_factory.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/kg/relation/__init__.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/kg/relation/relation_service.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/main.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/namespace/SDO.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/namespace/__init__.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/notebook/__init__.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/notebook/install_if_missing.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/protocol/__init__.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/protocol/context.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/protocol/entity_patch/__init__.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/protocol/entity_patch/entity_patch.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/protocol/entity_patch/entity_patch_queue.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/protocol/graph/__init__.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/protocol/graph/graph_queue.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/protocol/load_override_class.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/protocol/web_page_import_protocol.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/render/__init__.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/render/browser.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/render/cleanup_options.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/render/html_renderer.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/render/render_options.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/render/rendered_page.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/render/xhtml_cleaner.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/structured_data/__init__.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/structured_data/agent.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/structured_data/agent_generator.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/structured_data/batch.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/structured_data/constants.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/structured_data/dataset_resolver.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/structured_data/debug.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/structured_data/engine.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/structured_data/inputs.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/structured_data/io.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/structured_data/materialization.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/structured_data/models.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/structured_data/orchestrator.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/structured_data/rendering.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/structured_data/schema_guide.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/structured_data/structured_data_engine.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/structured_data/validation.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/structured_data/yarrrml_pipeline.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/url_source/__init__.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/url_source/google_sheets_url_source.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/url_source/list_url_source.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/url_source/new_or_changed_url_source.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/url_source/sitemap_url_source.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/url_source/url_source.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/url_source/url_source_input.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/utils/__init__.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/utils/create_dataframe_from_google_sheets.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/utils/create_dataframe_of_entities_by_types.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/utils/create_dataframe_of_entities_with_embedding_vectors.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/utils/create_dataframe_of_url_iri.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/utils/create_entity_patch_request.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/utils/delayed.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/utils/get_me.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/utils/html_converter.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/utils/import_url.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/validation/__init__.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/validation/shacl.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/validation/shacls/__init__.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/validation/shacls/google-article.ttl +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/validation/shacls/google-book.ttl +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/validation/shacls/google-carousels-beta.ttl +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/validation/shacls/google-dataset.ttl +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/validation/shacls/google-discussion-forum.ttl +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/validation/shacls/google-employer-rating.ttl +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/validation/shacls/google-event.ttl +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/validation/shacls/google-factcheck.ttl +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/validation/shacls/google-image-license-metadata.ttl +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/validation/shacls/google-job-posting.ttl +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/validation/shacls/google-local-business.ttl +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/validation/shacls/google-loyalty-program.ttl +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/validation/shacls/google-math-solvers.ttl +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/validation/shacls/google-movie.ttl +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/validation/shacls/google-organization.ttl +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/validation/shacls/google-paywalled-content.ttl +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/validation/shacls/google-product-variants.ttl +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/validation/shacls/google-return-policy.ttl +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/validation/shacls/google-review-snippet.ttl +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/validation/shacls/google-shipping-policy.ttl +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/validation/shacls/google-software-app.ttl +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/validation/shacls/google-speakable.ttl +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/validation/shacls/google-vacation-rental.ttl +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/validation/shacls/google-video.ttl +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/validation/shacls/schemaorg-grammar.ttl +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/wordlift/__init__.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/wordlift/entity_gaps/__init__.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/wordlift/entity_gaps/create_entity_gaps_factory.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/wordlift/entity_gaps/entity_gaps_callback.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/wordlift/sitemap_import/__init__.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/wordlift/sitemap_import/protocol/__init__.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/wordlift/sitemap_import/protocol/default/__init__.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/wordlift/sitemap_import/protocol/default/default_import_url_protocol.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/wordlift/sitemap_import/protocol/default/default_parse_html_protocol.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/wordlift/sitemap_import/protocol/import_url_protocol_interface.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/wordlift/sitemap_import/protocol/parse_html_protocol_interface.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/wordlift/sitemap_import/protocol/protocol_context.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/workflow/__init__.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/workflow/create_or_update_entities_factory.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/workflow/kg_import_workflow.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/workflow/patch_entities_factory.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/workflow/url_handler/__init__.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/workflow/url_handler/default_url_handler.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/workflow/url_handler/search_console_url_handler.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/workflow/url_handler/url_handler.py +0 -0
- {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/workflow/url_handler/web_page_import_url_handler.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: wordlift-sdk
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.12.0
|
|
4
4
|
Summary:
|
|
5
5
|
Author: David Riccitelli
|
|
6
6
|
Author-email: david@wordlift.io
|
|
@@ -118,6 +118,10 @@ Override the web page import callback by placing `web_page_import_protocol.py` w
|
|
|
118
118
|
|
|
119
119
|
Add `.ttl.liquid` files under `data/templates`. Templates render with `account` fields available (e.g., `{{ account.dataset_uri }}`) and are uploaded before URL handling begins.
|
|
120
120
|
|
|
121
|
+
## Validation
|
|
122
|
+
|
|
123
|
+
SHACL validation utilities and generated Google Search Gallery shapes are included. When a feature includes both container types (for example `ItemList`, `BreadcrumbList`, `QAPage`, `FAQPage`, `Quiz`, `ProfilePage`, `Product`, `Recipe`, `Course`) and their contained types (`ListItem`, `Question`, `Answer`, `Comment`, `Offer`, `HowToStep`, `Person`, `Organization`), the generator scopes the contained constraints under the container properties to avoid enforcing them on unrelated nodes.
|
|
124
|
+
|
|
121
125
|
## Testing
|
|
122
126
|
|
|
123
127
|
```bash
|
|
@@ -129,4 +133,3 @@ poetry run pytest
|
|
|
129
133
|
|
|
130
134
|
- [Google Sheets Lookup](docs/google_sheets_lookup.md): Utility for O(1) lookups from Google Sheets.
|
|
131
135
|
|
|
132
|
-
|
|
@@ -90,6 +90,10 @@ Override the web page import callback by placing `web_page_import_protocol.py` w
|
|
|
90
90
|
|
|
91
91
|
Add `.ttl.liquid` files under `data/templates`. Templates render with `account` fields available (e.g., `{{ account.dataset_uri }}`) and are uploaded before URL handling begins.
|
|
92
92
|
|
|
93
|
+
## Validation
|
|
94
|
+
|
|
95
|
+
SHACL validation utilities and generated Google Search Gallery shapes are included. When a feature includes both container types (for example `ItemList`, `BreadcrumbList`, `QAPage`, `FAQPage`, `Quiz`, `ProfilePage`, `Product`, `Recipe`, `Course`) and their contained types (`ListItem`, `Question`, `Answer`, `Comment`, `Offer`, `HowToStep`, `Person`, `Organization`), the generator scopes the contained constraints under the container properties to avoid enforcing them on unrelated nodes.
|
|
96
|
+
|
|
93
97
|
## Testing
|
|
94
98
|
|
|
95
99
|
```bash
|
|
@@ -100,4 +104,3 @@ poetry run pytest
|
|
|
100
104
|
## Documentation
|
|
101
105
|
|
|
102
106
|
- [Google Sheets Lookup](docs/google_sheets_lookup.md): Utility for O(1) lookups from Google Sheets.
|
|
103
|
-
|
|
@@ -6,7 +6,7 @@ import argparse
|
|
|
6
6
|
import html as html_lib
|
|
7
7
|
import re
|
|
8
8
|
from dataclasses import dataclass
|
|
9
|
-
from datetime import datetime
|
|
9
|
+
from datetime import datetime, timezone
|
|
10
10
|
from pathlib import Path
|
|
11
11
|
from typing import Iterable
|
|
12
12
|
|
|
@@ -169,10 +169,136 @@ def _prop_path(prop: str) -> str:
|
|
|
169
169
|
return f"( {seq} )"
|
|
170
170
|
|
|
171
171
|
|
|
172
|
+
_SCOPED_CHILD_RULES: dict[str, dict[str, list[str]]] = {
|
|
173
|
+
"ItemList": {"itemListElement": ["ListItem"]},
|
|
174
|
+
"BreadcrumbList": {"itemListElement": ["ListItem"]},
|
|
175
|
+
"QAPage": {"mainEntity": ["Question"]},
|
|
176
|
+
"FAQPage": {"mainEntity": ["Question"]},
|
|
177
|
+
"Quiz": {"hasPart": ["Question"]},
|
|
178
|
+
"ProfilePage": {"mainEntity": ["Person", "Organization"]},
|
|
179
|
+
"Question": {
|
|
180
|
+
"acceptedAnswer": ["Answer"],
|
|
181
|
+
"suggestedAnswer": ["Answer"],
|
|
182
|
+
"comment": ["Comment"],
|
|
183
|
+
},
|
|
184
|
+
"Answer": {"comment": ["Comment"]},
|
|
185
|
+
"Product": {"offers": ["Offer"]},
|
|
186
|
+
"Recipe": {"recipeInstructions": ["HowToStep"], "step": ["HowToStep"]},
|
|
187
|
+
"Course": {"provider": ["Organization"], "hasPart": ["Course", "CreativeWork"]},
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
def _emit_property(
|
|
192
|
+
lines: list[str],
|
|
193
|
+
prop: str,
|
|
194
|
+
required: bool,
|
|
195
|
+
child_types: list[str] | None,
|
|
196
|
+
indent: int,
|
|
197
|
+
buckets: dict[str, dict[str, set[str]]],
|
|
198
|
+
visited: set[str],
|
|
199
|
+
) -> None:
|
|
200
|
+
sp = " " * indent
|
|
201
|
+
path = _prop_path(prop)
|
|
202
|
+
lines.append(f"{sp}sh:property [")
|
|
203
|
+
lines.append(f"{sp} sh:path {path} ;")
|
|
204
|
+
lines.append(f"{sp} sh:minCount 1 ;")
|
|
205
|
+
if not required:
|
|
206
|
+
lines.append(f"{sp} sh:severity sh:Warning ;")
|
|
207
|
+
lines.append(f'{sp} sh:message "Recommended by Google: {prop}." ;')
|
|
208
|
+
if child_types:
|
|
209
|
+
valid_children = [
|
|
210
|
+
child_type
|
|
211
|
+
for child_type in child_types
|
|
212
|
+
if child_type not in visited and child_type in buckets
|
|
213
|
+
]
|
|
214
|
+
if len(valid_children) == 1:
|
|
215
|
+
child_type = valid_children[0]
|
|
216
|
+
child_bucket = buckets.get(child_type)
|
|
217
|
+
node_indent = indent + 2
|
|
218
|
+
node_sp = " " * node_indent
|
|
219
|
+
lines.append(f"{node_sp}sh:node [")
|
|
220
|
+
_emit_node(
|
|
221
|
+
lines,
|
|
222
|
+
child_type,
|
|
223
|
+
child_bucket,
|
|
224
|
+
node_indent + 2,
|
|
225
|
+
buckets,
|
|
226
|
+
visited | {child_type},
|
|
227
|
+
)
|
|
228
|
+
lines.append(f"{node_sp}] ;")
|
|
229
|
+
elif len(valid_children) > 1:
|
|
230
|
+
or_indent = indent + 2
|
|
231
|
+
or_sp = " " * or_indent
|
|
232
|
+
lines.append(f"{or_sp}sh:or (")
|
|
233
|
+
for child_type in valid_children:
|
|
234
|
+
child_bucket = buckets.get(child_type)
|
|
235
|
+
lines.append(f"{or_sp} [")
|
|
236
|
+
_emit_node(
|
|
237
|
+
lines,
|
|
238
|
+
child_type,
|
|
239
|
+
child_bucket,
|
|
240
|
+
or_indent + 4,
|
|
241
|
+
buckets,
|
|
242
|
+
visited | {child_type},
|
|
243
|
+
)
|
|
244
|
+
lines.append(f"{or_sp} ]")
|
|
245
|
+
lines.append(f"{or_sp}) ;")
|
|
246
|
+
lines.append(f"{sp}] ;")
|
|
247
|
+
|
|
248
|
+
|
|
249
|
+
def _emit_node(
|
|
250
|
+
lines: list[str],
|
|
251
|
+
type_name: str,
|
|
252
|
+
bucket: dict[str, set[str]],
|
|
253
|
+
indent: int,
|
|
254
|
+
buckets: dict[str, dict[str, set[str]]],
|
|
255
|
+
visited: set[str],
|
|
256
|
+
) -> None:
|
|
257
|
+
sp = " " * indent
|
|
258
|
+
lines.append(f"{sp}a sh:NodeShape ;")
|
|
259
|
+
lines.append(f"{sp}sh:class schema:{type_name} ;")
|
|
260
|
+
|
|
261
|
+
child_rules = _SCOPED_CHILD_RULES.get(type_name, {})
|
|
262
|
+
for prop in sorted(bucket["required"]):
|
|
263
|
+
child_types = child_rules.get(prop)
|
|
264
|
+
_emit_property(
|
|
265
|
+
lines,
|
|
266
|
+
prop,
|
|
267
|
+
required=True,
|
|
268
|
+
child_types=child_types,
|
|
269
|
+
indent=indent,
|
|
270
|
+
buckets=buckets,
|
|
271
|
+
visited=visited,
|
|
272
|
+
)
|
|
273
|
+
|
|
274
|
+
for prop in sorted(bucket["recommended"]):
|
|
275
|
+
child_types = child_rules.get(prop)
|
|
276
|
+
_emit_property(
|
|
277
|
+
lines,
|
|
278
|
+
prop,
|
|
279
|
+
required=False,
|
|
280
|
+
child_types=child_types,
|
|
281
|
+
indent=indent,
|
|
282
|
+
buckets=buckets,
|
|
283
|
+
visited=visited,
|
|
284
|
+
)
|
|
285
|
+
|
|
286
|
+
|
|
172
287
|
def _write_feature(feature: FeatureData, output_path: Path, overwrite: bool) -> bool:
|
|
173
288
|
if output_path.exists() and not overwrite:
|
|
174
289
|
return False
|
|
175
290
|
|
|
291
|
+
scoped_types: set[str] = set()
|
|
292
|
+
for parent_type, rules in _SCOPED_CHILD_RULES.items():
|
|
293
|
+
if parent_type not in feature.types:
|
|
294
|
+
continue
|
|
295
|
+
for child_types in rules.values():
|
|
296
|
+
for child_type in child_types:
|
|
297
|
+
if child_type == parent_type:
|
|
298
|
+
continue
|
|
299
|
+
if child_type in feature.types:
|
|
300
|
+
scoped_types.add(child_type)
|
|
301
|
+
|
|
176
302
|
lines: list[str] = []
|
|
177
303
|
slug = output_path.stem
|
|
178
304
|
prefix_base = f"https://wordlift.io/shacl/google/{slug}/"
|
|
@@ -181,13 +307,18 @@ def _write_feature(feature: FeatureData, output_path: Path, overwrite: bool) ->
|
|
|
181
307
|
lines.append("@prefix schema: <http://schema.org/> .")
|
|
182
308
|
lines.append("")
|
|
183
309
|
lines.append(f"# Source: {feature.url}")
|
|
184
|
-
lines.append(
|
|
310
|
+
lines.append(
|
|
311
|
+
"# Generated: "
|
|
312
|
+
f"{datetime.now(timezone.utc).isoformat(timespec='seconds').replace('+00:00', 'Z')}"
|
|
313
|
+
)
|
|
185
314
|
lines.append(
|
|
186
315
|
"# Notes: required properties => errors; recommended properties => warnings."
|
|
187
316
|
)
|
|
188
317
|
lines.append("")
|
|
189
318
|
|
|
190
319
|
for type_name in sorted(feature.types.keys()):
|
|
320
|
+
if type_name in scoped_types:
|
|
321
|
+
continue
|
|
191
322
|
bucket = feature.types[type_name]
|
|
192
323
|
shape_name = f":google_{type_name}Shape"
|
|
193
324
|
lines.append(shape_name)
|
|
@@ -195,20 +326,28 @@ def _write_feature(feature: FeatureData, output_path: Path, overwrite: bool) ->
|
|
|
195
326
|
lines.append(f" sh:targetClass schema:{type_name} ;")
|
|
196
327
|
|
|
197
328
|
for prop in sorted(bucket["required"]):
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
329
|
+
child_types = _SCOPED_CHILD_RULES.get(type_name, {}).get(prop)
|
|
330
|
+
_emit_property(
|
|
331
|
+
lines,
|
|
332
|
+
prop,
|
|
333
|
+
required=True,
|
|
334
|
+
child_types=child_types,
|
|
335
|
+
indent=2,
|
|
336
|
+
buckets=feature.types,
|
|
337
|
+
visited={type_name},
|
|
338
|
+
)
|
|
203
339
|
|
|
204
340
|
for prop in sorted(bucket["recommended"]):
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
341
|
+
child_types = _SCOPED_CHILD_RULES.get(type_name, {}).get(prop)
|
|
342
|
+
_emit_property(
|
|
343
|
+
lines,
|
|
344
|
+
prop,
|
|
345
|
+
required=False,
|
|
346
|
+
child_types=child_types,
|
|
347
|
+
indent=2,
|
|
348
|
+
buckets=feature.types,
|
|
349
|
+
visited={type_name},
|
|
350
|
+
)
|
|
212
351
|
|
|
213
352
|
lines.append(".")
|
|
214
353
|
lines.append("")
|
|
@@ -381,7 +520,10 @@ def generate_schema_shacls(output_file: Path, overwrite: bool) -> int:
|
|
|
381
520
|
lines.append(f"@prefix schema: <{SCHEMA_DATA}> .")
|
|
382
521
|
lines.append("")
|
|
383
522
|
lines.append(f"# Source: {SCHEMA_JSONLD_URL}")
|
|
384
|
-
lines.append(
|
|
523
|
+
lines.append(
|
|
524
|
+
"# Generated: "
|
|
525
|
+
f"{datetime.now(timezone.utc).isoformat(timespec='seconds').replace('+00:00', 'Z')}"
|
|
526
|
+
)
|
|
385
527
|
lines.append(
|
|
386
528
|
"# Notes: schema.org grammar checks only; all constraints are warnings."
|
|
387
529
|
)
|
{wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/validation/shacls/google-breadcrumb.ttl
RENAMED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
@prefix schema: <http://schema.org/> .
|
|
4
4
|
|
|
5
5
|
# Source: https://developers.google.com/search/docs/appearance/structured-data/breadcrumb
|
|
6
|
-
# Generated: 2026-
|
|
6
|
+
# Generated: 2026-02-04T20:00:50Z
|
|
7
7
|
# Notes: required properties => errors; recommended properties => warnings.
|
|
8
8
|
|
|
9
9
|
:google_BreadcrumbListShape
|
|
@@ -12,22 +12,21 @@
|
|
|
12
12
|
sh:property [
|
|
13
13
|
sh:path schema:itemListElement ;
|
|
14
14
|
sh:minCount 1 ;
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
:
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
sh:minCount 1 ;
|
|
15
|
+
sh:node [
|
|
16
|
+
a sh:NodeShape ;
|
|
17
|
+
sh:class schema:ListItem ;
|
|
18
|
+
sh:property [
|
|
19
|
+
sh:path schema:item ;
|
|
20
|
+
sh:minCount 1 ;
|
|
21
|
+
] ;
|
|
22
|
+
sh:property [
|
|
23
|
+
sh:path schema:name ;
|
|
24
|
+
sh:minCount 1 ;
|
|
25
|
+
] ;
|
|
26
|
+
sh:property [
|
|
27
|
+
sh:path schema:position ;
|
|
28
|
+
sh:minCount 1 ;
|
|
29
|
+
] ;
|
|
30
|
+
] ;
|
|
32
31
|
] ;
|
|
33
32
|
.
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
@prefix : <https://wordlift.io/shacl/google/google-carousel/> .
|
|
2
|
+
@prefix sh: <http://www.w3.org/ns/shacl#> .
|
|
3
|
+
@prefix schema: <http://schema.org/> .
|
|
4
|
+
|
|
5
|
+
# Source: https://developers.google.com/search/docs/appearance/structured-data/carousel
|
|
6
|
+
# Generated: 2026-02-04T20:00:51Z
|
|
7
|
+
# Notes: required properties => errors; recommended properties => warnings.
|
|
8
|
+
|
|
9
|
+
:google_ItemListShape
|
|
10
|
+
a sh:NodeShape ;
|
|
11
|
+
sh:targetClass schema:ItemList ;
|
|
12
|
+
sh:property [
|
|
13
|
+
sh:path schema:itemListElement ;
|
|
14
|
+
sh:minCount 1 ;
|
|
15
|
+
sh:node [
|
|
16
|
+
a sh:NodeShape ;
|
|
17
|
+
sh:class schema:ListItem ;
|
|
18
|
+
sh:property [
|
|
19
|
+
sh:path schema:item ;
|
|
20
|
+
sh:minCount 1 ;
|
|
21
|
+
] ;
|
|
22
|
+
sh:property [
|
|
23
|
+
sh:path ( schema:item schema:name ) ;
|
|
24
|
+
sh:minCount 1 ;
|
|
25
|
+
] ;
|
|
26
|
+
sh:property [
|
|
27
|
+
sh:path ( schema:item schema:url ) ;
|
|
28
|
+
sh:minCount 1 ;
|
|
29
|
+
] ;
|
|
30
|
+
sh:property [
|
|
31
|
+
sh:path schema:position ;
|
|
32
|
+
sh:minCount 1 ;
|
|
33
|
+
] ;
|
|
34
|
+
sh:property [
|
|
35
|
+
sh:path schema:url ;
|
|
36
|
+
sh:minCount 1 ;
|
|
37
|
+
] ;
|
|
38
|
+
] ;
|
|
39
|
+
] ;
|
|
40
|
+
.
|
{wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/validation/shacls/google-course.ttl
RENAMED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
@prefix schema: <http://schema.org/> .
|
|
4
4
|
|
|
5
5
|
# Source: https://developers.google.com/search/docs/appearance/structured-data/course
|
|
6
|
-
# Generated: 2026-
|
|
6
|
+
# Generated: 2026-02-04T20:09:17Z
|
|
7
7
|
# Notes: required properties => errors; recommended properties => warnings.
|
|
8
8
|
|
|
9
9
|
:google_CourseShape
|
|
@@ -29,15 +29,15 @@
|
|
|
29
29
|
a sh:NodeShape ;
|
|
30
30
|
sh:targetClass schema:ItemList ;
|
|
31
31
|
sh:property [
|
|
32
|
-
sh:path schema:
|
|
32
|
+
sh:path ( schema:ListItem schema:position ) ;
|
|
33
33
|
sh:minCount 1 ;
|
|
34
34
|
] ;
|
|
35
35
|
sh:property [
|
|
36
|
-
sh:path schema:
|
|
36
|
+
sh:path ( schema:ListItem schema:url ) ;
|
|
37
37
|
sh:minCount 1 ;
|
|
38
38
|
] ;
|
|
39
39
|
sh:property [
|
|
40
|
-
sh:path schema:
|
|
40
|
+
sh:path schema:itemListElement ;
|
|
41
41
|
sh:minCount 1 ;
|
|
42
42
|
] ;
|
|
43
43
|
.
|
{wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/validation/shacls/google-education-qa.ttl
RENAMED
|
@@ -3,26 +3,9 @@
|
|
|
3
3
|
@prefix schema: <http://schema.org/> .
|
|
4
4
|
|
|
5
5
|
# Source: https://developers.google.com/search/docs/appearance/structured-data/education-qa
|
|
6
|
-
# Generated: 2026-
|
|
6
|
+
# Generated: 2026-02-04T20:00:52Z
|
|
7
7
|
# Notes: required properties => errors; recommended properties => warnings.
|
|
8
8
|
|
|
9
|
-
:google_QuestionShape
|
|
10
|
-
a sh:NodeShape ;
|
|
11
|
-
sh:targetClass schema:Question ;
|
|
12
|
-
sh:property [
|
|
13
|
-
sh:path schema:acceptedAnswer ;
|
|
14
|
-
sh:minCount 1 ;
|
|
15
|
-
] ;
|
|
16
|
-
sh:property [
|
|
17
|
-
sh:path schema:eduQuestionType ;
|
|
18
|
-
sh:minCount 1 ;
|
|
19
|
-
] ;
|
|
20
|
-
sh:property [
|
|
21
|
-
sh:path schema:text ;
|
|
22
|
-
sh:minCount 1 ;
|
|
23
|
-
] ;
|
|
24
|
-
.
|
|
25
|
-
|
|
26
9
|
:google_QuizShape
|
|
27
10
|
a sh:NodeShape ;
|
|
28
11
|
sh:targetClass schema:Quiz ;
|
|
@@ -37,6 +20,22 @@
|
|
|
37
20
|
sh:property [
|
|
38
21
|
sh:path schema:hasPart ;
|
|
39
22
|
sh:minCount 1 ;
|
|
23
|
+
sh:node [
|
|
24
|
+
a sh:NodeShape ;
|
|
25
|
+
sh:class schema:Question ;
|
|
26
|
+
sh:property [
|
|
27
|
+
sh:path schema:acceptedAnswer ;
|
|
28
|
+
sh:minCount 1 ;
|
|
29
|
+
] ;
|
|
30
|
+
sh:property [
|
|
31
|
+
sh:path schema:eduQuestionType ;
|
|
32
|
+
sh:minCount 1 ;
|
|
33
|
+
] ;
|
|
34
|
+
sh:property [
|
|
35
|
+
sh:path schema:text ;
|
|
36
|
+
sh:minCount 1 ;
|
|
37
|
+
] ;
|
|
38
|
+
] ;
|
|
40
39
|
] ;
|
|
41
40
|
sh:property [
|
|
42
41
|
sh:path schema:text ;
|
|
@@ -49,10 +48,10 @@
|
|
|
49
48
|
sh:message "Recommended by Google: about." ;
|
|
50
49
|
] ;
|
|
51
50
|
sh:property [
|
|
52
|
-
sh:path schema:
|
|
51
|
+
sh:path ( schema:about schema:name ) ;
|
|
53
52
|
sh:minCount 1 ;
|
|
54
53
|
sh:severity sh:Warning ;
|
|
55
|
-
sh:message "Recommended by Google:
|
|
54
|
+
sh:message "Recommended by Google: about.name." ;
|
|
56
55
|
] ;
|
|
57
56
|
sh:property [
|
|
58
57
|
sh:path schema:educationalAlignment ;
|
|
@@ -61,15 +60,15 @@
|
|
|
61
60
|
sh:message "Recommended by Google: educationalAlignment." ;
|
|
62
61
|
] ;
|
|
63
62
|
sh:property [
|
|
64
|
-
sh:path schema:
|
|
63
|
+
sh:path ( schema:educationalAlignment schema:alignmentType ) ;
|
|
65
64
|
sh:minCount 1 ;
|
|
66
65
|
sh:severity sh:Warning ;
|
|
67
|
-
sh:message "Recommended by Google:
|
|
66
|
+
sh:message "Recommended by Google: educationalAlignment.alignmentType." ;
|
|
68
67
|
] ;
|
|
69
68
|
sh:property [
|
|
70
|
-
sh:path schema:targetName ;
|
|
69
|
+
sh:path ( schema:educationalAlignment schema:targetName ) ;
|
|
71
70
|
sh:minCount 1 ;
|
|
72
71
|
sh:severity sh:Warning ;
|
|
73
|
-
sh:message "Recommended by Google: targetName." ;
|
|
72
|
+
sh:message "Recommended by Google: educationalAlignment.targetName." ;
|
|
74
73
|
] ;
|
|
75
74
|
.
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
@prefix : <https://wordlift.io/shacl/google/google-faqpage/> .
|
|
2
|
+
@prefix sh: <http://www.w3.org/ns/shacl#> .
|
|
3
|
+
@prefix schema: <http://schema.org/> .
|
|
4
|
+
|
|
5
|
+
# Source: https://developers.google.com/search/docs/appearance/structured-data/faqpage
|
|
6
|
+
# Generated: 2026-02-04T20:00:53Z
|
|
7
|
+
# Notes: required properties => errors; recommended properties => warnings.
|
|
8
|
+
|
|
9
|
+
:google_FAQPageShape
|
|
10
|
+
a sh:NodeShape ;
|
|
11
|
+
sh:targetClass schema:FAQPage ;
|
|
12
|
+
sh:property [
|
|
13
|
+
sh:path schema:mainEntity ;
|
|
14
|
+
sh:minCount 1 ;
|
|
15
|
+
sh:node [
|
|
16
|
+
a sh:NodeShape ;
|
|
17
|
+
sh:class schema:Question ;
|
|
18
|
+
sh:property [
|
|
19
|
+
sh:path schema:acceptedAnswer ;
|
|
20
|
+
sh:minCount 1 ;
|
|
21
|
+
sh:node [
|
|
22
|
+
a sh:NodeShape ;
|
|
23
|
+
sh:class schema:Answer ;
|
|
24
|
+
sh:property [
|
|
25
|
+
sh:path schema:text ;
|
|
26
|
+
sh:minCount 1 ;
|
|
27
|
+
] ;
|
|
28
|
+
] ;
|
|
29
|
+
] ;
|
|
30
|
+
sh:property [
|
|
31
|
+
sh:path schema:name ;
|
|
32
|
+
sh:minCount 1 ;
|
|
33
|
+
] ;
|
|
34
|
+
] ;
|
|
35
|
+
] ;
|
|
36
|
+
.
|
|
@@ -3,18 +3,18 @@
|
|
|
3
3
|
@prefix schema: <http://schema.org/> .
|
|
4
4
|
|
|
5
5
|
# Source: https://developers.google.com/search/docs/appearance/structured-data/merchant-listing
|
|
6
|
-
# Generated: 2026-
|
|
6
|
+
# Generated: 2026-02-04T20:09:18Z
|
|
7
7
|
# Notes: required properties => errors; recommended properties => warnings.
|
|
8
8
|
|
|
9
9
|
:google_3DModelShape
|
|
10
10
|
a sh:NodeShape ;
|
|
11
11
|
sh:targetClass schema:3DModel ;
|
|
12
12
|
sh:property [
|
|
13
|
-
sh:path schema:
|
|
13
|
+
sh:path schema:encoding ;
|
|
14
14
|
sh:minCount 1 ;
|
|
15
15
|
] ;
|
|
16
16
|
sh:property [
|
|
17
|
-
sh:path schema:encoding ;
|
|
17
|
+
sh:path ( schema:encoding schema:contentUrl ) ;
|
|
18
18
|
sh:minCount 1 ;
|
|
19
19
|
] ;
|
|
20
20
|
.
|
|
@@ -40,53 +40,6 @@
|
|
|
40
40
|
] ;
|
|
41
41
|
.
|
|
42
42
|
|
|
43
|
-
:google_OfferShape
|
|
44
|
-
a sh:NodeShape ;
|
|
45
|
-
sh:targetClass schema:Offer ;
|
|
46
|
-
sh:property [
|
|
47
|
-
sh:path schema:price ;
|
|
48
|
-
sh:minCount 1 ;
|
|
49
|
-
] ;
|
|
50
|
-
sh:property [
|
|
51
|
-
sh:path schema:priceCurrency ;
|
|
52
|
-
sh:minCount 1 ;
|
|
53
|
-
] ;
|
|
54
|
-
sh:property [
|
|
55
|
-
sh:path schema:priceSpecification ;
|
|
56
|
-
sh:minCount 1 ;
|
|
57
|
-
] ;
|
|
58
|
-
sh:property [
|
|
59
|
-
sh:path schema:availability ;
|
|
60
|
-
sh:minCount 1 ;
|
|
61
|
-
sh:severity sh:Warning ;
|
|
62
|
-
sh:message "Recommended by Google: availability." ;
|
|
63
|
-
] ;
|
|
64
|
-
sh:property [
|
|
65
|
-
sh:path schema:hasMerchantReturnPolicy ;
|
|
66
|
-
sh:minCount 1 ;
|
|
67
|
-
sh:severity sh:Warning ;
|
|
68
|
-
sh:message "Recommended by Google: hasMerchantReturnPolicy." ;
|
|
69
|
-
] ;
|
|
70
|
-
sh:property [
|
|
71
|
-
sh:path schema:itemCondition ;
|
|
72
|
-
sh:minCount 1 ;
|
|
73
|
-
sh:severity sh:Warning ;
|
|
74
|
-
sh:message "Recommended by Google: itemCondition." ;
|
|
75
|
-
] ;
|
|
76
|
-
sh:property [
|
|
77
|
-
sh:path schema:shippingDetails ;
|
|
78
|
-
sh:minCount 1 ;
|
|
79
|
-
sh:severity sh:Warning ;
|
|
80
|
-
sh:message "Recommended by Google: shippingDetails." ;
|
|
81
|
-
] ;
|
|
82
|
-
sh:property [
|
|
83
|
-
sh:path schema:url ;
|
|
84
|
-
sh:minCount 1 ;
|
|
85
|
-
sh:severity sh:Warning ;
|
|
86
|
-
sh:message "Recommended by Google: url." ;
|
|
87
|
-
] ;
|
|
88
|
-
.
|
|
89
|
-
|
|
90
43
|
:google_OfferShippingDetailsShape
|
|
91
44
|
a sh:NodeShape ;
|
|
92
45
|
sh:targetClass schema:OfferShippingDetails ;
|
|
@@ -94,10 +47,6 @@
|
|
|
94
47
|
sh:path schema:addressCountry ;
|
|
95
48
|
sh:minCount 1 ;
|
|
96
49
|
] ;
|
|
97
|
-
sh:property [
|
|
98
|
-
sh:path schema:currency ;
|
|
99
|
-
sh:minCount 1 ;
|
|
100
|
-
] ;
|
|
101
50
|
sh:property [
|
|
102
51
|
sh:path schema:deliveryTime ;
|
|
103
52
|
sh:minCount 1 ;
|
|
@@ -111,7 +60,11 @@
|
|
|
111
60
|
sh:minCount 1 ;
|
|
112
61
|
] ;
|
|
113
62
|
sh:property [
|
|
114
|
-
sh:path schema:
|
|
63
|
+
sh:path ( schema:shippingRate schema:currency ) ;
|
|
64
|
+
sh:minCount 1 ;
|
|
65
|
+
] ;
|
|
66
|
+
sh:property [
|
|
67
|
+
sh:path ( schema:shippingRate schema:value ) ;
|
|
115
68
|
sh:minCount 1 ;
|
|
116
69
|
] ;
|
|
117
70
|
sh:property [
|
|
@@ -165,6 +118,52 @@
|
|
|
165
118
|
sh:property [
|
|
166
119
|
sh:path schema:offers ;
|
|
167
120
|
sh:minCount 1 ;
|
|
121
|
+
sh:node [
|
|
122
|
+
a sh:NodeShape ;
|
|
123
|
+
sh:class schema:Offer ;
|
|
124
|
+
sh:property [
|
|
125
|
+
sh:path schema:price ;
|
|
126
|
+
sh:minCount 1 ;
|
|
127
|
+
] ;
|
|
128
|
+
sh:property [
|
|
129
|
+
sh:path schema:priceCurrency ;
|
|
130
|
+
sh:minCount 1 ;
|
|
131
|
+
] ;
|
|
132
|
+
sh:property [
|
|
133
|
+
sh:path schema:priceSpecification ;
|
|
134
|
+
sh:minCount 1 ;
|
|
135
|
+
] ;
|
|
136
|
+
sh:property [
|
|
137
|
+
sh:path schema:availability ;
|
|
138
|
+
sh:minCount 1 ;
|
|
139
|
+
sh:severity sh:Warning ;
|
|
140
|
+
sh:message "Recommended by Google: availability." ;
|
|
141
|
+
] ;
|
|
142
|
+
sh:property [
|
|
143
|
+
sh:path schema:hasMerchantReturnPolicy ;
|
|
144
|
+
sh:minCount 1 ;
|
|
145
|
+
sh:severity sh:Warning ;
|
|
146
|
+
sh:message "Recommended by Google: hasMerchantReturnPolicy." ;
|
|
147
|
+
] ;
|
|
148
|
+
sh:property [
|
|
149
|
+
sh:path schema:itemCondition ;
|
|
150
|
+
sh:minCount 1 ;
|
|
151
|
+
sh:severity sh:Warning ;
|
|
152
|
+
sh:message "Recommended by Google: itemCondition." ;
|
|
153
|
+
] ;
|
|
154
|
+
sh:property [
|
|
155
|
+
sh:path schema:shippingDetails ;
|
|
156
|
+
sh:minCount 1 ;
|
|
157
|
+
sh:severity sh:Warning ;
|
|
158
|
+
sh:message "Recommended by Google: shippingDetails." ;
|
|
159
|
+
] ;
|
|
160
|
+
sh:property [
|
|
161
|
+
sh:path schema:url ;
|
|
162
|
+
sh:minCount 1 ;
|
|
163
|
+
sh:severity sh:Warning ;
|
|
164
|
+
sh:message "Recommended by Google: url." ;
|
|
165
|
+
] ;
|
|
166
|
+
] ;
|
|
168
167
|
] ;
|
|
169
168
|
sh:property [
|
|
170
169
|
sh:path schema:aggregateRating ;
|
|
@@ -179,10 +178,10 @@
|
|
|
179
178
|
sh:message "Recommended by Google: audience." ;
|
|
180
179
|
] ;
|
|
181
180
|
sh:property [
|
|
182
|
-
sh:path schema:brand ;
|
|
181
|
+
sh:path ( schema:brand schema:name ) ;
|
|
183
182
|
sh:minCount 1 ;
|
|
184
183
|
sh:severity sh:Warning ;
|
|
185
|
-
sh:message "Recommended by Google: brand." ;
|
|
184
|
+
sh:message "Recommended by Google: brand.name." ;
|
|
186
185
|
] ;
|
|
187
186
|
sh:property [
|
|
188
187
|
sh:path schema:color ;
|