linked_rails 0.0.4.pre.gfe77aae19 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (117) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +674 -21
  3. data/app/controllers/linked_rails/bulk_controller.rb +16 -81
  4. data/app/models/linked_rails/actions/item.rb +30 -23
  5. data/app/models/linked_rails/actions/list.rb +6 -0
  6. data/app/models/linked_rails/collection/filter_field.rb +3 -16
  7. data/app/models/linked_rails/collection/filterable.rb +4 -6
  8. data/app/models/linked_rails/collection/infinite.rb +6 -17
  9. data/app/models/linked_rails/collection/iri.rb +2 -25
  10. data/app/models/linked_rails/collection/iri_mapping.rb +1 -1
  11. data/app/models/linked_rails/collection/paginated.rb +3 -4
  12. data/app/models/linked_rails/collection/view.rb +10 -38
  13. data/app/models/linked_rails/collection.rb +25 -27
  14. data/app/models/linked_rails/enum_value.rb +1 -1
  15. data/app/models/linked_rails/form/field/association_input.rb +1 -7
  16. data/app/models/linked_rails/form/field/file_input.rb +0 -1
  17. data/app/models/linked_rails/form/field.rb +5 -31
  18. data/app/models/linked_rails/form/field_factory.rb +16 -29
  19. data/app/models/linked_rails/form/group.rb +4 -2
  20. data/app/models/linked_rails/form/page.rb +0 -4
  21. data/app/models/linked_rails/form.rb +6 -4
  22. data/app/models/linked_rails/manifest.rb +20 -94
  23. data/app/models/linked_rails/menus/item.rb +13 -10
  24. data/app/models/linked_rails/menus/list.rb +5 -13
  25. data/app/models/linked_rails/ontology/base.rb +0 -2
  26. data/app/models/linked_rails/ontology.rb +0 -1
  27. data/app/models/linked_rails/property_query.rb +0 -2
  28. data/app/models/linked_rails/sequence.rb +11 -2
  29. data/app/models/linked_rails/web_page.rb +4 -0
  30. data/app/models/linked_rails/web_site.rb +4 -0
  31. data/app/models/linked_rails/widget.rb +10 -3
  32. data/app/policies/linked_rails/collection_policy.rb +2 -2
  33. data/app/serializers/linked_rails/actions/item_serializer.rb +4 -3
  34. data/app/serializers/linked_rails/collection/filter_field_serializer.rb +2 -3
  35. data/app/serializers/linked_rails/collection/filter_option_serializer.rb +1 -1
  36. data/app/serializers/linked_rails/collection/filter_serializer.rb +1 -1
  37. data/app/serializers/linked_rails/collection/sorting_serializer.rb +1 -1
  38. data/app/serializers/linked_rails/collection/view_serializer.rb +3 -3
  39. data/app/serializers/linked_rails/collection_serializer.rb +13 -9
  40. data/app/serializers/linked_rails/condition_serializer.rb +3 -3
  41. data/app/serializers/linked_rails/entry_point_serializer.rb +2 -2
  42. data/app/serializers/linked_rails/enum_value_serializer.rb +0 -1
  43. data/app/serializers/linked_rails/form/field/association_input_serializer.rb +0 -1
  44. data/app/serializers/linked_rails/form/field_serializer.rb +1 -3
  45. data/app/serializers/linked_rails/form/group_serializer.rb +1 -1
  46. data/app/serializers/linked_rails/form/page_serializer.rb +1 -1
  47. data/app/serializers/linked_rails/menus/item_serializer.rb +3 -3
  48. data/app/serializers/linked_rails/menus/list_serializer.rb +1 -1
  49. data/app/serializers/linked_rails/sequence_serializer.rb +5 -2
  50. data/app/serializers/linked_rails/shacl/node_shape_serializer.rb +1 -1
  51. data/app/serializers/linked_rails/shacl/property_shape_serializer.rb +1 -1
  52. data/app/serializers/linked_rails/shacl/shape_serializer.rb +5 -5
  53. data/app/serializers/linked_rails/web_page_serializer.rb +3 -3
  54. data/app/serializers/linked_rails/web_site_serializer.rb +1 -1
  55. data/app/serializers/linked_rails/widget_serializer.rb +3 -3
  56. data/lib/generators/linked_rails/install/templates/locales.yml +0 -4
  57. data/lib/generators/linked_rails/install/templates/rdf_serializers_initializer.rb +1 -1
  58. data/lib/generators/linked_rails/model/templates/form.rb.tt +1 -1
  59. data/lib/generators/linked_rails/model/templates/policy.rb.tt +1 -1
  60. data/lib/generators/linked_rails/model/templates/serializer.rb.tt +1 -5
  61. data/lib/linked_rails/active_response/controller/collections.rb +1 -1
  62. data/lib/linked_rails/active_response/controller/crud_defaults.rb +1 -1
  63. data/lib/linked_rails/active_response/controller/params.rb +6 -6
  64. data/lib/linked_rails/active_response/controller.rb +22 -1
  65. data/lib/linked_rails/collection_params_parser.rb +1 -1
  66. data/lib/linked_rails/controller/actionable.rb +2 -5
  67. data/lib/linked_rails/controller/default_actions/create.rb +2 -2
  68. data/lib/linked_rails/controller/error_handling.rb +7 -12
  69. data/lib/linked_rails/controller.rb +1 -4
  70. data/lib/linked_rails/helpers/delta_helper.rb +58 -4
  71. data/lib/linked_rails/helpers/resource_helper.rb +1 -13
  72. data/lib/linked_rails/iri_mapper.rb +1 -1
  73. data/lib/linked_rails/middleware/linked_data_params.rb +27 -26
  74. data/lib/linked_rails/model/actionable.rb +8 -7
  75. data/lib/linked_rails/model/collections.rb +4 -10
  76. data/lib/linked_rails/model/dirty.rb +18 -6
  77. data/lib/linked_rails/model/filtering.rb +2 -2
  78. data/lib/linked_rails/model/indexable.rb +1 -1
  79. data/lib/linked_rails/model/iri.rb +2 -14
  80. data/lib/linked_rails/model/iri_mapping.rb +3 -3
  81. data/lib/linked_rails/model/menuable.rb +7 -1
  82. data/lib/linked_rails/model/serialization.rb +6 -2
  83. data/lib/linked_rails/model/singularable.rb +5 -7
  84. data/lib/linked_rails/model/tables.rb +1 -1
  85. data/lib/linked_rails/model.rb +2 -5
  86. data/lib/linked_rails/params_parser.rb +47 -48
  87. data/lib/linked_rails/policy.rb +30 -21
  88. data/lib/linked_rails/renderers.rb +0 -1
  89. data/lib/linked_rails/routes.rb +0 -1
  90. data/lib/linked_rails/serializer/singularable.rb +1 -1
  91. data/lib/linked_rails/serializer.rb +2 -6
  92. data/lib/linked_rails/translate.rb +0 -12
  93. data/lib/linked_rails/vocab.rb +0 -1
  94. data/lib/linked_rails.rb +3 -16
  95. data/lib/rdf/query_fix.rb +1 -1
  96. metadata +10 -59
  97. data/app/controllers/linked_rails/actions/objects_controller.rb +0 -9
  98. data/app/models/linked_rails/actions/object.rb +0 -38
  99. data/app/models/linked_rails/form/field/url_input.rb +0 -10
  100. data/app/policies/linked_rails/actions/object_policy.rb +0 -11
  101. data/app/policies/linked_rails/form_policy.rb +0 -13
  102. data/app/policies/linked_rails/ontology_policy.rb +0 -13
  103. data/app/serializers/linked_rails/actions/object_serializer.rb +0 -9
  104. data/app/serializers/linked_rails/form/field/file_input_serializer.rb +0 -11
  105. data/app/serializers/linked_rails/property_query_serializer.rb +0 -7
  106. data/app/workers/linked_rails/invalidation_stream_worker.rb +0 -16
  107. data/lib/linked_rails/controller/delta.rb +0 -58
  108. data/lib/linked_rails/controller/rendering.rb +0 -48
  109. data/lib/linked_rails/errors/forbidden.rb +0 -37
  110. data/lib/linked_rails/errors.rb +0 -3
  111. data/lib/linked_rails/middleware/error_handling.rb +0 -51
  112. data/lib/linked_rails/model/cacheable.rb +0 -45
  113. data/lib/linked_rails/railtie.rb +0 -11
  114. data/lib/linked_rails/storage.rb +0 -32
  115. data/lib/linked_rails/types/iri_type.rb +0 -37
  116. data/lib/linked_rails/url.rb +0 -11
  117. data/lib/rdf/list.rb +0 -9
