wordlift-sdk 2.11.0__tar.gz → 2.13.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.11.0 → wordlift_sdk-2.13.0}/PKG-INFO +5 -4
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/README.md +2 -2
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/pyproject.toml +2 -2
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/validation/generator.py +150 -54
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/validation/shacls/google-breadcrumb.ttl +17 -18
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/validation/shacls/google-carousel.ttl +1 -1
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/validation/shacls/google-course.ttl +4 -4
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/validation/shacls/google-education-qa.ttl +23 -24
- wordlift_sdk-2.13.0/wordlift_sdk/validation/shacls/google-faqpage.ttl +36 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/validation/shacls/google-merchant-listing.ttl +56 -57
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/validation/shacls/google-product-snippet.ttl +37 -34
- wordlift_sdk-2.13.0/wordlift_sdk/validation/shacls/google-profile-page.ttl +130 -0
- wordlift_sdk-2.13.0/wordlift_sdk/validation/shacls/google-qapage.ttl +360 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/validation/shacls/google-recipe.ttl +42 -49
- wordlift_sdk-2.11.0/wordlift_sdk/validation/shacls/google-faqpage.ttl +0 -38
- wordlift_sdk-2.11.0/wordlift_sdk/validation/shacls/google-profile-page.ttl +0 -130
- wordlift_sdk-2.11.0/wordlift_sdk/validation/shacls/google-qapage.ttl +0 -195
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/__init__.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/client/__init__.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/client/client_configuration_factory.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/configuration/__init__.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/configuration/configuration_provider.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/configuration/get_config_value.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/container/__init__.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/container/application_container.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/deprecated/__init__.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/deprecated/create_entities_with_top_query_dataframe.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/entity/__init__.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/entity/enrich.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/entity/patch.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/google_search_console/__init__.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/google_search_console/create_google_search_console_data_import.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/google_search_console/raise_error_if_account_analytics_not_configured.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/google_sheets/__init__.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/google_sheets/google_sheets_lookup.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/graph/graph_bag.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/graph/ttl_liquid/__init__.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/graph/ttl_liquid/ttl_liquid_graph_factory.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/graphql/__init__.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/graphql/client/__init__.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/graphql/client/client.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/graphql/client/factory.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/graphql/client/gql_client_provider.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/graphql/data/entities_by_type.graphql +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/graphql/data/entities_embedding_value.graphql +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/graphql/data/entities_top_query.graphql +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/graphql/data/entities_url_id.graphql +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/graphql/data/entities_url_iri.graphql +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/graphql/data/entities_url_iri_with_source_equal_to_web_page_import.graphql +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/graphql/query.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/graphql/utils/__init__.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/graphql/utils/query/__init__.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/graphql/utils/query/entity_top_query.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/graphql/utils/query/entity_with_top_query.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/id_generator/__init__.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/id_generator/id_generator.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/id_generator/id_generator_interface.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/internal_link/__init__.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/internal_link/utils.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/kg/__init__.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/kg/entity.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/kg/entity_store.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/kg/entity_store_factory.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/kg/relation/__init__.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/kg/relation/relation_service.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/main.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/namespace/SDO.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/namespace/__init__.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/notebook/__init__.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/notebook/install_if_missing.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/protocol/__init__.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/protocol/context.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/protocol/entity_patch/__init__.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/protocol/entity_patch/entity_patch.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/protocol/entity_patch/entity_patch_queue.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/protocol/graph/__init__.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/protocol/graph/graph_queue.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/protocol/load_override_class.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/protocol/web_page_import_protocol.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/render/__init__.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/render/browser.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/render/cleanup_options.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/render/html_renderer.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/render/render_options.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/render/rendered_page.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/render/xhtml_cleaner.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/structured_data/__init__.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/structured_data/agent.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/structured_data/agent_generator.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/structured_data/batch.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/structured_data/constants.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/structured_data/dataset_resolver.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/structured_data/debug.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/structured_data/engine.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/structured_data/inputs.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/structured_data/io.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/structured_data/materialization.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/structured_data/models.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/structured_data/orchestrator.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/structured_data/rendering.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/structured_data/schema_guide.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/structured_data/structured_data_engine.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/structured_data/validation.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/structured_data/yarrrml_pipeline.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/url_source/__init__.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/url_source/google_sheets_url_source.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/url_source/list_url_source.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/url_source/new_or_changed_url_source.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/url_source/sitemap_url_source.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/url_source/url_source.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/url_source/url_source_input.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/utils/__init__.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/utils/create_dataframe_from_google_sheets.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/utils/create_dataframe_of_entities_by_types.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/utils/create_dataframe_of_entities_with_embedding_vectors.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/utils/create_dataframe_of_url_iri.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/utils/create_entity_patch_request.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/utils/delayed.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/utils/get_me.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/utils/html_converter.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/utils/import_url.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/validation/__init__.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/validation/shacl.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/validation/shacls/__init__.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/validation/shacls/google-article.ttl +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/validation/shacls/google-book.ttl +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/validation/shacls/google-carousels-beta.ttl +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/validation/shacls/google-dataset.ttl +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/validation/shacls/google-discussion-forum.ttl +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/validation/shacls/google-employer-rating.ttl +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/validation/shacls/google-event.ttl +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/validation/shacls/google-factcheck.ttl +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/validation/shacls/google-image-license-metadata.ttl +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/validation/shacls/google-job-posting.ttl +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/validation/shacls/google-local-business.ttl +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/validation/shacls/google-loyalty-program.ttl +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/validation/shacls/google-math-solvers.ttl +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/validation/shacls/google-movie.ttl +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/validation/shacls/google-organization.ttl +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/validation/shacls/google-paywalled-content.ttl +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/validation/shacls/google-product-variants.ttl +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/validation/shacls/google-return-policy.ttl +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/validation/shacls/google-review-snippet.ttl +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/validation/shacls/google-shipping-policy.ttl +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/validation/shacls/google-software-app.ttl +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/validation/shacls/google-speakable.ttl +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/validation/shacls/google-vacation-rental.ttl +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/validation/shacls/google-video.ttl +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/validation/shacls/schemaorg-grammar.ttl +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/wordlift/__init__.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/wordlift/entity_gaps/__init__.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/wordlift/entity_gaps/create_entity_gaps_factory.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/wordlift/entity_gaps/entity_gaps_callback.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/wordlift/sitemap_import/__init__.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/wordlift/sitemap_import/protocol/__init__.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/wordlift/sitemap_import/protocol/default/__init__.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/wordlift/sitemap_import/protocol/default/default_import_url_protocol.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/wordlift/sitemap_import/protocol/default/default_parse_html_protocol.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/wordlift/sitemap_import/protocol/import_url_protocol_interface.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/wordlift/sitemap_import/protocol/parse_html_protocol_interface.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/wordlift/sitemap_import/protocol/protocol_context.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/workflow/__init__.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/workflow/create_or_update_entities_factory.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/workflow/kg_import_workflow.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/workflow/patch_entities_factory.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/workflow/url_handler/__init__.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/workflow/url_handler/default_url_handler.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/workflow/url_handler/search_console_url_handler.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/workflow/url_handler/url_handler.py +0 -0
- {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/workflow/url_handler/web_page_import_url_handler.py +0 -0
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: wordlift-sdk
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.13.0
|
|
4
4
|
Summary:
|
|
5
5
|
Author: David Riccitelli
|
|
6
6
|
Author-email: david@wordlift.io
|
|
7
|
-
Requires-Python: >=3.10,<3.
|
|
7
|
+
Requires-Python: >=3.10,<3.15
|
|
8
8
|
Classifier: Programming Language :: Python :: 3
|
|
9
9
|
Classifier: Programming Language :: Python :: 3.10
|
|
10
10
|
Classifier: Programming Language :: Python :: 3.11
|
|
11
11
|
Classifier: Programming Language :: Python :: 3.12
|
|
12
12
|
Classifier: Programming Language :: Python :: 3.13
|
|
13
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
13
14
|
Requires-Dist: advertools (>0.16.6,<1.0.0)
|
|
14
15
|
Requires-Dist: aiohttp (>=3.10.5,<4.0.0)
|
|
15
16
|
Requires-Dist: google-auth (>=2.35.0,<3.0.0)
|
|
@@ -46,7 +47,7 @@ pip install wordlift-sdk
|
|
|
46
47
|
poetry add wordlift-sdk
|
|
47
48
|
```
|
|
48
49
|
|
|
49
|
-
Requires Python 3.10–3.
|
|
50
|
+
Requires Python 3.10–3.14.
|
|
50
51
|
|
|
51
52
|
## Configuration
|
|
52
53
|
|
|
@@ -120,7 +121,7 @@ Add `.ttl.liquid` files under `data/templates`. Templates render with `account`
|
|
|
120
121
|
|
|
121
122
|
## Validation
|
|
122
123
|
|
|
123
|
-
SHACL validation utilities and generated Google Search Gallery shapes are included.
|
|
124
|
+
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
125
|
|
|
125
126
|
## Testing
|
|
126
127
|
|
|
@@ -18,7 +18,7 @@ pip install wordlift-sdk
|
|
|
18
18
|
poetry add wordlift-sdk
|
|
19
19
|
```
|
|
20
20
|
|
|
21
|
-
Requires Python 3.10–3.
|
|
21
|
+
Requires Python 3.10–3.14.
|
|
22
22
|
|
|
23
23
|
## Configuration
|
|
24
24
|
|
|
@@ -92,7 +92,7 @@ Add `.ttl.liquid` files under `data/templates`. Templates render with `account`
|
|
|
92
92
|
|
|
93
93
|
## Validation
|
|
94
94
|
|
|
95
|
-
SHACL validation utilities and generated Google Search Gallery shapes are included.
|
|
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
96
|
|
|
97
97
|
## Testing
|
|
98
98
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[tool.poetry]
|
|
2
2
|
name = "wordlift-sdk"
|
|
3
|
-
version = "2.
|
|
3
|
+
version = "2.13.0"
|
|
4
4
|
description = ""
|
|
5
5
|
authors = ["David Riccitelli <david@wordlift.io>"]
|
|
6
6
|
readme = "README.md"
|
|
@@ -8,7 +8,7 @@ packages = [{ include = "wordlift_sdk" }]
|
|
|
8
8
|
include = ["wordlift_sdk/graphql/data/**"]
|
|
9
9
|
|
|
10
10
|
[tool.poetry.dependencies]
|
|
11
|
-
python = ">=3.10, <3.
|
|
11
|
+
python = ">=3.10, <3.15"
|
|
12
12
|
gql = { extras = ["aiohttp"], version = "^3.5.2" }
|
|
13
13
|
tenacity = "^9.0.0"
|
|
14
14
|
aiohttp = "^3.10.5"
|
|
@@ -169,13 +169,135 @@ 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
|
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
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)
|
|
179
301
|
|
|
180
302
|
lines: list[str] = []
|
|
181
303
|
slug = output_path.stem
|
|
@@ -186,7 +308,8 @@ def _write_feature(feature: FeatureData, output_path: Path, overwrite: bool) ->
|
|
|
186
308
|
lines.append("")
|
|
187
309
|
lines.append(f"# Source: {feature.url}")
|
|
188
310
|
lines.append(
|
|
189
|
-
|
|
311
|
+
"# Generated: "
|
|
312
|
+
f"{datetime.now(timezone.utc).isoformat(timespec='seconds').replace('+00:00', 'Z')}"
|
|
190
313
|
)
|
|
191
314
|
lines.append(
|
|
192
315
|
"# Notes: required properties => errors; recommended properties => warnings."
|
|
@@ -194,7 +317,7 @@ def _write_feature(feature: FeatureData, output_path: Path, overwrite: bool) ->
|
|
|
194
317
|
lines.append("")
|
|
195
318
|
|
|
196
319
|
for type_name in sorted(feature.types.keys()):
|
|
197
|
-
if
|
|
320
|
+
if type_name in scoped_types:
|
|
198
321
|
continue
|
|
199
322
|
bucket = feature.types[type_name]
|
|
200
323
|
shape_name = f":google_{type_name}Shape"
|
|
@@ -203,56 +326,28 @@ def _write_feature(feature: FeatureData, output_path: Path, overwrite: bool) ->
|
|
|
203
326
|
lines.append(f" sh:targetClass schema:{type_name} ;")
|
|
204
327
|
|
|
205
328
|
for prop in sorted(bucket["required"]):
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
lines.append(" sh:class schema:ListItem ;")
|
|
217
|
-
for item_prop in sorted(scoped_list_item["required"]):
|
|
218
|
-
item_path = _prop_path(item_prop)
|
|
219
|
-
lines.append(" sh:property [")
|
|
220
|
-
lines.append(f" sh:path {item_path} ;")
|
|
221
|
-
lines.append(" sh:minCount 1 ;")
|
|
222
|
-
lines.append(" ] ;")
|
|
223
|
-
for item_prop in sorted(scoped_list_item["recommended"]):
|
|
224
|
-
item_path = _prop_path(item_prop)
|
|
225
|
-
lines.append(" sh:property [")
|
|
226
|
-
lines.append(f" sh:path {item_path} ;")
|
|
227
|
-
lines.append(" sh:minCount 1 ;")
|
|
228
|
-
lines.append(" sh:severity sh:Warning ;")
|
|
229
|
-
lines.append(
|
|
230
|
-
f' sh:message "Recommended by Google: {item_prop}." ;'
|
|
231
|
-
)
|
|
232
|
-
lines.append(" ] ;")
|
|
233
|
-
lines.append(" ] ;")
|
|
234
|
-
lines.append(" ] ;")
|
|
235
|
-
continue
|
|
236
|
-
path = _prop_path(prop)
|
|
237
|
-
lines.append(" sh:property [")
|
|
238
|
-
lines.append(f" sh:path {path} ;")
|
|
239
|
-
lines.append(" sh:minCount 1 ;")
|
|
240
|
-
lines.append(" ] ;")
|
|
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
|
+
)
|
|
241
339
|
|
|
242
340
|
for prop in sorted(bucket["recommended"]):
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
lines.append(" sh:severity sh:Warning ;")
|
|
254
|
-
lines.append(f' sh:message "Recommended by Google: {prop}." ;')
|
|
255
|
-
lines.append(" ] ;")
|
|
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
|
+
)
|
|
256
351
|
|
|
257
352
|
lines.append(".")
|
|
258
353
|
lines.append("")
|
|
@@ -426,7 +521,8 @@ def generate_schema_shacls(output_file: Path, overwrite: bool) -> int:
|
|
|
426
521
|
lines.append("")
|
|
427
522
|
lines.append(f"# Source: {SCHEMA_JSONLD_URL}")
|
|
428
523
|
lines.append(
|
|
429
|
-
|
|
524
|
+
"# Generated: "
|
|
525
|
+
f"{datetime.now(timezone.utc).isoformat(timespec='seconds').replace('+00:00', 'Z')}"
|
|
430
526
|
)
|
|
431
527
|
lines.append(
|
|
432
528
|
"# Notes: schema.org grammar checks only; all constraints are warnings."
|
{wordlift_sdk-2.11.0 → wordlift_sdk-2.13.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
|
.
|
{wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/validation/shacls/google-carousel.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/carousel
|
|
6
|
-
# Generated: 2026-02-
|
|
6
|
+
# Generated: 2026-02-04T20:00:51Z
|
|
7
7
|
# Notes: required properties => errors; recommended properties => warnings.
|
|
8
8
|
|
|
9
9
|
:google_ItemListShape
|
{wordlift_sdk-2.11.0 → wordlift_sdk-2.13.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.11.0 → wordlift_sdk-2.13.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
|
+
.
|