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.
Files changed (170) hide show
  1. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/PKG-INFO +5 -4
  2. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/README.md +2 -2
  3. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/pyproject.toml +2 -2
  4. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/validation/generator.py +150 -54
  5. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/validation/shacls/google-breadcrumb.ttl +17 -18
  6. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/validation/shacls/google-carousel.ttl +1 -1
  7. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/validation/shacls/google-course.ttl +4 -4
  8. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/validation/shacls/google-education-qa.ttl +23 -24
  9. wordlift_sdk-2.13.0/wordlift_sdk/validation/shacls/google-faqpage.ttl +36 -0
  10. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/validation/shacls/google-merchant-listing.ttl +56 -57
  11. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/validation/shacls/google-product-snippet.ttl +37 -34
  12. wordlift_sdk-2.13.0/wordlift_sdk/validation/shacls/google-profile-page.ttl +130 -0
  13. wordlift_sdk-2.13.0/wordlift_sdk/validation/shacls/google-qapage.ttl +360 -0
  14. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/validation/shacls/google-recipe.ttl +42 -49
  15. wordlift_sdk-2.11.0/wordlift_sdk/validation/shacls/google-faqpage.ttl +0 -38
  16. wordlift_sdk-2.11.0/wordlift_sdk/validation/shacls/google-profile-page.ttl +0 -130
  17. wordlift_sdk-2.11.0/wordlift_sdk/validation/shacls/google-qapage.ttl +0 -195
  18. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/__init__.py +0 -0
  19. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/client/__init__.py +0 -0
  20. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/client/client_configuration_factory.py +0 -0
  21. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/configuration/__init__.py +0 -0
  22. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/configuration/configuration_provider.py +0 -0
  23. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/configuration/get_config_value.py +0 -0
  24. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/container/__init__.py +0 -0
  25. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/container/application_container.py +0 -0
  26. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/deprecated/__init__.py +0 -0
  27. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/deprecated/create_entities_with_top_query_dataframe.py +0 -0
  28. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/entity/__init__.py +0 -0
  29. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/entity/enrich.py +0 -0
  30. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/entity/patch.py +0 -0
  31. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/google_search_console/__init__.py +0 -0
  32. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/google_search_console/create_google_search_console_data_import.py +0 -0
  33. {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
  34. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/google_sheets/__init__.py +0 -0
  35. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/google_sheets/google_sheets_lookup.py +0 -0
  36. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/graph/graph_bag.py +0 -0
  37. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/graph/ttl_liquid/__init__.py +0 -0
  38. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/graph/ttl_liquid/ttl_liquid_graph_factory.py +0 -0
  39. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/graphql/__init__.py +0 -0
  40. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/graphql/client/__init__.py +0 -0
  41. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/graphql/client/client.py +0 -0
  42. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/graphql/client/factory.py +0 -0
  43. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/graphql/client/gql_client_provider.py +0 -0
  44. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/graphql/data/entities_by_type.graphql +0 -0
  45. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/graphql/data/entities_embedding_value.graphql +0 -0
  46. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/graphql/data/entities_top_query.graphql +0 -0
  47. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/graphql/data/entities_url_id.graphql +0 -0
  48. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/graphql/data/entities_url_iri.graphql +0 -0
  49. {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
  50. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/graphql/query.py +0 -0
  51. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/graphql/utils/__init__.py +0 -0
  52. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/graphql/utils/query/__init__.py +0 -0
  53. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/graphql/utils/query/entity_top_query.py +0 -0
  54. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/graphql/utils/query/entity_with_top_query.py +0 -0
  55. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/id_generator/__init__.py +0 -0
  56. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/id_generator/id_generator.py +0 -0
  57. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/id_generator/id_generator_interface.py +0 -0
  58. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/internal_link/__init__.py +0 -0
  59. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/internal_link/utils.py +0 -0
  60. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/kg/__init__.py +0 -0
  61. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/kg/entity.py +0 -0
  62. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/kg/entity_store.py +0 -0
  63. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/kg/entity_store_factory.py +0 -0
  64. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/kg/relation/__init__.py +0 -0
  65. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/kg/relation/relation_service.py +0 -0
  66. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/main.py +0 -0
  67. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/namespace/SDO.py +0 -0
  68. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/namespace/__init__.py +0 -0
  69. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/notebook/__init__.py +0 -0
  70. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/notebook/install_if_missing.py +0 -0
  71. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/protocol/__init__.py +0 -0
  72. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/protocol/context.py +0 -0
  73. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/protocol/entity_patch/__init__.py +0 -0
  74. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/protocol/entity_patch/entity_patch.py +0 -0
  75. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/protocol/entity_patch/entity_patch_queue.py +0 -0
  76. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/protocol/graph/__init__.py +0 -0
  77. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/protocol/graph/graph_queue.py +0 -0
  78. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/protocol/load_override_class.py +0 -0
  79. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/protocol/web_page_import_protocol.py +0 -0
  80. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/render/__init__.py +0 -0
  81. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/render/browser.py +0 -0
  82. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/render/cleanup_options.py +0 -0
  83. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/render/html_renderer.py +0 -0
  84. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/render/render_options.py +0 -0
  85. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/render/rendered_page.py +0 -0
  86. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/render/xhtml_cleaner.py +0 -0
  87. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/structured_data/__init__.py +0 -0
  88. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/structured_data/agent.py +0 -0
  89. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/structured_data/agent_generator.py +0 -0
  90. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/structured_data/batch.py +0 -0
  91. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/structured_data/constants.py +0 -0
  92. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/structured_data/dataset_resolver.py +0 -0
  93. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/structured_data/debug.py +0 -0
  94. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/structured_data/engine.py +0 -0
  95. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/structured_data/inputs.py +0 -0
  96. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/structured_data/io.py +0 -0
  97. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/structured_data/materialization.py +0 -0
  98. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/structured_data/models.py +0 -0
  99. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/structured_data/orchestrator.py +0 -0
  100. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/structured_data/rendering.py +0 -0
  101. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/structured_data/schema_guide.py +0 -0
  102. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/structured_data/structured_data_engine.py +0 -0
  103. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/structured_data/validation.py +0 -0
  104. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/structured_data/yarrrml_pipeline.py +0 -0
  105. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/url_source/__init__.py +0 -0
  106. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/url_source/google_sheets_url_source.py +0 -0
  107. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/url_source/list_url_source.py +0 -0
  108. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/url_source/new_or_changed_url_source.py +0 -0
  109. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/url_source/sitemap_url_source.py +0 -0
  110. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/url_source/url_source.py +0 -0
  111. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/url_source/url_source_input.py +0 -0
  112. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/utils/__init__.py +0 -0
  113. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/utils/create_dataframe_from_google_sheets.py +0 -0
  114. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/utils/create_dataframe_of_entities_by_types.py +0 -0
  115. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/utils/create_dataframe_of_entities_with_embedding_vectors.py +0 -0
  116. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/utils/create_dataframe_of_url_iri.py +0 -0
  117. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/utils/create_entity_patch_request.py +0 -0
  118. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/utils/delayed.py +0 -0
  119. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/utils/get_me.py +0 -0
  120. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/utils/html_converter.py +0 -0
  121. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/utils/import_url.py +0 -0
  122. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/validation/__init__.py +0 -0
  123. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/validation/shacl.py +0 -0
  124. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/validation/shacls/__init__.py +0 -0
  125. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/validation/shacls/google-article.ttl +0 -0
  126. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/validation/shacls/google-book.ttl +0 -0
  127. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/validation/shacls/google-carousels-beta.ttl +0 -0
  128. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/validation/shacls/google-dataset.ttl +0 -0
  129. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/validation/shacls/google-discussion-forum.ttl +0 -0
  130. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/validation/shacls/google-employer-rating.ttl +0 -0
  131. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/validation/shacls/google-event.ttl +0 -0
  132. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/validation/shacls/google-factcheck.ttl +0 -0
  133. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/validation/shacls/google-image-license-metadata.ttl +0 -0
  134. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/validation/shacls/google-job-posting.ttl +0 -0
  135. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/validation/shacls/google-local-business.ttl +0 -0
  136. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/validation/shacls/google-loyalty-program.ttl +0 -0
  137. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/validation/shacls/google-math-solvers.ttl +0 -0
  138. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/validation/shacls/google-movie.ttl +0 -0
  139. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/validation/shacls/google-organization.ttl +0 -0
  140. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/validation/shacls/google-paywalled-content.ttl +0 -0
  141. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/validation/shacls/google-product-variants.ttl +0 -0
  142. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/validation/shacls/google-return-policy.ttl +0 -0
  143. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/validation/shacls/google-review-snippet.ttl +0 -0
  144. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/validation/shacls/google-shipping-policy.ttl +0 -0
  145. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/validation/shacls/google-software-app.ttl +0 -0
  146. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/validation/shacls/google-speakable.ttl +0 -0
  147. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/validation/shacls/google-vacation-rental.ttl +0 -0
  148. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/validation/shacls/google-video.ttl +0 -0
  149. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/validation/shacls/schemaorg-grammar.ttl +0 -0
  150. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/wordlift/__init__.py +0 -0
  151. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/wordlift/entity_gaps/__init__.py +0 -0
  152. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/wordlift/entity_gaps/create_entity_gaps_factory.py +0 -0
  153. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/wordlift/entity_gaps/entity_gaps_callback.py +0 -0
  154. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/wordlift/sitemap_import/__init__.py +0 -0
  155. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/wordlift/sitemap_import/protocol/__init__.py +0 -0
  156. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/wordlift/sitemap_import/protocol/default/__init__.py +0 -0
  157. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/wordlift/sitemap_import/protocol/default/default_import_url_protocol.py +0 -0
  158. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/wordlift/sitemap_import/protocol/default/default_parse_html_protocol.py +0 -0
  159. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/wordlift/sitemap_import/protocol/import_url_protocol_interface.py +0 -0
  160. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/wordlift/sitemap_import/protocol/parse_html_protocol_interface.py +0 -0
  161. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/wordlift/sitemap_import/protocol/protocol_context.py +0 -0
  162. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/workflow/__init__.py +0 -0
  163. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/workflow/create_or_update_entities_factory.py +0 -0
  164. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/workflow/kg_import_workflow.py +0 -0
  165. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/workflow/patch_entities_factory.py +0 -0
  166. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/workflow/url_handler/__init__.py +0 -0
  167. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/workflow/url_handler/default_url_handler.py +0 -0
  168. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/workflow/url_handler/search_console_url_handler.py +0 -0
  169. {wordlift_sdk-2.11.0 → wordlift_sdk-2.13.0}/wordlift_sdk/workflow/url_handler/url_handler.py +0 -0
  170. {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.11.0
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.14
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.13.
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. Carousel `ListItem` requirements are scoped under `ItemList` when both types are present to avoid enforcing carousel constraints on non-carousel lists (for example, `BreadcrumbList`).
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.13.
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. Carousel `ListItem` requirements are scoped under `ItemList` when both types are present to avoid enforcing carousel constraints on non-carousel lists (for example, `BreadcrumbList`).
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.11.0"
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.14"
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
- scoped_list_item = None
177
- if "ItemList" in feature.types and "ListItem" in feature.types:
178
- scoped_list_item = feature.types["ListItem"]
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
- f"# Generated: {datetime.now(timezone.utc).isoformat(timespec='seconds')}Z"
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 scoped_list_item and type_name == "ListItem":
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
- if (
207
- scoped_list_item
208
- and type_name == "ItemList"
209
- and prop == "itemListElement"
210
- ):
211
- lines.append(" sh:property [")
212
- lines.append(" sh:path schema:itemListElement ;")
213
- lines.append(" sh:minCount 1 ;")
214
- lines.append(" sh:node [")
215
- lines.append(" a sh:NodeShape ;")
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
- if (
244
- scoped_list_item
245
- and type_name == "ItemList"
246
- and prop == "itemListElement"
247
- ):
248
- continue
249
- path = _prop_path(prop)
250
- lines.append(" sh:property [")
251
- lines.append(f" sh:path {path} ;")
252
- lines.append(" sh:minCount 1 ;")
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
- f"# Generated: {datetime.now(timezone.utc).isoformat(timespec='seconds')}Z"
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."
@@ -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
  .
@@ -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-04T18:12:24+00:00Z
6
+ # Generated: 2026-02-04T20:00:51Z
7
7
  # Notes: required properties => errors; recommended properties => warnings.
8
8
 
9
9
  :google_ItemListShape
@@ -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
+ .