linked_rails 0.0.3 → 0.0.4

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 (131) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/linked_rails/bulk_controller.rb +26 -6
  3. data/app/controllers/linked_rails/enum_values_controller.rb +0 -42
  4. data/app/models/linked_rails/actions/item.rb +46 -30
  5. data/app/models/linked_rails/actions/list.rb +6 -25
  6. data/app/models/linked_rails/collection/configuration.rb +55 -0
  7. data/app/models/linked_rails/collection/filter.rb +1 -1
  8. data/app/models/linked_rails/collection/filter_field.rb +5 -1
  9. data/app/models/linked_rails/collection/filter_option.rb +1 -1
  10. data/app/models/linked_rails/collection/filterable.rb +3 -8
  11. data/app/models/linked_rails/collection/infinite.rb +102 -0
  12. data/app/models/linked_rails/collection/infinite_view.rb +1 -90
  13. data/app/models/linked_rails/collection/iri.rb +33 -52
  14. data/app/models/linked_rails/collection/iri_mapping.rb +14 -6
  15. data/app/models/linked_rails/collection/paginated.rb +45 -0
  16. data/app/models/linked_rails/collection/paginated_view.rb +1 -33
  17. data/app/models/linked_rails/collection/sortable.rb +1 -9
  18. data/app/models/linked_rails/collection/sorting.rb +1 -1
  19. data/app/models/linked_rails/collection/view.rb +15 -5
  20. data/app/models/linked_rails/collection.rb +33 -67
  21. data/app/models/linked_rails/creative_work.rb +1 -1
  22. data/app/models/linked_rails/entry_point.rb +8 -5
  23. data/app/models/linked_rails/enum_value.rb +39 -1
  24. data/app/models/linked_rails/form/field/resource_field.rb +2 -0
  25. data/app/models/linked_rails/form/field.rb +6 -8
  26. data/app/models/linked_rails/form/field_factory.rb +21 -10
  27. data/app/models/linked_rails/form/group.rb +2 -2
  28. data/app/models/linked_rails/form/page.rb +4 -4
  29. data/app/models/linked_rails/form.rb +13 -15
  30. data/app/models/linked_rails/manifest.rb +8 -2
  31. data/app/models/linked_rails/menus/item.rb +1 -1
  32. data/app/models/linked_rails/menus/list.rb +3 -2
  33. data/app/models/linked_rails/ontology/base.rb +1 -1
  34. data/app/models/linked_rails/ontology/class.rb +3 -3
  35. data/app/models/linked_rails/ontology.rb +5 -5
  36. data/app/models/linked_rails/sequence.rb +2 -2
  37. data/app/models/linked_rails/shacl/property_shape.rb +1 -1
  38. data/app/models/linked_rails/widget.rb +1 -1
  39. data/app/serializers/linked_rails/actions/item_serializer.rb +2 -1
  40. data/app/serializers/linked_rails/collection_serializer.rb +7 -2
  41. data/app/serializers/linked_rails/entry_point_serializer.rb +1 -1
  42. data/app/serializers/linked_rails/ontology_serializer.rb +2 -2
  43. data/lib/generators/linked_rails/install/install_generator.rb +5 -8
  44. data/lib/generators/linked_rails/install/templates/README +2 -0
  45. data/lib/generators/linked_rails/install/templates/app_menu_list.rb +36 -7
  46. data/lib/generators/linked_rails/install/templates/application_menu_list.rb +40 -1
  47. data/lib/generators/linked_rails/install/templates/initializer.rb +1 -2
  48. data/lib/generators/linked_rails/install/templates/locales.yml +12 -0
  49. data/lib/generators/linked_rails/install/templates/vocab.rb +1 -0
  50. data/lib/generators/linked_rails/install/templates/vocab.yml +2 -2
  51. data/lib/generators/linked_rails/model/model_generator.rb +0 -1
  52. data/lib/generators/linked_rails/model/templates/controller.rb.tt +5 -1
  53. data/lib/generators/linked_rails/model/templates/form.rb.tt +3 -0
  54. data/lib/generators/linked_rails/model/templates/menu_list.rb.tt +15 -0
  55. data/lib/generators/linked_rails/model/templates/policy.rb.tt +13 -0
  56. data/lib/generators/linked_rails/model/templates/serializer.rb.tt +1 -1
  57. data/lib/linked_rails/active_response/controller/collections.rb +1 -1
  58. data/lib/linked_rails/active_response/controller/crud_defaults.rb +3 -3
  59. data/lib/linked_rails/active_response/controller/params.rb +5 -5
  60. data/lib/linked_rails/active_response/controller.rb +11 -0
  61. data/lib/linked_rails/active_response/responders/rdf.rb +19 -10
  62. data/lib/linked_rails/callable_variable.rb +1 -1
  63. data/lib/linked_rails/collection_params_parser.rb +93 -0
  64. data/lib/linked_rails/controller/actionable.rb +118 -0
  65. data/lib/linked_rails/controller/authorization.rb +6 -0
  66. data/lib/linked_rails/controller/default_actions/create.rb +52 -0
  67. data/lib/linked_rails/controller/default_actions/destroy.rb +42 -0
  68. data/lib/linked_rails/controller/default_actions/update.rb +43 -0
  69. data/lib/linked_rails/controller.rb +20 -3
  70. data/lib/linked_rails/enhancements/creatable/controller.rb +1 -1
  71. data/lib/linked_rails/enhancements/destroyable/controller.rb +1 -1
  72. data/lib/linked_rails/enhancements/updatable/controller.rb +1 -1
  73. data/lib/linked_rails/enhancements.rb +0 -16
  74. data/lib/linked_rails/helpers/delta_helper.rb +26 -3
  75. data/lib/linked_rails/helpers/ontola_actions_helper.rb +2 -2
  76. data/lib/linked_rails/helpers/resource_helper.rb +1 -1
  77. data/lib/linked_rails/iri_mapper.rb +17 -39
  78. data/lib/linked_rails/middleware/linked_data_params.rb +7 -127
  79. data/lib/linked_rails/model/actionable.rb +69 -0
  80. data/lib/linked_rails/model/collections.rb +195 -39
  81. data/lib/linked_rails/model/dirty.rb +1 -1
  82. data/lib/linked_rails/model/enhancements.rb +1 -6
  83. data/lib/linked_rails/model/filtering.rb +2 -4
  84. data/lib/linked_rails/model/indexable.rb +5 -15
  85. data/lib/linked_rails/model/iri.rb +15 -17
  86. data/lib/linked_rails/model/iri_mapping.rb +35 -6
  87. data/lib/linked_rails/model/menuable.rb +34 -0
  88. data/lib/linked_rails/model/serialization.rb +0 -9
  89. data/lib/linked_rails/model/singularable.rb +55 -0
  90. data/lib/linked_rails/model/sorting.rb +0 -5
  91. data/lib/linked_rails/model/tables.rb +26 -0
  92. data/lib/linked_rails/model.rb +13 -5
  93. data/lib/linked_rails/params_parser.rb +131 -55
  94. data/lib/linked_rails/policy/attribute_conditions.rb +2 -2
  95. data/lib/linked_rails/policy.rb +24 -17
  96. data/lib/linked_rails/rdf_error.rb +2 -2
  97. data/lib/linked_rails/routes.rb +37 -22
  98. data/lib/linked_rails/serializer/actionable.rb +27 -0
  99. data/lib/linked_rails/serializer/menuable.rb +31 -0
  100. data/lib/linked_rails/serializer/singularable.rb +26 -0
  101. data/lib/linked_rails/serializer.rb +23 -10
  102. data/lib/linked_rails/test_methods.rb +114 -0
  103. data/lib/linked_rails/translate.rb +19 -9
  104. data/lib/linked_rails/uri_template.rb +30 -0
  105. data/lib/linked_rails/version.rb +1 -1
  106. data/lib/linked_rails/vocab.rb +8 -0
  107. data/lib/linked_rails.rb +25 -12
  108. data/lib/rails/welcome_controller.rb +3 -3
  109. data/lib/rdf/query_fix.rb +15 -0
  110. metadata +22 -25
  111. data/app/models/linked_rails/actions/default_actions/create.rb +0 -60
  112. data/app/models/linked_rails/actions/default_actions/destroy.rb +0 -45
  113. data/app/models/linked_rails/actions/default_actions/update.rb +0 -50
  114. data/app/models/linked_rails/actions/default_actions.rb +0 -17
  115. data/lib/generators/linked_rails/install/templates/application_action_list.rb +0 -3
  116. data/lib/generators/linked_rails/model/templates/action_list.rb.tt +0 -6
  117. data/lib/linked_rails/enhancements/actionable/model.rb +0 -71
  118. data/lib/linked_rails/enhancements/actionable/serializer.rb +0 -25
  119. data/lib/linked_rails/enhancements/creatable/action.rb +0 -15
  120. data/lib/linked_rails/enhancements/destroyable/action.rb +0 -15
  121. data/lib/linked_rails/enhancements/destroyable/routing.rb +0 -19
  122. data/lib/linked_rails/enhancements/indexable/model.rb +0 -10
  123. data/lib/linked_rails/enhancements/menuable/model.rb +0 -36
  124. data/lib/linked_rails/enhancements/menuable/serializer.rb +0 -33
  125. data/lib/linked_rails/enhancements/route_concerns.rb +0 -56
  126. data/lib/linked_rails/enhancements/singularable/controller.rb +0 -43
  127. data/lib/linked_rails/enhancements/singularable/model.rb +0 -47
  128. data/lib/linked_rails/enhancements/singularable/serializer.rb +0 -28
  129. data/lib/linked_rails/enhancements/tableable/model.rb +0 -28
  130. data/lib/linked_rails/enhancements/updatable/action.rb +0 -15
  131. data/lib/linked_rails/enhancements/updatable/routing.rb +0 -20