@@ -1,38 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'pundit'
4
-
5
- module LinkedRails
6
- module Actions
7
- class Object
8
- include ActiveModel::Model
9
- include LinkedRails::Model
10
-
11
- attr_accessor :action
12
- alias parent action
13
- delegate :object, to: :action
14
-
15
- def iri
16
- action.object_iri
17
- end
18
-
19
- class << self
20
- def requested_resource(opts, user_context)
21
- return super unless opts[:iri].include?('?')
22
-
23
- parent_iri_with_query = [opts[:params][:parent_iri], opts[:iri].split('?').last].compact.join('?')
24
-
25
- super(opts.merge(params: opts[:params].merge(parent_iri: parent_iri_with_query)), user_context)
26
- end
27
-
28
- def requested_single_resource(params, user_context)
29
- return unless params.key?(:parent_iri)
30
-
31
- parent = parent_from_params!(params, user_context)
32
-
33
- new(action: parent) if parent.object.anonymous_iri?
34
- end
35
- end
36
- end
37
- end
38
- end
@@ -1,10 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module LinkedRails
4
- class Form
5
- class Field
6
- class UrlInput < Field
7
- end
8
- end
9
- end
10
- end
@@ -1,11 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module LinkedRails
4
- module Actions
5
- class ObjectPolicy < LinkedRails.policy_parent_class
6
- def show?
7
- parent_policy.blank? ? true : parent_policy.show?
8
- end
9
- end
10
- end
11
- end
@@ -1,13 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module LinkedRails
4
- class FormPolicy < LinkedRails.policy_parent_class
5
- def show?
6
- true
7
- end
8
-
9
- def public_resource?
10
- true
11
- end
12
- end
13
- end
@@ -1,13 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module LinkedRails
4
- class OntologyPolicy < LinkedRails.policy_parent_class
5
- def show?
6
- true
7
- end
8
-
9
- def public_resource?
10
- true
11
- end
12
- end
13
- end
@@ -1,9 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module LinkedRails
4
- module Actions
5
- class ObjectSerializer < LinkedRails.serializer_parent_class
6
- has_one :object, predicate: Vocab.owl.sameAs
7
- end
8
- end
9
- end
@@ -1,11 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module LinkedRails
4
- class Form
5
- class Field
6
- class FileInputSerializer < FieldSerializer
7
- attribute :max_size, predicate: Vocab.form[:maxFileSize]
8
- end
9
- end
10
- end
11
- end
@@ -1,7 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module LinkedRails
4
- class PropertyQuerySerializer < SHACL::PropertyShapeSerializer
5
- attribute :force_render, predicate: Vocab.ll[:forceRender]
6
- end
7
- end
@@ -1,16 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module LinkedRails
4
- class InvalidationStreamWorker < ActiveJob::Base
5
- def perform(type, iri, resource_type)
6
- entry = {
7
- type: type,
8
- resource: iri,
9
- resourceType: resource_type
10
- }
11
- id = Storage.xadd(:stream, LinkedRails.cache_stream, entry)
12
-
13
- raise('No message id returned, implies failure') if id.blank?
14
- end
15
- end
16
- end
@@ -1,58 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module LinkedRails
4
- module Controller
5
- module Delta
6
- include LinkedRails::Helpers::DeltaHelper
7
-
8
- def changes_triples(resource)
9
- resource_serializer(resource)&.send(:repository).statements
10
- end
11
-
12
- def changed_relations_triples(resource, inverted = nil) # rubocop:disable Metrics/AbcSize
13
- resource.previously_changed_relations.flat_map do |key, value|
14
- if key.to_s.ends_with?('_collection')
15
- changed_collection_triples(resource, key)
16
- else
17
- destructed = resource.send(:association_has_destructed?, key)
18
- records = value.relationship_type == :has_many ? resource.send(key) : [resource.send(key)]
19
- changed_relation_triples(value.predicate, destructed, records - [inverted], resource)
20
- end
21
- end
22
- end
23
-
24
- private
25
-
26
- def changed_relation_triples(predicate, destructed, resources, inverted)
27
- related_resource_invalidations =
28
- resources.flat_map do |resource|
29
- resource_delta = invalidate_resource_delta(resource)
30
- [resource_delta] + changed_relations_triples(resource, inverted)
31
- end
32
-
33
- return related_resource_invalidations unless predicate
34
-
35
- if destructed
36
- return related_resource_invalidations + [
37
- [current_resource.iri, predicate, Vocab.sp[:Variable], delta_iri(:remove)]
38
- ]
39
- end
40
-
41
- related_resource_invalidations + resources.map do |resource|
42
- [current_resource.iri, predicate, resource.iri, delta_iri(:replace)]
43
- end
44
- end
45
-
46
- def changed_collection_triples(resource, key)
47
- collection = resource.send(key)
48
- association = resource.association(collection.association)
49
- if association.loaded?
50
- [invalidate_collection_delta(collection)] +
51
- association.reader.select { |r| r.previous_changes.present? }.flat_map(&method(:changes_triples))
52
- else
53
- [invalidate_collection_delta(collection)]
54
- end
55
- end
56
- end
57
- end
58
- end
@@ -1,48 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module LinkedRails
4
- module Controller
5
- module Rendering
6
- def _render_with_renderer_json(record, options)
7
- self.content_type = Mime[:json]
8
-
9
- return record if record.is_a?(String)
10
- return record.to_json if record.is_a?(Hash)
11
-
12
- serializer_opts = RDF::Serializers::Renderers.transform_opts(
13
- options,
14
- serializer_params
15
- )
16
-
17
- serializer = RDF::Serializers.serializer_for(record)&.new(record, serializer_opts)
18
- return record.to_json unless serializer
19
-
20
- Oj.dump(serializer.serializable_hash, mode: :compat)
21
- end
22
-
23
- def resource_body(resource)
24
- resource_serializer(resource).send(:render_emp_json)
25
- end
26
-
27
- def resource_hash(resource)
28
- resource_serializer(resource).send(:emp_json_hash)
29
- end
30
-
31
- def resource_serializer(resource)
32
- return if resource.nil?
33
-
34
- serializer_options = RDF::Serializers::Renderers.transform_opts(
35
- {include: resource&.try(:preview_includes)},
36
- serializer_params
37
- )
38
- RDF::Serializers
39
- .serializer_for(resource)
40
- &.new(resource, serializer_options)
41
- end
42
-
43
- def serializer_params
44
- {}
45
- end
46
- end
47
- end
48
- end
@@ -1,37 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module LinkedRails
4
- module Errors
5
- class Forbidden < StandardError
6
- attr_reader :query, :record, :policy, :action
7
-
8
- # @param [Hash] options
9
- # @option options [String] query The action of the request
10
- # @option options [ActiveRecord::Base] record The record that was requested
11
- # @option options [Policy] policy The policy that raised the exception
12
- # @option options [String] message Override the default error message
13
- # @return [String] the message
14
- def initialize(**options)
15
- @query = options.fetch(:query).to_s
16
- @record = options[:record]
17
- @policy = options[:policy]
18
- @action = @query[-1] == '?' ? @query[0..-2] : @query
19
- @message = options[:message]
20
-
21
- raise StandardError if @query.blank? && @message.blank?
22
-
23
- super(@message || default_message)
24
- end
25
-
26
- private
27
-
28
- def default_message
29
- I18n.t(
30
- "pundit.#{@policy.class.to_s.underscore}.#{@query}",
31
- action: @action,
32
- default: I18n.t('errors.access_denied')
33
- )
34
- end
35
- end
36
- end
37
- end
@@ -1,3 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'errors/forbidden'
@@ -1,51 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module LinkedRails
4
- module Middleware
5
- class ErrorHandling
6
- def initialize(app)
7
- @app = app
8
- end
9
-
10
- def call(env)
11
- @app.call(env)
12
- rescue StandardError => e
13
- handle_error(env, e)
14
- end
15
-
16
- private
17
-
18
- def controller_class(req)
19
- controller = req.controller_class
20
-
21
- return ApplicationController if controller == ActionDispatch::Request::PASS_NOT_FOUND
22
-
23
- controller
24
- rescue StandardError
25
- ApplicationController
26
- end
27
-
28
- def controller_instance(env)
29
- return env['action_controller.instance'] if env['action_controller.instance']
30
-
31
- req = ActionDispatch::Request.new(env)
32
- res = ApplicationController.make_response!(req)
33
- controller = controller_class(req).new
34
- controller.set_request!(req)
35
- controller.set_response!(res)
36
-
37
- controller
38
- end
39
-
40
- def handle_error(env, error)
41
- controller = controller_instance(env)
42
-
43
- controller.send(:handle_and_report_error, error)
44
- error_response = controller.response
45
- body = ActionDispatch::Response::RackBody.new(error_response)
46
-
47
- [error_response.status, error_response.headers, body]
48
- end
49
- end
50
- end
51
- end
@@ -1,45 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module LinkedRails
4
- module Model
5
- module Cacheable
6
- extend ActiveSupport::Concern
7
-
8
- included do
9
- if respond_to?(:after_commit)
10
- after_commit :publish_create, on: :create, if: :should_publish_changes
11
- after_commit :publish_update, on: :update, if: :should_publish_changes
12
- after_commit :publish_delete, on: :destroy, if: :should_publish_changes
13
- end
14
- end
15
-
16
- def cacheable?
17
- true
18
- end
19
-
20
- def publish_create
21
- publish_message('io.ontola.transactions.Created')
22
- end
23
-
24
- def publish_update
25
- publish_message('io.ontola.transactions.Updated')
26
- end
27
-
28
- def publish_delete
29
- publish_message('io.ontola.transactions.Deleted')
30
- end
31
-
32
- private
33
-
34
- def publish_message(type)
35
- LinkedRails::InvalidationStreamWorker.perform_now(type, iri.to_s, self.class.iri.to_s)
36
- rescue StandardError
37
- LinkedRails::InvalidationStreamWorker.perform_later(type, iri.to_s, self.class.iri.to_s)
38
- end
39
-
40
- def should_publish_changes
41
- cacheable? && !Rails.env.test?
42
- end
43
- end
44
- end
45
- end
@@ -1,11 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module LinkedRails
4
- class Railtie < Rails::Railtie
5
- initializer :add_welcome_page do
6
- ActiveSupport.on_load(:action_controller_base) do
7
- require_relative '../rails/welcome_controller'
8
- end
9
- end
10
- end
11
- end
@@ -1,32 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'redis'
4
-
5
- module LinkedRails
6
- class Storage
7
- REDIS_DB = {
8
- cache: LinkedRails.cache_redis_database,
9
- persistent: LinkedRails.persistent_redis_database,
10
- stream: LinkedRails.stream_redis_database
11
- }.freeze
12
- KEYS = {
13
- manifest: 'cache:Manifest',
14
- redirect_exact: 'cache:Redirect:Exact',
15
- redirect_prefix: 'cache:Redirect:Prefix'
16
- }.freeze
17
-
18
- class << self
19
- %i[xadd].each do |method|
20
- define_method(method) do |db, *args|
21
- Redis.new(db: REDIS_DB.fetch(db)).send(method, *args)
22
- end
23
- end
24
-
25
- %i[hset hdel hget].each do |method|
26
- define_method(method) do |db, key, *args|
27
- Redis.new(db: REDIS_DB.fetch(db)).send(method, KEYS.fetch(key), *args)
28
- end
29
- end
30
- end
31
- end
32
- end
@@ -1,37 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module LinkedRails
4
- module Types
5
- class IRI < ActiveRecord::Type::Value
6
- def type
7
- :string
8
- end
9
-
10
- def cast(value)
11
- RDF::URI(value) if value.present?
12
- end
13
-
14
- def serialize(value)
15
- value.to_s
16
- end
17
- end
18
- end
19
-
20
- module QuoteIRI
21
- def quote(value)
22
- return super unless value.is_a?(RDF::URI) || value.is_a?(URI)
23
-
24
- super(value.to_s)
25
- end
26
-
27
- def type_cast(value)
28
- return super unless value.is_a?(RDF::URI) || value.is_a?(URI)
29
-
30
- super(value.to_s)
31
- end
32
- end
33
- end
34
-
35
- if ActiveRecord::ConnectionAdapters.const_defined?(:PostgreSQLAdapter)
36
- ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.prepend(LinkedRails::QuoteIRI)
37
- end
@@ -1,11 +0,0 @@
1
- module LinkedRails
2
- class URL
3
- class << self
4
- def as_href(url)
5
- uri = URI(url)
6
- uri.path = uri.path.presence || '/'
7
- uri.to_s
8
- end
9
- end
10
- end
11
- end
data/lib/rdf/list.rb DELETED
@@ -1,9 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module RDF
4
- class List
5
- def serializer_class
6
- RDF::Serializers::ListSerializer
7
- end
8
- end
9
- end