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.
Files changed (171) hide show
  1. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/PKG-INFO +5 -2
  2. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/README.md +4 -1
  3. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/pyproject.toml +1 -1
  4. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/validation/generator.py +157 -15
  5. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/validation/shacls/google-breadcrumb.ttl +17 -18
  6. wordlift_sdk-2.12.0/wordlift_sdk/validation/shacls/google-carousel.ttl +40 -0
  7. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/validation/shacls/google-course.ttl +4 -4
  8. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/validation/shacls/google-education-qa.ttl +23 -24
  9. wordlift_sdk-2.12.0/wordlift_sdk/validation/shacls/google-faqpage.ttl +36 -0
  10. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/validation/shacls/google-merchant-listing.ttl +56 -57
  11. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/validation/shacls/google-product-snippet.ttl +37 -34
  12. wordlift_sdk-2.12.0/wordlift_sdk/validation/shacls/google-profile-page.ttl +130 -0
  13. wordlift_sdk-2.12.0/wordlift_sdk/validation/shacls/google-qapage.ttl +360 -0
  14. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/validation/shacls/google-recipe.ttl +42 -49
  15. wordlift_sdk-2.10.3/wordlift_sdk/validation/shacls/google-carousel.ttl +0 -37
  16. wordlift_sdk-2.10.3/wordlift_sdk/validation/shacls/google-faqpage.ttl +0 -38
  17. wordlift_sdk-2.10.3/wordlift_sdk/validation/shacls/google-profile-page.ttl +0 -130
  18. wordlift_sdk-2.10.3/wordlift_sdk/validation/shacls/google-qapage.ttl +0 -195
  19. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/__init__.py +0 -0
  20. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/client/__init__.py +0 -0
  21. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/client/client_configuration_factory.py +0 -0
  22. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/configuration/__init__.py +0 -0
  23. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/configuration/configuration_provider.py +0 -0
  24. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/configuration/get_config_value.py +0 -0
  25. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/container/__init__.py +0 -0
  26. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/container/application_container.py +0 -0
  27. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/deprecated/__init__.py +0 -0
  28. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/deprecated/create_entities_with_top_query_dataframe.py +0 -0
  29. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/entity/__init__.py +0 -0
  30. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/entity/enrich.py +0 -0
  31. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/entity/patch.py +0 -0
  32. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/google_search_console/__init__.py +0 -0
  33. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/google_search_console/create_google_search_console_data_import.py +0 -0
  34. {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
  35. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/google_sheets/__init__.py +0 -0
  36. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/google_sheets/google_sheets_lookup.py +0 -0
  37. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/graph/graph_bag.py +0 -0
  38. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/graph/ttl_liquid/__init__.py +0 -0
  39. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/graph/ttl_liquid/ttl_liquid_graph_factory.py +0 -0
  40. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/graphql/__init__.py +0 -0
  41. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/graphql/client/__init__.py +0 -0
  42. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/graphql/client/client.py +0 -0
  43. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/graphql/client/factory.py +0 -0
  44. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/graphql/client/gql_client_provider.py +0 -0
  45. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/graphql/data/entities_by_type.graphql +0 -0
  46. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/graphql/data/entities_embedding_value.graphql +0 -0
  47. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/graphql/data/entities_top_query.graphql +0 -0
  48. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/graphql/data/entities_url_id.graphql +0 -0
  49. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/graphql/data/entities_url_iri.graphql +0 -0
  50. {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
  51. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/graphql/query.py +0 -0
  52. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/graphql/utils/__init__.py +0 -0
  53. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/graphql/utils/query/__init__.py +0 -0
  54. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/graphql/utils/query/entity_top_query.py +0 -0
  55. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/graphql/utils/query/entity_with_top_query.py +0 -0
  56. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/id_generator/__init__.py +0 -0
  57. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/id_generator/id_generator.py +0 -0
  58. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/id_generator/id_generator_interface.py +0 -0
  59. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/internal_link/__init__.py +0 -0
  60. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/internal_link/utils.py +0 -0
  61. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/kg/__init__.py +0 -0
  62. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/kg/entity.py +0 -0
  63. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/kg/entity_store.py +0 -0
  64. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/kg/entity_store_factory.py +0 -0
  65. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/kg/relation/__init__.py +0 -0
  66. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/kg/relation/relation_service.py +0 -0
  67. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/main.py +0 -0
  68. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/namespace/SDO.py +0 -0
  69. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/namespace/__init__.py +0 -0
  70. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/notebook/__init__.py +0 -0
  71. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/notebook/install_if_missing.py +0 -0
  72. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/protocol/__init__.py +0 -0
  73. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/protocol/context.py +0 -0
  74. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/protocol/entity_patch/__init__.py +0 -0
  75. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/protocol/entity_patch/entity_patch.py +0 -0
  76. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/protocol/entity_patch/entity_patch_queue.py +0 -0
  77. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/protocol/graph/__init__.py +0 -0
  78. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/protocol/graph/graph_queue.py +0 -0
  79. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/protocol/load_override_class.py +0 -0
  80. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/protocol/web_page_import_protocol.py +0 -0
  81. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/render/__init__.py +0 -0
  82. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/render/browser.py +0 -0
  83. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/render/cleanup_options.py +0 -0
  84. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/render/html_renderer.py +0 -0
  85. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/render/render_options.py +0 -0
  86. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/render/rendered_page.py +0 -0
  87. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/render/xhtml_cleaner.py +0 -0
  88. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/structured_data/__init__.py +0 -0
  89. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/structured_data/agent.py +0 -0
  90. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/structured_data/agent_generator.py +0 -0
  91. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/structured_data/batch.py +0 -0
  92. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/structured_data/constants.py +0 -0
  93. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/structured_data/dataset_resolver.py +0 -0
  94. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/structured_data/debug.py +0 -0
  95. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/structured_data/engine.py +0 -0
  96. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/structured_data/inputs.py +0 -0
  97. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/structured_data/io.py +0 -0
  98. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/structured_data/materialization.py +0 -0
  99. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/structured_data/models.py +0 -0
  100. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/structured_data/orchestrator.py +0 -0
  101. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/structured_data/rendering.py +0 -0
  102. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/structured_data/schema_guide.py +0 -0
  103. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/structured_data/structured_data_engine.py +0 -0
  104. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/structured_data/validation.py +0 -0
  105. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/structured_data/yarrrml_pipeline.py +0 -0
  106. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/url_source/__init__.py +0 -0
  107. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/url_source/google_sheets_url_source.py +0 -0
  108. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/url_source/list_url_source.py +0 -0
  109. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/url_source/new_or_changed_url_source.py +0 -0
  110. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/url_source/sitemap_url_source.py +0 -0
  111. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/url_source/url_source.py +0 -0
  112. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/url_source/url_source_input.py +0 -0
  113. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/utils/__init__.py +0 -0
  114. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/utils/create_dataframe_from_google_sheets.py +0 -0
  115. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/utils/create_dataframe_of_entities_by_types.py +0 -0
  116. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/utils/create_dataframe_of_entities_with_embedding_vectors.py +0 -0
  117. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/utils/create_dataframe_of_url_iri.py +0 -0
  118. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/utils/create_entity_patch_request.py +0 -0
  119. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/utils/delayed.py +0 -0
  120. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/utils/get_me.py +0 -0
  121. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/utils/html_converter.py +0 -0
  122. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/utils/import_url.py +0 -0
  123. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/validation/__init__.py +0 -0
  124. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/validation/shacl.py +0 -0
  125. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/validation/shacls/__init__.py +0 -0
  126. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/validation/shacls/google-article.ttl +0 -0
  127. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/validation/shacls/google-book.ttl +0 -0
  128. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/validation/shacls/google-carousels-beta.ttl +0 -0
  129. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/validation/shacls/google-dataset.ttl +0 -0
  130. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/validation/shacls/google-discussion-forum.ttl +0 -0
  131. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/validation/shacls/google-employer-rating.ttl +0 -0
  132. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/validation/shacls/google-event.ttl +0 -0
  133. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/validation/shacls/google-factcheck.ttl +0 -0
  134. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/validation/shacls/google-image-license-metadata.ttl +0 -0
  135. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/validation/shacls/google-job-posting.ttl +0 -0
  136. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/validation/shacls/google-local-business.ttl +0 -0
  137. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/validation/shacls/google-loyalty-program.ttl +0 -0
  138. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/validation/shacls/google-math-solvers.ttl +0 -0
  139. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/validation/shacls/google-movie.ttl +0 -0
  140. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/validation/shacls/google-organization.ttl +0 -0
  141. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/validation/shacls/google-paywalled-content.ttl +0 -0
  142. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/validation/shacls/google-product-variants.ttl +0 -0
  143. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/validation/shacls/google-return-policy.ttl +0 -0
  144. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/validation/shacls/google-review-snippet.ttl +0 -0
  145. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/validation/shacls/google-shipping-policy.ttl +0 -0
  146. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/validation/shacls/google-software-app.ttl +0 -0
  147. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/validation/shacls/google-speakable.ttl +0 -0
  148. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/validation/shacls/google-vacation-rental.ttl +0 -0
  149. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/validation/shacls/google-video.ttl +0 -0
  150. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/validation/shacls/schemaorg-grammar.ttl +0 -0
  151. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/wordlift/__init__.py +0 -0
  152. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/wordlift/entity_gaps/__init__.py +0 -0
  153. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/wordlift/entity_gaps/create_entity_gaps_factory.py +0 -0
  154. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/wordlift/entity_gaps/entity_gaps_callback.py +0 -0
  155. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/wordlift/sitemap_import/__init__.py +0 -0
  156. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/wordlift/sitemap_import/protocol/__init__.py +0 -0
  157. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/wordlift/sitemap_import/protocol/default/__init__.py +0 -0
  158. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/wordlift/sitemap_import/protocol/default/default_import_url_protocol.py +0 -0
  159. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/wordlift/sitemap_import/protocol/default/default_parse_html_protocol.py +0 -0
  160. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/wordlift/sitemap_import/protocol/import_url_protocol_interface.py +0 -0
  161. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/wordlift/sitemap_import/protocol/parse_html_protocol_interface.py +0 -0
  162. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/wordlift/sitemap_import/protocol/protocol_context.py +0 -0
  163. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/workflow/__init__.py +0 -0
  164. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/workflow/create_or_update_entities_factory.py +0 -0
  165. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/workflow/kg_import_workflow.py +0 -0
  166. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/workflow/patch_entities_factory.py +0 -0
  167. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/workflow/url_handler/__init__.py +0 -0
  168. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/workflow/url_handler/default_url_handler.py +0 -0
  169. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/workflow/url_handler/search_console_url_handler.py +0 -0
  170. {wordlift_sdk-2.10.3 → wordlift_sdk-2.12.0}/wordlift_sdk/workflow/url_handler/url_handler.py +0 -0
  171. {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.10.3
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
-
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "wordlift-sdk"
3
- version = "2.10.3"
3
+ version = "2.12.0"
4
4
  description = ""
5
5
  authors = ["David Riccitelli <david@wordlift.io>"]
6
6
  readme = "README.md"
@@ -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(f"# Generated: {datetime.utcnow().isoformat(timespec='seconds')}Z")
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
- path = _prop_path(prop)
199
- lines.append(" sh:property [")
200
- lines.append(f" sh:path {path} ;")
201
- lines.append(" sh:minCount 1 ;")
202
- 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
+ )
203
339
 
204
340
  for prop in sorted(bucket["recommended"]):
205
- path = _prop_path(prop)
206
- lines.append(" sh:property [")
207
- lines.append(f" sh:path {path} ;")
208
- lines.append(" sh:minCount 1 ;")
209
- lines.append(" sh:severity sh:Warning ;")
210
- lines.append(f' sh:message "Recommended by Google: {prop}." ;')
211
- 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
+ )
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(f"# Generated: {datetime.utcnow().isoformat(timespec='seconds')}Z")
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
  )