@@ -0,0 +1,114 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LinkedRails
4
+ module TestMethods
5
+ def expect_disabled_form(iri: requested_iri, error: 'This action is currently not available')
6
+ assert_response 200
7
+ expect_triple(iri, NS.schema.actionStatus, NS.ontola[:DisabledActionStatus])
8
+ expect_triple(iri, NS.schema.error, error) if error
9
+ end
10
+
11
+ def expect_enabled_form(iri: requested_iri)
12
+ assert_response 200
13
+ expect_triple(iri, NS.schema.actionStatus, NS.schema.PotentialActionStatus)
14
+ end
15
+
16
+ def expect_errors(iri, errors)
17
+ error_response = expect_triple(iri, NS.ll[:errorResponse], nil).first.object
18
+ assert_equal expect_triple(error_response, nil, nil).count, errors.count + 2
19
+ errors.each do |key, value|
20
+ expect_triple(error_response, key, value)
21
+ end
22
+ end
23
+
24
+ def expect_header(key, value)
25
+ expect(response.headers[key]).to(include(value))
26
+ end
27
+
28
+ def expect_ontola_action(redirect: nil, snackbar: nil, reload: nil)
29
+ if redirect
30
+ expect_header('Exec-Action', "actions/redirect?#{{location: redirect, reload: reload}.compact.to_param}")
31
+ end
32
+ expect_header('Exec-Action', "actions/snackbar?#{{text: snackbar}.to_param}") if snackbar
33
+
34
+ expect_ontola_action_count([redirect, snackbar].compact.size)
35
+ end
36
+
37
+ def expect_ontola_action_count(count)
38
+ if count.zero?
39
+ assert_nil response.headers['Exec-Action']
40
+ else
41
+ assert_equal count, response.headers['Exec-Action'].count("\n"), response.headers['Exec-Action']
42
+ end
43
+ end
44
+
45
+ # Tests if the property {path} starting at {start} resolves to {value}.
46
+ # If multiple solutions are present only one has to match to pass.
47
+ #
48
+ # @param [IRI] start The node to start at
49
+ # @param [Array] path The property path to traverse
50
+ # @param [IRI|IRI[]] value The value to match at the end, pass an array to
51
+ # match multiple values.
52
+ def expect_path(start, path, value) # rubocop:disable Metrics/AbcSize
53
+ match = path.each_with_index.reduce(start) do |node, (path_seg, i)|
54
+ obj = [*node].map { |cur_node| rdf_body.query([cur_node, path_seg, nil, nil]).map(&:object) }.flatten
55
+ break (obj & [*value]).present? if path.length - 1 == i
56
+
57
+ nodes = obj.filter { |o| o.is_a?(RDF::Resource) }
58
+ break false if nodes.blank?
59
+
60
+ nodes
61
+ end
62
+
63
+ segs = path.map(&:to_s).join(', ')
64
+ assert match,
65
+ "Expected to find '#{value}' from '#{start}' through '[#{segs}]' in\n#{response.body}"
66
+ end
67
+
68
+ def expect_resource_type(type, iri: requested_iri)
69
+ expect_triple(iri, RDF[:type], type)
70
+ end
71
+
72
+ def expect_sequence(subject, predicate)
73
+ expect_triple(subject, predicate, nil).first.object
74
+ end
75
+
76
+ def expect_sequence_member(subject, index, object)
77
+ expect_triple(subject, RDF[:"_#{index}"], object)
78
+ object
79
+ end
80
+
81
+ def expect_sequence_size(subject, expected_count)
82
+ count =
83
+ expect_triple(subject, nil, nil)
84
+ .select { |s| s.predicate.to_s.starts_with?('http://www.w3.org/1999/02/22-rdf-syntax-ns#_') }
85
+ .count
86
+ assert_equal expected_count, count
87
+ end
88
+
89
+ def expect_triple(subject, predicate, object, graph = NS.ll[:supplant])
90
+ statement = RDF::Statement(subject, predicate, object, graph_name: graph)
91
+ match = rdf_body.query(statement)
92
+ assert match.present?, "Expected to find #{statement} in\n#{response.body}"
93
+ match
94
+ end
95
+
96
+ def refute_triple(subject, predicate, object, graph = nil)
97
+ statement = RDF::Statement(subject, predicate, object, graph_name: graph)
98
+ assert_not rdf_body.query([subject, predicate, object, graph]).present?,
99
+ "Expected not to find #{statement} in\n#{response.body}"
100
+ end
101
+
102
+ def requested_iri
103
+ RDF::URI(request.original_url.sub(".#{request.format.symbol}", ''))
104
+ end
105
+
106
+ def rdf_body
107
+ @rdf_body ||= RDF::Graph.new << RDF::Reader
108
+ .for(content_type: response.headers['Content-Type'])
109
+ .new(response.body)
110
+ end
111
+ end
112
+ end
113
+
114
+ ActiveSupport::TestCase.include(LinkedRails::TestMethods)
@@ -62,28 +62,38 @@ module LinkedRails # rubocop:disable Metrics/ModuleLength
62
62
  end
