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.
- checksums.yaml +4 -4
- data/LICENSE +674 -21
- data/app/controllers/linked_rails/bulk_controller.rb +16 -81
- data/app/models/linked_rails/actions/item.rb +30 -23
- data/app/models/linked_rails/actions/list.rb +6 -0
- data/app/models/linked_rails/collection/filter_field.rb +3 -16
- data/app/models/linked_rails/collection/filterable.rb +4 -6
- data/app/models/linked_rails/collection/infinite.rb +6 -17
- data/app/models/linked_rails/collection/iri.rb +2 -25
- data/app/models/linked_rails/collection/iri_mapping.rb +1 -1
- data/app/models/linked_rails/collection/paginated.rb +3 -4
- data/app/models/linked_rails/collection/view.rb +10 -38
- data/app/models/linked_rails/collection.rb +25 -27
- data/app/models/linked_rails/enum_value.rb +1 -1
- data/app/models/linked_rails/form/field/association_input.rb +1 -7
- data/app/models/linked_rails/form/field/file_input.rb +0 -1
- data/app/models/linked_rails/form/field.rb +5 -31
- data/app/models/linked_rails/form/field_factory.rb +16 -29
- data/app/models/linked_rails/form/group.rb +4 -2
- data/app/models/linked_rails/form/page.rb +0 -4
- data/app/models/linked_rails/form.rb +6 -4
- data/app/models/linked_rails/manifest.rb +20 -94
- data/app/models/linked_rails/menus/item.rb +13 -10
- data/app/models/linked_rails/menus/list.rb +5 -13
- data/app/models/linked_rails/ontology/base.rb +0 -2
- data/app/models/linked_rails/ontology.rb +0 -1
- data/app/models/linked_rails/property_query.rb +0 -2
- data/app/models/linked_rails/sequence.rb +11 -2
- data/app/models/linked_rails/web_page.rb +4 -0
- data/app/models/linked_rails/web_site.rb +4 -0
- data/app/models/linked_rails/widget.rb +10 -3
- data/app/policies/linked_rails/collection_policy.rb +2 -2
- data/app/serializers/linked_rails/actions/item_serializer.rb +4 -3
- data/app/serializers/linked_rails/collection/filter_field_serializer.rb +2 -3
- data/app/serializers/linked_rails/collection/filter_option_serializer.rb +1 -1
- data/app/serializers/linked_rails/collection/filter_serializer.rb +1 -1
- data/app/serializers/linked_rails/collection/sorting_serializer.rb +1 -1
- data/app/serializers/linked_rails/collection/view_serializer.rb +3 -3
- data/app/serializers/linked_rails/collection_serializer.rb +13 -9
- data/app/serializers/linked_rails/condition_serializer.rb +3 -3
- data/app/serializers/linked_rails/entry_point_serializer.rb +2 -2
- data/app/serializers/linked_rails/enum_value_serializer.rb +0 -1
- data/app/serializers/linked_rails/form/field/association_input_serializer.rb +0 -1
- data/app/serializers/linked_rails/form/field_serializer.rb +1 -3
- data/app/serializers/linked_rails/form/group_serializer.rb +1 -1
- data/app/serializers/linked_rails/form/page_serializer.rb +1 -1
- data/app/serializers/linked_rails/menus/item_serializer.rb +3 -3
- data/app/serializers/linked_rails/menus/list_serializer.rb +1 -1
- data/app/serializers/linked_rails/sequence_serializer.rb +5 -2
- data/app/serializers/linked_rails/shacl/node_shape_serializer.rb +1 -1
- data/app/serializers/linked_rails/shacl/property_shape_serializer.rb +1 -1
- data/app/serializers/linked_rails/shacl/shape_serializer.rb +5 -5
- data/app/serializers/linked_rails/web_page_serializer.rb +3 -3
- data/app/serializers/linked_rails/web_site_serializer.rb +1 -1
- data/app/serializers/linked_rails/widget_serializer.rb +3 -3
- data/lib/generators/linked_rails/install/templates/locales.yml +0 -4
- data/lib/generators/linked_rails/install/templates/rdf_serializers_initializer.rb +1 -1
- data/lib/generators/linked_rails/model/templates/form.rb.tt +1 -1
- data/lib/generators/linked_rails/model/templates/policy.rb.tt +1 -1
- data/lib/generators/linked_rails/model/templates/serializer.rb.tt +1 -5
- data/lib/linked_rails/active_response/controller/collections.rb +1 -1
- data/lib/linked_rails/active_response/controller/crud_defaults.rb +1 -1
- data/lib/linked_rails/active_response/controller/params.rb +6 -6
- data/lib/linked_rails/active_response/controller.rb +22 -1
- data/lib/linked_rails/collection_params_parser.rb +1 -1
- data/lib/linked_rails/controller/actionable.rb +2 -5
- data/lib/linked_rails/controller/default_actions/create.rb +2 -2
- data/lib/linked_rails/controller/error_handling.rb +7 -12
- data/lib/linked_rails/controller.rb +1 -4
- data/lib/linked_rails/helpers/delta_helper.rb +58 -4
- data/lib/linked_rails/helpers/resource_helper.rb +1 -13
- data/lib/linked_rails/iri_mapper.rb +1 -1
- data/lib/linked_rails/middleware/linked_data_params.rb +27 -26
- data/lib/linked_rails/model/actionable.rb +8 -7
- data/lib/linked_rails/model/collections.rb +4 -10
- data/lib/linked_rails/model/dirty.rb +18 -6
- data/lib/linked_rails/model/filtering.rb +2 -2
- data/lib/linked_rails/model/indexable.rb +1 -1
- data/lib/linked_rails/model/iri.rb +2 -14
- data/lib/linked_rails/model/iri_mapping.rb +3 -3
- data/lib/linked_rails/model/menuable.rb +7 -1
- data/lib/linked_rails/model/serialization.rb +6 -2
- data/lib/linked_rails/model/singularable.rb +5 -7
- data/lib/linked_rails/model/tables.rb +1 -1
- data/lib/linked_rails/model.rb +2 -5
- data/lib/linked_rails/params_parser.rb +47 -48
- data/lib/linked_rails/policy.rb +30 -21
- data/lib/linked_rails/renderers.rb +0 -1
- data/lib/linked_rails/routes.rb +0 -1
- data/lib/linked_rails/serializer/singularable.rb +1 -1
- data/lib/linked_rails/serializer.rb +2 -6
- data/lib/linked_rails/translate.rb +0 -12
- data/lib/linked_rails/vocab.rb +0 -1
- data/lib/linked_rails.rb +3 -16
- data/lib/rdf/query_fix.rb +1 -1
- metadata +10 -59
- data/app/controllers/linked_rails/actions/objects_controller.rb +0 -9
- data/app/models/linked_rails/actions/object.rb +0 -38
- data/app/models/linked_rails/form/field/url_input.rb +0 -10
- data/app/policies/linked_rails/actions/object_policy.rb +0 -11
- data/app/policies/linked_rails/form_policy.rb +0 -13
- data/app/policies/linked_rails/ontology_policy.rb +0 -13
- data/app/serializers/linked_rails/actions/object_serializer.rb +0 -9
- data/app/serializers/linked_rails/form/field/file_input_serializer.rb +0 -11
- data/app/serializers/linked_rails/property_query_serializer.rb +0 -7
- data/app/workers/linked_rails/invalidation_stream_worker.rb +0 -16
- data/lib/linked_rails/controller/delta.rb +0 -58
- data/lib/linked_rails/controller/rendering.rb +0 -48
- data/lib/linked_rails/errors/forbidden.rb +0 -37
- data/lib/linked_rails/errors.rb +0 -3
- data/lib/linked_rails/middleware/error_handling.rb +0 -51
- data/lib/linked_rails/model/cacheable.rb +0 -45
- data/lib/linked_rails/railtie.rb +0 -11
- data/lib/linked_rails/storage.rb +0 -32
- data/lib/linked_rails/types/iri_type.rb +0 -37
- data/lib/linked_rails/url.rb +0 -11
- 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,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
|
data/lib/linked_rails/errors.rb
DELETED
@@ -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
|
data/lib/linked_rails/railtie.rb
DELETED
data/lib/linked_rails/storage.rb
DELETED
@@ -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
|
data/lib/linked_rails/url.rb
DELETED