@@ -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-01-13T11:23:15Z
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
- :google_ListItemShape
19
- a sh:NodeShape ;
20
- sh:targetClass schema:ListItem ;
21
- sh:property [
22
- sh:path schema:item ;
23
- sh:minCount 1 ;
24
- ] ;
25
- sh:property [
26
- sh:path schema:name ;
27
- sh:minCount 1 ;
28
- ] ;
29
- sh:property [
30
- sh:path schema:position ;
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
+ .
@@ -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-01-13T11:23:18Z
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:itemListElement ;
32
+ sh:path ( schema:ListItem schema:position ) ;
33
33
  sh:minCount 1 ;
34
34
  ] ;
35
35
  sh:property [
36
- sh:path schema:position ;
36
+ sh:path ( schema:ListItem schema:url ) ;
37
37
  sh:minCount 1 ;
38
38
  ] ;
39
39
  sh:property [
40
- sh:path schema:url ;
40
+ sh:path schema:itemListElement ;
41
41
  sh:minCount 1 ;
42
42
  ] ;
43
43
  .
@@ -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-01-13T11:23:22Z
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:alignmentType ;
51
+ sh:path ( schema:about schema:name ) ;
53
52
  sh:minCount 1 ;
54
53
  sh:severity sh:Warning ;
55
- sh:message "Recommended by Google: alignmentType." ;
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:name ;
63
+ sh:path ( schema:educationalAlignment schema:alignmentType ) ;
65
64
  sh:minCount 1 ;
66
65
  sh:severity sh:Warning ;
67
- sh:message "Recommended by Google: name." ;
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-01-13T11:23:41Z
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:contentUrl ;
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:value ;
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 ;