63
63
 
64
64
  Translate.translations_for(:action, :description) do |object, fallback|
65
+ result_class = object.list.send(:result_class)
66
+ klass_iri = result_class.iri.is_a?(Array) ? result_class.iri.first : result_class.iri
67
+ type = LinkedRails.translate(:class, :label, klass_iri)&.downcase
68
+
65
69
  I18n.t(
66
- "actions.#{Translate.translation_key(object)}.#{object.tag}.description",
70
+ "actions.#{Translate.translation_key(object.resource)}.#{object.tag}.description",
67
71
  default: [
68
72
  :"actions.default.#{object.tag}.description",
69
73
  fallback ? object.tag.to_s.humanize : ''
70
- ]
74
+ ],
75
+ type: type
71
76
  )
72
77
  end
73
78
 
74
79
  Translate.translations_for(:action, :label) do |object, fallback|
80
+ result_class = object.list.send(:result_class)
81
+ klass_iri = result_class.iri.is_a?(Array) ? result_class.iri.first : result_class.iri
82
+ type = LinkedRails.translate(:class, :label, klass_iri)&.downcase
83
+
75
84
  I18n.t(
76
- "actions.#{Translate.translation_key(object)}.#{object.tag}.label",
85
+ "actions.#{Translate.translation_key(object.resource)}.#{object.tag}.label",
77
86
  default: [
78
87
  :"actions.default.#{object.tag}.label",
79
88
  fallback ? object.tag.to_s.humanize : ''
80
- ]
89
+ ],
90
+ type: type
81
91
  )
