linked_rails 0.0.1

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 (207) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +674 -0
  3. data/README.md +65 -0
  4. data/Rakefile +34 -0
  5. data/app/controllers/linked_rails/actions/items_controller.rb +9 -0
  6. data/app/controllers/linked_rails/bulk_controller.rb +195 -0
  7. data/app/controllers/linked_rails/current_user_controller.rb +13 -0
  8. data/app/controllers/linked_rails/enum_values_controller.rb +49 -0
  9. data/app/controllers/linked_rails/forms_controller.rb +13 -0
  10. data/app/controllers/linked_rails/manifests_controller.rb +21 -0
  11. data/app/controllers/linked_rails/menus/items_controller.rb +9 -0
  12. data/app/controllers/linked_rails/menus/lists_controller.rb +9 -0
  13. data/app/controllers/linked_rails/not_found_controller.rb +15 -0
  14. data/app/controllers/linked_rails/ontologies_controller.rb +7 -0
  15. data/app/models/linked_rails/actions/default_actions/create.rb +60 -0
  16. data/app/models/linked_rails/actions/default_actions/destroy.rb +45 -0
  17. data/app/models/linked_rails/actions/default_actions/update.rb +50 -0
  18. data/app/models/linked_rails/actions/default_actions.rb +17 -0
  19. data/app/models/linked_rails/actions/item.rb +234 -0
  20. data/app/models/linked_rails/actions/list.rb +113 -0
  21. data/app/models/linked_rails/collection/filter.rb +16 -0
  22. data/app/models/linked_rails/collection/filter_field.rb +30 -0
  23. data/app/models/linked_rails/collection/filter_option.rb +17 -0
  24. data/app/models/linked_rails/collection/filterable.rb +92 -0
  25. data/app/models/linked_rails/collection/infinite_view.rb +98 -0
  26. data/app/models/linked_rails/collection/iri.rb +74 -0
  27. data/app/models/linked_rails/collection/iri_mapping.rb +33 -0
  28. data/app/models/linked_rails/collection/paginated_view.rb +41 -0
  29. data/app/models/linked_rails/collection/sortable.rb +60 -0
  30. data/app/models/linked_rails/collection/sorting.rb +72 -0
  31. data/app/models/linked_rails/collection/view.rb +101 -0
  32. data/app/models/linked_rails/collection.rb +220 -0
  33. data/app/models/linked_rails/condition.rb +7 -0
  34. data/app/models/linked_rails/creative_work.rb +21 -0
  35. data/app/models/linked_rails/current_user.rb +28 -0
  36. data/app/models/linked_rails/entry_point.rb +53 -0
  37. data/app/models/linked_rails/enum_value.rb +33 -0
  38. data/app/models/linked_rails/form/field/association_input.rb +23 -0
  39. data/app/models/linked_rails/form/field/checkbox_group.rb +10 -0
  40. data/app/models/linked_rails/form/field/checkbox_input.rb +10 -0
  41. data/app/models/linked_rails/form/field/color_input.rb +17 -0
  42. data/app/models/linked_rails/form/field/date_input.rb +10 -0
  43. data/app/models/linked_rails/form/field/date_time_input.rb +10 -0
  44. data/app/models/linked_rails/form/field/email_input.rb +10 -0
  45. data/app/models/linked_rails/form/field/file_input.rb +10 -0
  46. data/app/models/linked_rails/form/field/location_input.rb +11 -0
  47. data/app/models/linked_rails/form/field/markdown_input.rb +10 -0
  48. data/app/models/linked_rails/form/field/number_input.rb +10 -0
  49. data/app/models/linked_rails/form/field/password_input.rb +10 -0
  50. data/app/models/linked_rails/form/field/postal_range_input.rb +10 -0
  51. data/app/models/linked_rails/form/field/radio_group.rb +10 -0
  52. data/app/models/linked_rails/form/field/resource_field.rb +23 -0
  53. data/app/models/linked_rails/form/field/select_input.rb +11 -0
  54. data/app/models/linked_rails/form/field/slider_input.rb +10 -0
  55. data/app/models/linked_rails/form/field/text_area_input.rb +10 -0
  56. data/app/models/linked_rails/form/field/text_input.rb +10 -0
  57. data/app/models/linked_rails/form/field/toggle_button_group.rb +10 -0
  58. data/app/models/linked_rails/form/field.rb +117 -0
  59. data/app/models/linked_rails/form/field_factory.rb +219 -0
  60. data/app/models/linked_rails/form/group.rb +39 -0
  61. data/app/models/linked_rails/form/page.rb +31 -0
  62. data/app/models/linked_rails/form.rb +156 -0
  63. data/app/models/linked_rails/manifest.rb +102 -0
  64. data/app/models/linked_rails/media_object.rb +31 -0
  65. data/app/models/linked_rails/menus/item.rb +92 -0
  66. data/app/models/linked_rails/menus/list.rb +138 -0
  67. data/app/models/linked_rails/ontology/base.rb +50 -0
  68. data/app/models/linked_rails/ontology/class.rb +43 -0
  69. data/app/models/linked_rails/ontology/property.rb +19 -0
  70. data/app/models/linked_rails/ontology.rb +34 -0
  71. data/app/models/linked_rails/property_query.rb +11 -0
  72. data/app/models/linked_rails/resource.rb +17 -0
  73. data/app/models/linked_rails/sequence.rb +64 -0
  74. data/app/models/linked_rails/shacl/node_shape.rb +21 -0
  75. data/app/models/linked_rails/shacl/property_shape.rb +53 -0
  76. data/app/models/linked_rails/shacl/shape.rb +33 -0
  77. data/app/models/linked_rails/web_page.rb +22 -0
  78. data/app/models/linked_rails/web_site.rb +17 -0
  79. data/app/models/linked_rails/widget.rb +55 -0
  80. data/app/policies/linked_rails/actions/item_policy.rb +11 -0
  81. data/app/policies/linked_rails/actions/list_policy.rb +11 -0
  82. data/app/policies/linked_rails/collection/view_policy.rb +13 -0
  83. data/app/policies/linked_rails/collection_policy.rb +41 -0
  84. data/app/policies/linked_rails/enum_value_policy.rb +32 -0
  85. data/app/policies/linked_rails/menus/item_policy.rb +11 -0
  86. data/app/policies/linked_rails/menus/list_policy.rb +11 -0
  87. data/app/policies/linked_rails/sequence_policy.rb +9 -0
  88. data/app/serializers/linked_rails/actions/item_serializer.rb +28 -0
  89. data/app/serializers/linked_rails/collection/filter_field_serializer.rb +12 -0
  90. data/app/serializers/linked_rails/collection/filter_option_serializer.rb +12 -0
  91. data/app/serializers/linked_rails/collection/filter_serializer.rb +13 -0
  92. data/app/serializers/linked_rails/collection/sorting_serializer.rb +13 -0
  93. data/app/serializers/linked_rails/collection/view_serializer.rb +22 -0
  94. data/app/serializers/linked_rails/collection_serializer.rb +44 -0
  95. data/app/serializers/linked_rails/condition_serializer.rb +9 -0
  96. data/app/serializers/linked_rails/creative_work_serializer.rb +10 -0
  97. data/app/serializers/linked_rails/current_user_serializer.rb +7 -0
  98. data/app/serializers/linked_rails/entry_point_serializer.rb +20 -0
  99. data/app/serializers/linked_rails/enum_value_serializer.rb +12 -0
  100. data/app/serializers/linked_rails/form/field/association_input_serializer.rb +13 -0
  101. data/app/serializers/linked_rails/form/field/resource_field_serializer.rb +11 -0
  102. data/app/serializers/linked_rails/form/field/select_input_serializer.rb +11 -0
  103. data/app/serializers/linked_rails/form/field_serializer.rb +39 -0
  104. data/app/serializers/linked_rails/form/group_serializer.rb +14 -0
  105. data/app/serializers/linked_rails/form/page_serializer.rb +13 -0
  106. data/app/serializers/linked_rails/form_serializer.rb +9 -0
  107. data/app/serializers/linked_rails/media_object_serializer.rb +17 -0
  108. data/app/serializers/linked_rails/menus/item_serializer.rb +35 -0
  109. data/app/serializers/linked_rails/menus/list_serializer.rb +13 -0
  110. data/app/serializers/linked_rails/ontology/class_serializer.rb +19 -0
  111. data/app/serializers/linked_rails/ontology/property_serializer.rb +16 -0
  112. data/app/serializers/linked_rails/ontology_serializer.rb +8 -0
  113. data/app/serializers/linked_rails/rdf_error_serializer.rb +8 -0
  114. data/app/serializers/linked_rails/sequence_serializer.rb +14 -0
  115. data/app/serializers/linked_rails/shacl/node_shape_serializer.rb +12 -0
  116. data/app/serializers/linked_rails/shacl/property_shape_serializer.rb +38 -0
  117. data/app/serializers/linked_rails/shacl/shape_serializer.rb +25 -0
  118. data/app/serializers/linked_rails/web_page_serializer.rb +10 -0
  119. data/app/serializers/linked_rails/web_site_serializer.rb +11 -0
  120. data/app/serializers/linked_rails/widget_serializer.rb +15 -0
  121. data/config/initializers/inflections.rb +5 -0
  122. data/lib/generators/linked_rails/install/install_generator.rb +65 -0
  123. data/lib/generators/linked_rails/install/templates/app_menu_list.rb +41 -0
  124. data/lib/generators/linked_rails/install/templates/application_action_list.rb +3 -0
  125. data/lib/generators/linked_rails/install/templates/application_form.rb +3 -0
  126. data/lib/generators/linked_rails/install/templates/application_menu_list.rb +3 -0
  127. data/lib/generators/linked_rails/install/templates/application_policy.rb +18 -0
  128. data/lib/generators/linked_rails/install/templates/application_serializer.rb +5 -0
  129. data/lib/generators/linked_rails/install/templates/initializer.rb +9 -0
  130. data/lib/generators/linked_rails/install/templates/locales.yml +12 -0
  131. data/lib/generators/linked_rails/install/templates/rdf_responder.rb +5 -0
  132. data/lib/generators/linked_rails/install/templates/rdf_serializers_initializer.rb +5 -0
  133. data/lib/generators/linked_rails/install/templates/vocab.rb +5 -0
  134. data/lib/generators/linked_rails/install/templates/vocab.yml +26 -0
  135. data/lib/generators/linked_rails/model/model_generator.rb +58 -0
  136. data/lib/generators/linked_rails/model/templates/action_list.rb.tt +6 -0
  137. data/lib/generators/linked_rails/model/templates/controller.rb.tt +7 -0
  138. data/lib/generators/linked_rails/model/templates/create_table_migration.rb.tt +24 -0
  139. data/lib/generators/linked_rails/model/templates/form.rb.tt +6 -0
  140. data/lib/generators/linked_rails/model/templates/menu_list.rb.tt +6 -0
  141. data/lib/generators/linked_rails/model/templates/model.rb.tt +15 -0
  142. data/lib/generators/linked_rails/model/templates/module.rb.tt +7 -0
  143. data/lib/generators/linked_rails/model/templates/policy.rb.tt +6 -0
  144. data/lib/generators/linked_rails/model/templates/serializer.rb.tt +9 -0
  145. data/lib/linked_rails/active_response/controller/collections.rb +43 -0
  146. data/lib/linked_rails/active_response/controller/crud_defaults.rb +92 -0
  147. data/lib/linked_rails/active_response/controller/params.rb +51 -0
  148. data/lib/linked_rails/active_response/controller.rb +37 -0
  149. data/lib/linked_rails/active_response/responders/rdf.rb +158 -0
  150. data/lib/linked_rails/cache.rb +35 -0
  151. data/lib/linked_rails/callable_variable.rb +25 -0
  152. data/lib/linked_rails/constraints/whitelist.rb +36 -0
  153. data/lib/linked_rails/controller/authorization.rb +15 -0
  154. data/lib/linked_rails/controller/error_handling.rb +76 -0
  155. data/lib/linked_rails/controller.rb +43 -0
  156. data/lib/linked_rails/engine.rb +7 -0
  157. data/lib/linked_rails/enhanceable.rb +21 -0
  158. data/lib/linked_rails/enhancements/actionable/model.rb +71 -0
  159. data/lib/linked_rails/enhancements/actionable/serializer.rb +25 -0
  160. data/lib/linked_rails/enhancements/creatable/action.rb +15 -0
  161. data/lib/linked_rails/enhancements/creatable/controller.rb +15 -0
  162. data/lib/linked_rails/enhancements/destroyable/action.rb +15 -0
  163. data/lib/linked_rails/enhancements/destroyable/controller.rb +15 -0
  164. data/lib/linked_rails/enhancements/destroyable/routing.rb +19 -0
  165. data/lib/linked_rails/enhancements/indexable/model.rb +10 -0
  166. data/lib/linked_rails/enhancements/menuable/model.rb +36 -0
  167. data/lib/linked_rails/enhancements/menuable/serializer.rb +33 -0
  168. data/lib/linked_rails/enhancements/route_concerns.rb +56 -0
  169. data/lib/linked_rails/enhancements/singularable/controller.rb +43 -0
  170. data/lib/linked_rails/enhancements/singularable/model.rb +47 -0
  171. data/lib/linked_rails/enhancements/singularable/serializer.rb +28 -0
  172. data/lib/linked_rails/enhancements/tableable/model.rb +28 -0
  173. data/lib/linked_rails/enhancements/updatable/action.rb +15 -0
  174. data/lib/linked_rails/enhancements/updatable/controller.rb +15 -0
  175. data/lib/linked_rails/enhancements/updatable/routing.rb +20 -0
  176. data/lib/linked_rails/enhancements/updatable/serializer.rb +17 -0
  177. data/lib/linked_rails/enhancements.rb +22 -0
  178. data/lib/linked_rails/helpers/delta_helper.rb +86 -0
  179. data/lib/linked_rails/helpers/ontola_actions_helper.rb +32 -0
  180. data/lib/linked_rails/helpers/resource_helper.rb +70 -0
  181. data/lib/linked_rails/iri_mapper.rb +125 -0
  182. data/lib/linked_rails/middleware/linked_data_params.rb +224 -0
  183. data/lib/linked_rails/model/collections.rb +82 -0
  184. data/lib/linked_rails/model/dirty.rb +82 -0
  185. data/lib/linked_rails/model/enhancements.rb +61 -0
  186. data/lib/linked_rails/model/filtering.rb +89 -0
  187. data/lib/linked_rails/model/indexable.rb +51 -0
  188. data/lib/linked_rails/model/iri.rb +121 -0
  189. data/lib/linked_rails/model/iri_mapping.rb +69 -0
  190. data/lib/linked_rails/model/serialization.rb +88 -0
  191. data/lib/linked_rails/model/sorting.rb +20 -0
  192. data/lib/linked_rails/model.rb +68 -0
  193. data/lib/linked_rails/params_parser.rb +93 -0
  194. data/lib/linked_rails/policy/attribute_conditions.rb +53 -0
  195. data/lib/linked_rails/policy.rb +189 -0
  196. data/lib/linked_rails/rdf_error.rb +36 -0
  197. data/lib/linked_rails/renderers.rb +46 -0
  198. data/lib/linked_rails/routes.rb +108 -0
  199. data/lib/linked_rails/serializer.rb +137 -0
  200. data/lib/linked_rails/translate.rb +176 -0
  201. data/lib/linked_rails/version.rb +5 -0
  202. data/lib/linked_rails/vocab.rb +81 -0
  203. data/lib/linked_rails.rb +86 -0
  204. data/lib/nill_class_renderer.rb +3 -0
  205. data/lib/rails/welcome_controller.rb +45 -0
  206. data/lib/tasks/linked_rails_tasks.rake +6 -0
  207. metadata +416 -0
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative './base'
4
+
5
+ module LinkedRails
6
+ class Ontology
7
+ class Property < Base
8
+ class << self
9
+ def translation_key
10
+ :property
11
+ end
12
+
13
+ def iri
14
+ RDF[:Property]
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LinkedRails
4
+ class Ontology
5
+ include ActiveModel::Model
6
+ include LinkedRails::Model
7
+
8
+ def classes
9
+ @classes ||= ApplicationRecord.descendants.map do |klass|
10
+ iri = klass.iri.is_a?(Array) ? klass.iri.first : klass.iri
11
+
12
+ LinkedRails.ontology_class_class.new(klass: klass, iri: iri)
13
+ end
14
+ end
15
+
16
+ def properties
17
+ classes.flat_map(&:properties)
18
+ end
19
+
20
+ def root_relative_iri
21
+ RDF::URI('/ns/core')
22
+ end
23
+
24
+ class << self
25
+ def preview_includes
26
+ %i[classes properties]
27
+ end
28
+
29
+ def requested_resource(_opts, _user_context)
30
+ LinkedRails.ontology_class.new
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LinkedRails
4
+ class PropertyQuery < SHACL::PropertyShape
5
+ class << self
6
+ def iri
7
+ Vocab.ontola[:PropertyQuery]
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LinkedRails
4
+ class Resource
5
+ include ActiveModel::Model
6
+ include ActiveModel::Attributes
7
+
8
+ include LinkedRails::Model
9
+
10
+ attr_writer :iri
11
+ alias_attribute :id, :iri
12
+
13
+ def anonymous_iri?
14
+ @iri.blank?
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,64 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LinkedRails
4
+ class Sequence
5
+ attr_accessor :node, :member_includes, :parent, :raw_members, :scope, :user_context
6
+ alias read_attribute_for_serialization send
7
+
8
+ def initialize(members, opts = {})
9
+ self.member_includes = opts[:member_includes]
10
+ self.node = opts[:id] || RDF::Node.new
11
+ self.parent = opts[:parent]
12
+ self.raw_members = members
13
+ self.scope = opts[:scope]
14
+ self.user_context = opts[:user_context]
15
+ end
16
+
17
+ def iri(_opts = {})
18
+ node
19
+ end
20
+ alias id iri
21
+
22
+ def members
23
+ @members ||= apply_scope(
24
+ raw_members.respond_to?(:call) ? raw_members.call : raw_members
25
+ )
26
+ end
27
+
28
+ def preview_includes
29
+ [members: member_includes]
30
+ end
31
+
32
+ def rdf_type
33
+ self.class.iri
34
+ end
35
+
36
+ def sequence
37
+ return [] unless members
38
+
39
+ members.map.with_index do |item, index|
40
+ [iri, RDF["_#{index}"], item_iri(item), Vocab.ll[:supplant]]
41
+ end
42
+ end
43
+
44
+ private
45
+
46
+ def apply_scope(association)
47
+ return association if scope == false
48
+
49
+ policy_scope = scope || Pundit::PolicyFinder.new(association).scope!
50
+
51
+ policy_scope.new(user_context, association).resolve
52
+ end
53
+
54
+ def item_iri(item)
55
+ item.is_a?(RDF::Resource) ? item : item.iri
56
+ end
57
+
58
+ class << self
59
+ def iri
60
+ RDF[:Seq]
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LinkedRails
4
+ module SHACL
5
+ class NodeShape < Shape
6
+ # SHACL attributes
7
+ attr_accessor(
8
+ :closed,
9
+ :ignored_properties,
10
+ :property,
11
+ :sparql
12
+ )
13
+
14
+ class << self
15
+ def iri
16
+ Vocab.sh.NodeShape
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LinkedRails
4
+ module SHACL
5
+ class PropertyShape < LinkedRails::SHACL::Shape
6
+ # SHACL attributes
7
+ attr_accessor(
8
+ :datatype,
9
+ :default_value,
10
+ :description,
11
+ :disjoint,
12
+ :equals,
13
+ :flags,
14
+ :group,
15
+ :language,
16
+ :less_than,
17
+ :less_than_or_equals,
18
+ :max_count,
19
+ :max_exclusive,
20
+ :max_inclusive,
21
+ :max_length,
22
+ :min_count,
23
+ :min_exclusive,
24
+ :min_inclusive,
25
+ :min_length,
26
+ :name,
27
+ :node,
28
+ :path,
29
+ :pattern,
30
+ :sh_class,
31
+ :unique_language,
32
+ :qualified_max_count,
33
+ :qualified_min_count,
34
+ :qualified_value_shape
35
+ )
36
+ attr_writer :has_value, :sh_in
37
+
38
+ def has_value # rubocop:disable Naming/PredicateName
39
+ @has_value.respond_to?(:call) ? @has_value.call : @has_value
40
+ end
41
+
42
+ def sh_in
43
+ @sh_in.respond_to?(:call) ? @sh_in.call : @sh_in
44
+ end
45
+
46
+ class << self
47
+ def iri
48
+ Vocab.sh.PropertyShape
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LinkedRails
4
+ module SHACL
5
+ class Shape < LinkedRails::Resource
6
+ # SHACL attributes
7
+ attr_accessor(
8
+ :and,
9
+ :deactivated,
10
+ :message,
11
+ :node_kind,
12
+ :or,
13
+ :severity,
14
+ :sh_not,
15
+ :target_class,
16
+ :target_objects_of,
17
+ :target_subjects_of,
18
+ :xone
19
+ )
20
+ attr_writer :target_node
21
+
22
+ def target_node
23
+ @target_node.respond_to?(:call) ? @target_node.call : @target_node
24
+ end
25
+
26
+ class << self
27
+ def iri
28
+ Vocab.sh.Shape
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LinkedRails
4
+ class WebPage < CreativeWork
5
+ attr_writer :widgets
6
+ attr_accessor :cover_photo, :includes, :hide_header
7
+
8
+ def widget_sequence
9
+ @widget_sequence ||= LinkedRails::Sequence.new(@widgets, parent: self, scope: false) if @widgets
10
+ end
11
+
12
+ class << self
13
+ def iri
14
+ Vocab.schema.WebPage
15
+ end
16
+
17
+ def preview_includes
18
+ super + [:includes, widget_sequence: {members: LinkedRails::Widget.preview_includes}]
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LinkedRails
4
+ class WebSite < CreativeWork
5
+ attr_accessor :homepage, :image, :navigations_menu
6
+
7
+ class << self
8
+ def iri
9
+ Vocab.schema.WebSite
10
+ end
11
+
12
+ def preview_includes
13
+ super + [homepage: LinkedRails::WebPage.preview_includes]
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LinkedRails
4
+ class Widget
5
+ include ActiveModel::Model
6
+ include LinkedRails::Model
7
+
8
+ attr_writer :resources, :size
9
+ attr_accessor :parent, :topology
10
+
11
+ def iri(_opts = {})
12
+ @iri ||= RDF::Node.new
13
+ end
14
+
15
+ def property_shapes
16
+ resource_sequence
17
+
18
+ @property_shapes || {}
19
+ end
20
+
21
+ def resource_sequence
22
+ @resource_sequence ||=
23
+ LinkedRails::Sequence.new(
24
+ @resources.map { |iri, predicate| predicate.present? ? property_shape(iri, predicate).iri : RDF::URI(iri) },
25
+ parent: self,
26
+ scope: false
27
+ )
28
+ end
29
+
30
+ def size
31
+ @size || 1
32
+ end
33
+
34
+ private
35
+
36
+ def property_shape(iri, predicate)
37
+ @property_shapes ||= {}
38
+ @property_shapes[[iri, predicate]] ||=
39
+ LinkedRails::PropertyQuery.new(
40
+ target_node: iri.is_a?(RDF::Resource) ? iri : RDF::URI(iri),
41
+ path: RDF::URI(predicate)
42
+ )
43
+ end
44
+
45
+ class << self
46
+ def iri
47
+ Vocab.ontola[:Widget]
48
+ end
49
+
50
+ def preview_includes
51
+ %i[resource_sequence property_shapes]
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LinkedRails
4
+ module Actions
5
+ class ItemPolicy < LinkedRails.policy_parent_class
6
+ def show?
7
+ parent_policy.blank? ? true : parent_policy.show?
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LinkedRails
4
+ module Actions
5
+ class ListPolicy < LinkedRails.policy_parent_class
6
+ def show?
7
+ parent_policy.blank? ? true : parent_policy.show?
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LinkedRails
4
+ class Collection
5
+ class ViewPolicy < LinkedRails.policy_parent_class
6
+ delegate :show?, to: :parent_policy
7
+
8
+ def parent_policy
9
+ @parent_policy ||= Pundit.policy(user_context, record.collection)
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LinkedRails
4
+ class CollectionPolicy < LinkedRails.policy_parent_class
5
+ delegate :permitted_attributes, to: :child_policy
6
+
7
+ def create_child?
8
+ policy = Pundit.policy!(user_context, child_resource)
9
+ verdict = policy.create?
10
+ @message = policy.message
11
+ verdict
12
+ end
13
+
14
+ def show?
15
+ if parent_policy
16
+ parent_policy.index_children?(
17
+ record.association_class,
18
+ user_context: user_context
19
+ )
20
+ else
21
+ Pundit.policy(user_context, child_resource).show?
22
+ end
23
+ end
24
+
25
+ private
26
+
27
+ def child_policy
28
+ @child_policy ||= Pundit.policy(user_context, child_resource) if child_resource
29
+ end
30
+
31
+ def child_resource
32
+ record.build_child
33
+ end
34
+
35
+ def parent_policy
36
+ return super unless record.parent.is_a?(LinkedRails.collection_class)
37
+
38
+ @parent_policy ||= Pundit.policy(user_context, record.parent.parent)
39
+ end
40
+ end
41
+ end