82
92
  end
83
93
 
84
94
  Translate.translations_for(:action, :submit) do |object, fallback|
85
95
  I18n.t(
86
- "actions.#{Translate.translation_key(object)}.#{object.tag}.submit",
96
+ "actions.#{Translate.translation_key(object.resource)}.#{object.tag}.submit",
87
97
  default: [
88
98
  :"actions.default.#{object.tag}.submit",
89
99
  fallback ? object.tag.to_s.humanize : ''
@@ -93,7 +103,7 @@ module LinkedRails # rubocop:disable Metrics/ModuleLength
93
103
 
94
104
  Translate.translations_for(:enum, :label) do |object|
95
105
  I18n.t(
96
- "enums.#{Translate.translation_key(object)}.#{object.attr}.#{object.key}",
106
+ "enums.#{Translate.translation_key(object.klass)}.#{object.attr}.#{object.key}",
97
107
  default: [
98
108
  :"enums.#{object.attr}.#{object.key}",
99
109
  object.key.to_s.humanize
@@ -148,14 +158,14 @@ module LinkedRails # rubocop:disable Metrics/ModuleLength
148
158
  Translate.translations_for(:class, :label) do |object|
149
159
  I18n.t(
150
160
  Translate.key_for_iri(object, :label),
151
- default: (object.label || Translate.tag_for_iri(object)).to_s.underscore.humanize
161
+ default: (object.try(:label) || Translate.tag_for_iri(object)).to_s.underscore.humanize
152
162
  )
153
163
  end
154
164
 
155
165
  Translate.translations_for(:class, :plural_label) do |object|
156
166
  I18n.t(
157
167
  Translate.key_for_iri(object, :plural_label),
158
- default: (object.label || Translate.tag_for_iri(object)).to_s.tableize.humanize
168
+ default: (object.try(:label) || Translate.tag_for_iri(object)).to_s.tableize.humanize
159
169
  )
160
170
  end
161
171
 
@@ -170,7 +180,7 @@ module LinkedRails # rubocop:disable Metrics/ModuleLength
170
180
  Translate.translations_for(:property, :label) do |object|
171
181
  I18n.t(
172
182
  Translate.key_for_iri(object, :label),
173
- default: (object.label || Translate.tag_for_iri(object)).to_s.underscore.humanize
183
+ default: (object.try(:label) || Translate.tag_for_iri(object)).to_s.underscore.humanize
174
184
  )
175
185
  end
176
186
  end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'uri_template'
4
+
5
+ module LinkedRails
6
+ class URITemplate < URITemplate::RFC6570
7
+ ARRAY_SUFFIX = '%5B%5D'
8
+
9
+ private
10
+
11
+ def normalize_variables(vars)
12
+ variables
13
+ .select { |var| var.ends_with?(ARRAY_SUFFIX) }
14
+ .each_with_object(super.with_indifferent_access) do |var, hash|
15
+ key = var.sub(ARRAY_SUFFIX, '')
16
+ hash[var] = normalize_array_value(hash[key]) if hash.key?(key)
17
+ end
18
+ end
19
+
20
+ def normalize_array_value(original_value)
21
+ return original_value unless original_value.is_a?(Hash)
22
+
23
+ original_value.map do |key, values|
24
+ (values.is_a?(Array) ? values : [values]).map do |value|
25
+ "#{CGI.escape(key.to_s)}=#{value}"
26
+ end
27
+ end.flatten
28
+ end
29
+ end
30
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module LinkedRails
4
- VERSION = '0.0.3'
4
+ VERSION = '0.0.4'
5
5
  end
@@ -19,6 +19,14 @@ module LinkedRails
19
19
  end
20
20
 
21
21
  class << self
22
+ def app_vocabulary(key)
23
+ vocabulary = send(key)
24
+
25
+ LinkedRails::Vocab.define_singleton_method :app do
26
+ vocabulary
27
+ end
28
+ end
29
+
22
30
  def define_shortcut(key)
23
31
  define_singleton_method(key) do
24
32
  options = RDF::Vocabulary.vocab_map.fetch(key)
data/lib/linked_rails.rb CHANGED
@@ -4,11 +4,12 @@ require 'active_response'
4
4
  require 'jsonapi/serializer'
5
5
  require 'kaminari/activerecord'
6
6
  require 'rdf'
7
+ require 'rdf/query_fix'
7
8
  require 'rdf/vocab'
8
- require 'uri_template'
9
9
  require 'nill_class_renderer'
10
10
  require 'linked_rails/engine'
11
11
  require 'linked_rails/iri_mapper'
12
+ require 'linked_rails/collection_params_parser'
12
13
  require 'linked_rails/params_parser'
13
14
  require 'linked_rails/middleware/linked_data_params'
14
15
  require 'linked_rails/renderers'
@@ -16,7 +17,6 @@ require 'linked_rails/renderers'
16
17
  module LinkedRails
17
18
  @model_classes = {}
18
19
 
19
- mattr_accessor :app_vocab, default: RDF::Vocabulary.new('http://example.com/my_vocab#')
20
20
  mattr_accessor :whitelisted_spi_ips
21
21
  mattr_writer :host, :scheme
22
22
 
@@ -37,30 +37,42 @@ module LinkedRails
37
37
  # rubocop:enable Style/ClassVars
38
38
  end
39
39
 
40
+ def linked_models
41
+ @linked_models ||= ObjectSpace.each_object(Class).select do |c|
42
+ c.included_modules.include?(LinkedRails::Model)
43
+ end
44
+ end
45
+
40
46
  def scheme
41
47
  @@scheme ||= Rails.application.routes.default_url_options[:protocol] || :http # rubocop:disable Style/ClassVars
42
48
  end
43
49
 
44
- def iri(opts = {})
50
+ def iri(**opts)
45
51
  RDF::URI.new(**{scheme: LinkedRails.scheme, host: LinkedRails.host}.merge(opts))
46
52
  end
47
53
  end
48
54
 
49
- %i[collection entry_point ontology].each { |klass| configurable_class(nil, klass) }
50
- %i[filter sorting view infinite_view paginated_view].each { |klass| configurable_class(:collection, klass) }
51
- configurable_class(:ontology, :class)
52
- configurable_class(:ontology, :property)
53
55
  configurable_class(:actions, :item)
56
+ configurable_class(:collection, :filter)
57
+ configurable_class(:collection, :sorting)
58
+ configurable_class(:collection, :view)
59
+ configurable_class(:collection, :infinite_view)
60
+ configurable_class(:collection, :paginated_view)
54
61
  configurable_class(:menus, :item)
55
- configurable_class(nil, :current_user)
56
- configurable_class(nil, :manifest)
57
- configurable_class(nil, :rdf_error, default: 'LinkedRails::RDFError')
58
- configurable_class(nil, :action_list_parent, default: 'ApplicationActionList')
62
+ configurable_class(:ontology, :class)
63
+ configurable_class(:ontology, :property)
64
+ configurable_class(nil, :action_list_parent, default: 'LinkedRails::Actions::List')
65
+ configurable_class(nil, :collection)
59
66
  configurable_class(nil, :controller_parent, default: 'ApplicationController')
67
+ configurable_class(nil, :current_user)
68
+ configurable_class(nil, :entry_point)
60
69
  configurable_class(nil, :form_parent, default: 'ApplicationForm')
70
+ configurable_class(nil, :iri_mapper, default: 'LinkedRails::IRIMapper', reader: :iri_mapper)
71
+ configurable_class(nil, :manifest)
72
+ configurable_class(nil, :ontology)
61
73
  configurable_class(nil, :policy_parent, default: 'ApplicationPolicy')
74
+ configurable_class(nil, :rdf_error, default: 'LinkedRails::RDFError')
62
75
  configurable_class(nil, :serializer_parent, default: 'ApplicationSerializer')
63
- configurable_class(nil, :iri_mapper, default: 'LinkedRails::IRIMapper', reader: :iri_mapper)
64
76
  end
65
77
 
66
78
  ActiveSupport::Inflector.inflections do |inflect|
@@ -68,6 +80,7 @@ ActiveSupport::Inflector.inflections do |inflect|
68
80
  inflect.acronym 'SHACL'
69
81
  end
70
82
 
83
+ require 'linked_rails/uri_template'
71
84
  require 'linked_rails/vocab'
72
85
  require 'linked_rails/cache'
73
86
  require 'linked_rails/enhancements'
@@ -1,9 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'rails/application_controller'
4
+
3
5
  module Rails
4
- class WelcomeController
5
- include AbstractController::Callbacks
6
- include ActiveResponse::Controller
6
+ class WelcomeController < Rails::ApplicationController
7
7
  include LinkedRails::Controller
8
8
 
9
9
  def index
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module QueryFix
4
+ def initialize(*args, **options)
5
+ if args.length == 1 && args.first.is_a?(String) && args.first.include?('?')
6
+ split_iri = args.first.split('?')
7
+
8
+ super([split_iri[0], split_iri[1].gsub('+', '%20')].join('?'), **options)
9
+ else
10
+ super
11
+ end
12
+ end
13
+ end
14
+
15
+ RDF::URI.prepend(QueryFix)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: linked_rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Arthur Dingemans
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-08-26 00:00:00.000000000 Z
11
+ date: 2021-11-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: active_response
@@ -72,14 +72,14 @@ dependencies:
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: 0.0.9
75
+ version: 0.0.10
76
76
  type: :runtime
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: 0.0.9
82
+ version: 0.0.10
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: rdf-vocab
85
85
  requirement: !ruby/object:Gem::Requirement
@@ -198,20 +198,19 @@ files:
198
198
  - app/controllers/linked_rails/menus/lists_controller.rb
199
199
  - app/controllers/linked_rails/not_found_controller.rb
200
200
  - app/controllers/linked_rails/ontologies_controller.rb
201
- - app/models/linked_rails/actions/default_actions.rb
202
- - app/models/linked_rails/actions/default_actions/create.rb
203
- - app/models/linked_rails/actions/default_actions/destroy.rb
204
- - app/models/linked_rails/actions/default_actions/update.rb
205
201
  - app/models/linked_rails/actions/item.rb
206
202
  - app/models/linked_rails/actions/list.rb
207
203
  - app/models/linked_rails/collection.rb
204
+ - app/models/linked_rails/collection/configuration.rb
208
205
  - app/models/linked_rails/collection/filter.rb
209
206
  - app/models/linked_rails/collection/filter_field.rb
210
207
  - app/models/linked_rails/collection/filter_option.rb
211
208
  - app/models/linked_rails/collection/filterable.rb
209
+ - app/models/linked_rails/collection/infinite.rb
212
210
  - app/models/linked_rails/collection/infinite_view.rb
213
211
  - app/models/linked_rails/collection/iri.rb
214
212
  - app/models/linked_rails/collection/iri_mapping.rb
213
+ - app/models/linked_rails/collection/paginated.rb
215
214
  - app/models/linked_rails/collection/paginated_view.rb
216
215
  - app/models/linked_rails/collection/sortable.rb
217
216
  - app/models/linked_rails/collection/sorting.rb
@@ -308,7 +307,6 @@ files:
308
307
  - lib/generators/linked_rails/install/install_generator.rb
309
308
  - lib/generators/linked_rails/install/templates/README
310
309
  - lib/generators/linked_rails/install/templates/app_menu_list.rb
311
- - lib/generators/linked_rails/install/templates/application_action_list.rb
312
310
  - lib/generators/linked_rails/install/templates/application_form.rb
313
311
  - lib/generators/linked_rails/install/templates/application_menu_list.rb
314
312
  - lib/generators/linked_rails/install/templates/application_policy.rb
@@ -320,7 +318,6 @@ files:
320
318
  - lib/generators/linked_rails/install/templates/vocab.rb
321
319
  - lib/generators/linked_rails/install/templates/vocab.yml
322
320
  - lib/generators/linked_rails/model/model_generator.rb
323
- - lib/generators/linked_rails/model/templates/action_list.rb.tt
324
321
  - lib/generators/linked_rails/model/templates/controller.rb.tt
325
322
  - lib/generators/linked_rails/model/templates/create_table_migration.rb.tt
326
323
  - lib/generators/linked_rails/model/templates/form.rb.tt
@@ -337,31 +334,21 @@ files:
337
334
  - lib/linked_rails/active_response/responders/rdf.rb
338
335
  - lib/linked_rails/cache.rb
339
336
  - lib/linked_rails/callable_variable.rb
337
+ - lib/linked_rails/collection_params_parser.rb
340
338
  - lib/linked_rails/constraints/whitelist.rb
341
339
  - lib/linked_rails/controller.rb
340
+ - lib/linked_rails/controller/actionable.rb
342
341
  - lib/linked_rails/controller/authorization.rb
342
+ - lib/linked_rails/controller/default_actions/create.rb
343
+ - lib/linked_rails/controller/default_actions/destroy.rb
344
+ - lib/linked_rails/controller/default_actions/update.rb
343
345
  - lib/linked_rails/controller/error_handling.rb
344
346
  - lib/linked_rails/engine.rb
345
347
  - lib/linked_rails/enhanceable.rb
346
348
  - lib/linked_rails/enhancements.rb
347
- - lib/linked_rails/enhancements/actionable/model.rb
348
- - lib/linked_rails/enhancements/actionable/serializer.rb
349
- - lib/linked_rails/enhancements/creatable/action.rb
350
349
  - lib/linked_rails/enhancements/creatable/controller.rb
351
- - lib/linked_rails/enhancements/destroyable/action.rb
352
350
  - lib/linked_rails/enhancements/destroyable/controller.rb
353
- - lib/linked_rails/enhancements/destroyable/routing.rb
354
- - lib/linked_rails/enhancements/indexable/model.rb
355
- - lib/linked_rails/enhancements/menuable/model.rb
356
- - lib/linked_rails/enhancements/menuable/serializer.rb
357
- - lib/linked_rails/enhancements/route_concerns.rb
358
- - lib/linked_rails/enhancements/singularable/controller.rb
359
- - lib/linked_rails/enhancements/singularable/model.rb
360
- - lib/linked_rails/enhancements/singularable/serializer.rb
361
- - lib/linked_rails/enhancements/tableable/model.rb
362
- - lib/linked_rails/enhancements/updatable/action.rb
363
351
  - lib/linked_rails/enhancements/updatable/controller.rb
364
- - lib/linked_rails/enhancements/updatable/routing.rb
365
352
  - lib/linked_rails/enhancements/updatable/serializer.rb
366
353
  - lib/linked_rails/helpers/delta_helper.rb
367
354
  - lib/linked_rails/helpers/ontola_actions_helper.rb
@@ -369,6 +356,7 @@ files:
369
356
  - lib/linked_rails/iri_mapper.rb
370
357
  - lib/linked_rails/middleware/linked_data_params.rb
371
358
  - lib/linked_rails/model.rb
359
+ - lib/linked_rails/model/actionable.rb
372
360
  - lib/linked_rails/model/collections.rb
373
361
  - lib/linked_rails/model/dirty.rb
374
362
  - lib/linked_rails/model/enhancements.rb
@@ -376,8 +364,11 @@ files:
376
364
  - lib/linked_rails/model/indexable.rb
377
365
  - lib/linked_rails/model/iri.rb
378
366
  - lib/linked_rails/model/iri_mapping.rb
367
+ - lib/linked_rails/model/menuable.rb
379
368
  - lib/linked_rails/model/serialization.rb
369
+ - lib/linked_rails/model/singularable.rb
380
370
  - lib/linked_rails/model/sorting.rb
371
+ - lib/linked_rails/model/tables.rb
381
372
  - lib/linked_rails/params_parser.rb
382
373
  - lib/linked_rails/policy.rb
383
374
  - lib/linked_rails/policy/attribute_conditions.rb
@@ -385,11 +376,17 @@ files:
385
376
  - lib/linked_rails/renderers.rb
386
377
  - lib/linked_rails/routes.rb
387
378
  - lib/linked_rails/serializer.rb
379
+ - lib/linked_rails/serializer/actionable.rb
380
+ - lib/linked_rails/serializer/menuable.rb
381
+ - lib/linked_rails/serializer/singularable.rb
382
+ - lib/linked_rails/test_methods.rb
388
383
  - lib/linked_rails/translate.rb
384
+ - lib/linked_rails/uri_template.rb
389
385
  - lib/linked_rails/version.rb
390
386
  - lib/linked_rails/vocab.rb
391
387
  - lib/nill_class_renderer.rb
392
388
  - lib/rails/welcome_controller.rb
389
+ - lib/rdf/query_fix.rb
393
390
  - lib/tasks/linked_rails_tasks.rake
394
391
  homepage: https://github.com/ontola/linked_rails
395
392
  licenses:
@@ -1,60 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module LinkedRails
4
- module Actions
5
- module DefaultActions
6
- module Create
7
- def has_collection_create_action(overwrite = {}) # rubocop:disable Naming/PredicateName
8
- has_collection_action(:create, create_collection_options(overwrite))
9
- end
10
-
11
- def has_singular_create_action(overwrite = {}) # rubocop:disable Naming/PredicateName
12
- has_singular_action(:create, create_singular_options(overwrite))
13
- end
14
-
15
- private
16
-
17
- def create_collection_options(overwrite = {})
18
- default_create_options(
19
- form: -> { resource.association_class.try(:form_class) },
20
- object: -> { resource.build_child },
21
- policy: :create_child?
22
- ).merge(overwrite)
23
- end
24
-
25
- def create_singular_options(overwrite = {})
26
- default_create_options(
27
- form: -> { resource.class.try(:form_class) },
28
- object: -> { resource },
29
- policy: :create?,
30
- url: -> { resource.singular_iri }
31
- ).merge(overwrite)
32
- end
33
-
34
- def default_create_options(overwrite = {}) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
35
- {
36
- http_method: :post,
37
- image: 'fa-plus',
38
- label: lambda do
39
- item = LinkedRails::Actions::Item.new(resource: result_class.new, tag: :create)
40
- LinkedRails.translate(:action, :label, item, false).presence ||
41
- I18n.t("#{association}.type_new", default: "New #{result_class.name.demodulize.humanize}")
42
- end,
43
- root_relative_iri: lambda {
44
- uri = resource.root_relative_iri.dup
45
- uri.path ||= ''
46
- uri.path += '/new'
47
- uri.query = Rack::Utils.parse_nested_query(uri.query).except('display', 'sort').to_param.presence
48
- uri.to_s
49
- },
50
- result: -> { result_class },
51
- type: lambda {
52
- [Vocab.ontola["Create::#{result_class}"], Vocab.schema.CreateAction]
53
- },
54
- url: -> { resource.iri }
55
- }.merge(overwrite)
56
- end
57
- end
58
- end
59
- end
60
- end
@@ -1,45 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module LinkedRails
4
- module Actions
5
- module DefaultActions
6
- module Destroy
7
- def has_resource_destroy_action(overwrite = {}) # rubocop:disable Naming/PredicateName
8
- has_resource_action(:destroy, destroy_resource_options(overwrite))
9
- end
10
-
11
- def has_singular_destroy_action(overwrite = {}) # rubocop:disable Naming/PredicateName
12
- has_singular_action(:destroy, destroy_singular_options(overwrite))
13
- end
14
-
15
- private
16
-
17
- def destroy_resource_options(overwrite = {})
18
- default_destroy_options(overwrite)
19
- end
20
-
21
- def destroy_singular_options(overwrite = {})
22
- default_destroy_options(
23
- url: -> { resource.singular_iri }
24
- ).merge(overwrite)
25
- end
26
-
27
- def default_destroy_options(overwrite = {}) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
28
- {
29
- http_method: :delete,
30
- image: 'fa-close',
31
- policy: :destroy?,
32
- root_relative_iri: lambda {
33
- uri = resource.root_relative_iri.dup
34
- uri.path ||= ''
35
- uri.path += '/delete'
36
- uri.to_s
37
- },
38
- type: [Vocab.schema.Action, Vocab.ontola[:DestroyAction]],
39
- url: -> { resource.iri(destroy: true) }
40
- }.merge(overwrite)
41
- end
42
- end
43
- end
44
- end
45
- end
@@ -1,50 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module LinkedRails
4
- module Actions
5
- module DefaultActions
6
- module Update
7
- def has_resource_update_action(overwrite = {}) # rubocop:disable Naming/PredicateName
8
- has_resource_action(:update, update_resource_options(overwrite))
9
- end
10
-
11
- def has_singular_update_action(overwrite = {}) # rubocop:disable Naming/PredicateName
12
- has_singular_action(:update, update_singular_options(overwrite))
13
- end
14
-
15
- private
16
-
17
- def update_resource_options(overwrite = {})
18
- default_update_options(overwrite)
19
- end
20
-
21
- def update_singular_options(overwrite = {})
22
- default_update_options(
23
- url: -> { resource.singular_iri }
24
- ).merge(overwrite)
25
- end
26
-
27
- def default_update_options(overwrite = {}) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
28
- {
29
- form: -> { resource.class.try(:form_class) },
30
- http_method: :put,
31
- image: 'fa-pencil-square-o',
32
- label: lambda {
33
- type = I18n.t("#{resource.class.name.tableize}.type", default: nil)
34
- type.present? ? I18n.t('edit_type', type: type) : I18n.t('update')
35
- },
36
- policy: :update?,
37
- root_relative_iri: lambda {
38
- uri = resource.root_relative_iri.dup
39
- uri.path ||= ''
40
- uri.path += '/edit'
41
- uri.to_s
42
- },
43
- type: Vocab.schema.UpdateAction,
44
- url: -> { resource.iri }
45
- }.merge(overwrite)
46
- end
47
- end
48
- end
49
- end
50
- end
@@ -1,17 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'default_actions/create'
4
-
5
- module LinkedRails
6
- module Actions
7
- module DefaultActions
8
- extend ActiveSupport::Concern
9
-
10
- included do
11
- extend LinkedRails::Actions::DefaultActions::Create
12
- extend LinkedRails::Actions::DefaultActions::Destroy
13
- extend LinkedRails::Actions::DefaultActions::Update
14
- end
15
- end
16
- end
17
- end