valkyrie 0.1.0 → 1.0.0.rc1

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 (118) hide show
  1. checksums.yaml +5 -5
  2. data/.ctags +2 -0
  3. data/.rubocop.yml +5 -0
  4. data/.rubocop_todo.yml +3 -0
  5. data/CHANGELOG.md +43 -0
  6. data/Gemfile +0 -4
  7. data/LICENSE +15 -0
  8. data/README.md +13 -8
  9. data/Rakefile +15 -1
  10. data/bin/jetty_wait +14 -0
  11. data/bin/rspec +29 -0
  12. data/browserslist +3 -0
  13. data/circle.yml +17 -0
  14. data/config/fedora.yml +10 -0
  15. data/db/migrate/20161007101725_create_orm_resources.rb +9 -1
  16. data/db/migrate/20171011224121_create_path_gin_index.rb +6 -0
  17. data/db/migrate/20171204224121_create_internal_resource_index.rb +6 -0
  18. data/db/migrate/20180212092225_create_updated_at_index.rb +6 -0
  19. data/lib/generators/valkyrie/templates/resource_spec.rb.erb +1 -1
  20. data/lib/valkyrie.rb +1 -7
  21. data/lib/valkyrie/change_set.rb +21 -7
  22. data/lib/valkyrie/engine.rb +2 -0
  23. data/lib/valkyrie/id.rb +1 -0
  24. data/lib/valkyrie/indexers/access_controls_indexer.rb +50 -6
  25. data/lib/valkyrie/metadata_adapter.rb +29 -1
  26. data/lib/valkyrie/persistence.rb +27 -0
  27. data/lib/valkyrie/persistence/buffered_persister.rb +17 -1
  28. data/lib/valkyrie/persistence/composite_persister.rb +14 -2
  29. data/lib/valkyrie/persistence/custom_query_container.rb +63 -0
  30. data/lib/valkyrie/persistence/delete_tracking_buffer.rb +8 -0
  31. data/lib/valkyrie/persistence/fedora.rb +3 -0
  32. data/lib/valkyrie/persistence/fedora/list_node.rb +5 -2
  33. data/lib/valkyrie/persistence/fedora/metadata_adapter.rb +13 -11
  34. data/lib/valkyrie/persistence/fedora/ordered_list.rb +2 -2
  35. data/lib/valkyrie/persistence/fedora/ordered_reader.rb +3 -2
  36. data/lib/valkyrie/persistence/fedora/permissive_schema.rb +75 -0
  37. data/lib/valkyrie/persistence/fedora/persister.rb +22 -0
  38. data/lib/valkyrie/persistence/fedora/persister/model_converter.rb +110 -25
  39. data/lib/valkyrie/persistence/fedora/persister/orm_converter.rb +49 -17
  40. data/lib/valkyrie/persistence/fedora/persister/resource_factory.rb +2 -0
  41. data/lib/valkyrie/persistence/fedora/query_service.rb +46 -3
  42. data/lib/valkyrie/persistence/memory.rb +5 -0
  43. data/lib/valkyrie/persistence/memory/metadata_adapter.rb +6 -1
  44. data/lib/valkyrie/persistence/memory/persister.rb +19 -1
  45. data/lib/valkyrie/persistence/memory/query_service.rb +49 -8
  46. data/lib/valkyrie/persistence/postgres.rb +2 -0
  47. data/lib/valkyrie/persistence/postgres/metadata_adapter.rb +8 -1
  48. data/lib/valkyrie/persistence/postgres/orm.rb +1 -0
  49. data/lib/valkyrie/persistence/postgres/orm/resource.rb +12 -0
  50. data/lib/valkyrie/persistence/postgres/orm_converter.rb +99 -74
  51. data/lib/valkyrie/persistence/postgres/persister.rb +16 -0
  52. data/lib/valkyrie/persistence/postgres/query_service.rb +94 -6
  53. data/lib/valkyrie/persistence/postgres/resource_converter.rb +3 -1
  54. data/lib/valkyrie/persistence/postgres/resource_factory.rb +5 -5
  55. data/lib/valkyrie/persistence/solr.rb +2 -0
  56. data/lib/valkyrie/persistence/solr/composite_indexer.rb +29 -0
  57. data/lib/valkyrie/persistence/solr/metadata_adapter.rb +26 -1
  58. data/lib/valkyrie/persistence/solr/model_converter.rb +38 -8
  59. data/lib/valkyrie/persistence/solr/orm_converter.rb +43 -20
  60. data/lib/valkyrie/persistence/solr/persister.rb +16 -0
  61. data/lib/valkyrie/persistence/solr/queries.rb +3 -0
  62. data/lib/valkyrie/persistence/solr/queries/default_paginator.rb +2 -0
  63. data/lib/valkyrie/persistence/solr/queries/find_all_query.rb +3 -1
  64. data/lib/valkyrie/persistence/solr/queries/find_by_id_query.rb +4 -2
  65. data/lib/valkyrie/persistence/solr/queries/find_inverse_references_query.rb +2 -0
  66. data/lib/valkyrie/persistence/solr/queries/find_many_by_ids_query.rb +21 -0
  67. data/lib/valkyrie/persistence/solr/queries/find_members_query.rb +13 -5
  68. data/lib/valkyrie/persistence/solr/queries/find_references_query.rb +7 -3
  69. data/lib/valkyrie/persistence/solr/query_service.rb +30 -2
  70. data/lib/valkyrie/persistence/solr/repository.rb +14 -2
  71. data/lib/valkyrie/persistence/solr/resource_factory.rb +3 -1
  72. data/lib/valkyrie/resource.rb +11 -4
  73. data/lib/valkyrie/resource/access_controls.rb +13 -0
  74. data/lib/valkyrie/specs/shared_specs.rb +1 -2
  75. data/lib/valkyrie/specs/shared_specs/change_set.rb +75 -0
  76. data/lib/valkyrie/specs/shared_specs/metadata_adapter.rb +3 -0
  77. data/lib/valkyrie/specs/shared_specs/persister.rb +145 -15
  78. data/lib/valkyrie/specs/shared_specs/queries.rb +153 -27
  79. data/lib/valkyrie/specs/shared_specs/storage_adapter.rb +8 -3
  80. data/lib/valkyrie/storage.rb +29 -0
  81. data/lib/valkyrie/storage/disk.rb +17 -5
  82. data/lib/valkyrie/storage/fedora.rb +14 -1
  83. data/lib/valkyrie/storage/memory.rb +15 -2
  84. data/lib/valkyrie/storage_adapter.rb +26 -4
  85. data/lib/valkyrie/types.rb +65 -7
  86. data/lib/valkyrie/version.rb +1 -1
  87. data/solr/config/_rest_managed.json +3 -0
  88. data/solr/config/admin-extra.html +31 -0
  89. data/solr/config/elevate.xml +36 -0
  90. data/solr/config/mapping-ISOLatin1Accent.txt +246 -0
  91. data/solr/config/protwords.txt +21 -0
  92. data/solr/config/schema.xml +366 -0
  93. data/solr/config/scripts.conf +24 -0
  94. data/solr/config/solrconfig.xml +322 -0
  95. data/solr/config/spellings.txt +2 -0
  96. data/solr/config/stopwords.txt +58 -0
  97. data/solr/config/stopwords_en.txt +58 -0
  98. data/solr/config/synonyms.txt +31 -0
  99. data/solr/config/xslt/example.xsl +132 -0
  100. data/solr/config/xslt/example_atom.xsl +67 -0
  101. data/solr/config/xslt/example_rss.xsl +66 -0
  102. data/solr/config/xslt/luke.xsl +337 -0
  103. data/solr/solr.xml +35 -0
  104. data/tasks/dev.rake +66 -0
  105. data/valkyrie.gemspec +6 -6
  106. metadata +58 -63
  107. data/lib/valkyrie/decorators/decorator_list.rb +0 -15
  108. data/lib/valkyrie/decorators/decorator_with_arguments.rb +0 -14
  109. data/lib/valkyrie/derivative_service.rb +0 -42
  110. data/lib/valkyrie/file_characterization_service.rb +0 -42
  111. data/lib/valkyrie/local_file_service.rb +0 -11
  112. data/lib/valkyrie/persist_derivatives.rb +0 -29
  113. data/lib/valkyrie/persistence/postgres/queries.rb +0 -8
  114. data/lib/valkyrie/persistence/postgres/queries/find_inverse_references_query.rb +0 -31
  115. data/lib/valkyrie/persistence/postgres/queries/find_members_query.rb +0 -33
  116. data/lib/valkyrie/persistence/postgres/queries/find_references_query.rb +0 -33
  117. data/lib/valkyrie/specs/shared_specs/derivative_service.rb +0 -30
  118. data/lib/valkyrie/specs/shared_specs/file_characterization_service.rb +0 -33
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: a5895a08d879fc01c20f546804cb147bb6287f4e
4
- data.tar.gz: a7934d10ee04ed79c752159001f883aa15a32149
2
+ SHA256:
3
+ metadata.gz: 0bdf173346aa41d564f214c4e453e047a730ec7775edd7c7a0167e38fa2cd4e4
4
+ data.tar.gz: aef0b3c204da30a6241b3b217fea821504b806eb10e50ae8d3ad2d5547d0d19d
5
5
  SHA512:
6
- metadata.gz: b8e7471ae686bd39aa04dc7e225dffa1348a06716faa4f824f9a11dd50df5e8e55cc8fd6a49fece559391b31840f62395090fa29f8a2a618b648152b1c840d02
7
- data.tar.gz: da1d0422841bb1f24b902f839c95d754ade7b26b4767b22a22c4f33db9ed84090aab0c53b9d2cab88741d5741ad791a453db52a86cad671c727d454d92d51680
6
+ metadata.gz: f8610d09ec9088a811f80e84ad53eaa583f76bc28304266870e349ec940306871455885153cfd01ac5dce62e1bc36dbce7119ba719576da6bc86bab664e9a14a
7
+ data.tar.gz: 588b9c6d0bb1a94103a1b6c256b94cf1b26309602a984ad8094a438f7bb33a01802e3bc5602d2259c4a08b8b82430492517b1dcc2fa3d5e71ffe142cfb99c6af
data/.ctags ADDED
@@ -0,0 +1,2 @@
1
+ --recurse=yes
2
+ --exclude=vendor
data/.rubocop.yml CHANGED
@@ -1,3 +1,5 @@
1
+ inherit_from: .rubocop_todo.yml
2
+
1
3
  inherit_gem:
2
4
  bixby: bixby_default.yml
3
5
  AllCops:
@@ -13,6 +15,7 @@ Metrics/BlockLength:
13
15
  Exclude:
14
16
  - 'spec/**/*'
15
17
  - 'lib/valkyrie/specs/**/*'
18
+ - 'tasks/**/*'
16
19
  - 'db/schema.rb'
17
20
  - 'Rakefile'
18
21
  - '*.gemspec'
@@ -26,3 +29,5 @@ Style/PredicateName:
26
29
  Exclude:
27
30
  - "lib/valkyrie/resource.rb"
28
31
  - "lib/valkyrie/persistence/solr/queries/default_paginator.rb"
32
+ Lint/UnusedMethodArgument:
33
+ AllowUnusedKeywordArguments: true
data/.rubocop_todo.yml ADDED
@@ -0,0 +1,3 @@
1
+ Metrics/ClassLength:
2
+ Exclude:
3
+ - 'lib/valkyrie/persistence/postgres/query_service.rb'
data/CHANGELOG.md ADDED
@@ -0,0 +1,43 @@
1
+ # v1.0.0.RC1 2018-03-02
2
+
3
+ Initial Release
4
+
5
+ ## Changes Since Last Sprint
6
+
7
+ * Added find_many_by_ids query.
8
+ * Enforces only persisting arrays - no scalars.
9
+ * Fixes casting edge cases for `Set` and `Array`.
10
+ * Significantly improved documentation
11
+ * Support `Booleans`
12
+ * Support `RDF::Literal`
13
+ * Fix support for `DateTime`.
14
+ * Fix rake tasks leaking out of gem.
15
+ * Extract derivatives/file characterization to
16
+ [valkyrie-derivatives](https://github.com/samvera-labs/valkyrie-derivatives)
17
+ * ChangeSet shared spec
18
+ * Allow strings as an argument for find_by.
19
+ * Improve development documentation.
20
+ * Throw error on `find_inverse_references_by` for unsaved `resource`.
21
+
22
+ ## Special Thanks to All Contributors:
23
+
24
+ * [atz](https://github.com/atz)
25
+ * [awead](https://github.com/awead)
26
+ * [barmintor](https://github.com/barmintor)
27
+ * [bmquinn](https://github.com/bmquinn)
28
+ * [cam156](https://github.com/cam156)
29
+ * [carrickr](https://github.com/carrickr)
30
+ * [cbeer](https://github.com/cbeer)
31
+ * [cjcolvar](https://github.com/cjcolvar)
32
+ * [csyversen](https://github.com/csyversen)
33
+ * [dlpierce](https://github.com/dlpierce)
34
+ * [escowles](https://github.com/escowles)
35
+ * [geekscruff](https://github.com/geekscruff)
36
+ * [hackmastera](https://github.com/hackmastera)
37
+ * [jcoyne](https://github.com/jcoyne)
38
+ * [jeremyf](https://github.com/jeremyf)
39
+ * [jgondron](https://github.com/jgondron)
40
+ * [jrgriffiniii](https://github.com/jrgriffiniii)
41
+ * [mbklein](https://github.com/mbklein)
42
+ * [stkenny](https://github.com/stkenny)
43
+ * [tpendragon](https://github.com/tpendragon)
data/Gemfile CHANGED
@@ -3,7 +3,3 @@ source 'https://rubygems.org'
3
3
 
4
4
  # Specify your gem's dependencies in valkyrie.gemspec
5
5
  gemspec
6
-
7
- # Necessary for the --ignore-parent-exclusion feature. Remove when
8
- # https://github.com/bbatsov/rubocop/pull/4329 is merged.
9
- gem 'rubocop', github: 'nelsonjr/rubocop', ref: 'a5db18a49b9f318644ae7209c73452fb7bbcdc49'
data/LICENSE ADDED
@@ -0,0 +1,15 @@
1
+ ##########################################################################
2
+ # Copyright 2017 Princeton University Library
3
+ # Additional copyright may be held by others, as reflected in the commit log
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
data/README.md CHANGED
@@ -1,7 +1,6 @@
1
1
  # Valkyrie
2
2
 
3
- Valkyrie is a gem for enabling multiple backends for storage of files and metadata in Samvera,
4
- currently developed in a subdirectory of the [proof-of-concept app of the same name](..).
3
+ Valkyrie is a gem for enabling multiple backends for storage of files and metadata in Samvera.
5
4
 
6
5
  [![CircleCI](https://circleci.com/gh/samvera-labs/valkyrie.svg?style=svg)](https://circleci.com/gh/samvera-labs/valkyrie)
7
6
  [![Coverage Status](https://coveralls.io/repos/github/samvera-labs/valkyrie/badge.svg?branch=master)](https://coveralls.io/github/samvera-labs/valkyrie?branch=master)
@@ -125,13 +124,13 @@ To create a custom Valkyrie model in your application, you can use the Rails gen
125
124
  generate a model named `FooBar` with an unordered `title` field and an ordered `member_ids` field:
126
125
 
127
126
  ```
128
- rails generate valkyrie:model FooBar title member_ids:array
127
+ rails generate valkyrie:resource FooBar title member_ids:array
129
128
  ```
130
129
 
131
130
  You can namespace your model class by including a slash in the model name:
132
131
 
133
132
  ```
134
- rails generate valkyrie:model Foo/Bar title member_ids:array
133
+ rails generate valkyrie:resource Foo/Bar title member_ids:array
135
134
  ```
136
135
 
137
136
  ### Read and Write Data
@@ -154,10 +153,16 @@ Valkyrie.config.metadata_adapter.query_service.find_all_of_model(model: MyModel)
154
153
 
155
154
  ## Installing a Development environment
156
155
 
157
- See the parent app README for [instructions on setting up a development
158
- environment](../#installing-a-development-environment). To run the test suite:
159
- 1. Start Solr and Fedora servers for testing with `rake server:test` in the parent app
160
- 1. Run the gem's RSpec test suite with `cd valkyrie && rspec spec`
156
+ ### External Requirements
157
+ * PostgreSQL with the uuid-ossp extension.
158
+ * Note: Enabling uuid-ossp requires database superuser privileges.
159
+ * From `psql`: `alter user [username] with superuser;`
160
+
161
+ ### To run the test suite
162
+ 1. Start Solr and Fedora servers for testing with `rake server:test`
163
+ 1. Run `rake db:create` (First time only)
164
+ 1. Run `rake db:migrate`
165
+ 1. Run the gem's RSpec test suite with `rspec spec` or `rake`
161
166
 
162
167
 
163
168
  ## License
data/Rakefile CHANGED
@@ -4,10 +4,18 @@ require "rspec/core/rake_task"
4
4
  require 'yaml'
5
5
  require 'config/database_connection'
6
6
  require 'active_record'
7
-
7
+ require 'rubocop/rake_task'
8
+ load "tasks/dev.rake"
8
9
  RSpec::Core::RakeTask.new(:spec)
9
10
 
10
11
  task default: :spec
12
+
13
+ desc 'Run RuboCop style checker'
14
+ RuboCop::RakeTask.new(:rubocop) do |task|
15
+ task.requires << 'rubocop-rspec'
16
+ task.fail_on_error = true
17
+ end
18
+
11
19
  namespace :db do
12
20
  task :environment do
13
21
  path = File.join(File.dirname(__FILE__), './db/migrate')
@@ -56,6 +64,12 @@ namespace :db do
56
64
  end
57
65
  end
58
66
 
67
+ namespace :schema do
68
+ task :load do
69
+ Rake::Task["db:migrate"].invoke
70
+ end
71
+ end
72
+
59
73
  desc 'Rolls the schema back to the previous version (specify steps w/ STEP=n).'
60
74
  task rollback: :configure_connection do
61
75
  step = ENV['STEP'] ? ENV['STEP'].to_i : 1
data/bin/jetty_wait ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env sh
2
+
3
+ until $(curl --output /dev/null --silent --head --fail http://localhost:8984/solr); do
4
+ printf '.'
5
+ sleep 1
6
+ done
7
+ until $(curl --output /dev/null --silent --head --fail http://localhost:8985/solr); do
8
+ printf '.'
9
+ sleep 1
10
+ done
11
+ until $(curl --output /dev/null --silent --head --fail http://localhost:8988/rest); do
12
+ printf '.'
13
+ sleep 1
14
+ done
data/bin/rspec ADDED
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ #
5
+ # This file was generated by Bundler.
6
+ #
7
+ # The application 'rspec' is installed as part of a gem, and
8
+ # this file is here to facilitate running it.
9
+ #
10
+
11
+ require "pathname"
12
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
13
+ Pathname.new(__FILE__).realpath)
14
+
15
+ bundle_binstub = File.expand_path("../bundle", __FILE__)
16
+
17
+ if File.file?(bundle_binstub)
18
+ if File.read(bundle_binstub, 150) =~ /This file was generated by Bundler/
19
+ load(bundle_binstub)
20
+ else
21
+ abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
22
+ Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
23
+ end
24
+ end
25
+
26
+ require "rubygems"
27
+ require "bundler/setup"
28
+
29
+ load Gem.bin_path("rspec-core", "rspec")
data/browserslist ADDED
@@ -0,0 +1,3 @@
1
+ Last 2 versions
2
+ Explorer >= 11
3
+ Android >= 4.4
data/circle.yml ADDED
@@ -0,0 +1,17 @@
1
+ machine:
2
+ ruby:
3
+ version: 2.3.1
4
+ services:
5
+ - redis
6
+ general:
7
+ artifacts:
8
+ - "tmp/capybara"
9
+ dependencies:
10
+ post:
11
+ - bundle exec rake rubocop
12
+ - bundle exec rake server:test:
13
+ background: true
14
+ - bin/jetty_wait
15
+ notify:
16
+ webhooks:
17
+ - url: https://coveralls.io/webhook?repo_token=c3AnaQOFVYYTitAR1w6ySNScXSIfLQwN4
data/config/fedora.yml ADDED
@@ -0,0 +1,10 @@
1
+ development:
2
+ user: fedoraAdmin
3
+ password: fedoraAdmin
4
+ url: http://localhost:<%= ENV['FCREPO_DEVELOPMENT_PORT'] || 8986 %>/rest
5
+ base_path: /dev
6
+ test:
7
+ user: fedoraAdmin
8
+ password: fedoraAdmin
9
+ url: http://localhost:<%= ENV['FCREPO_TEST_PORT'] || 8988 %>/rest
10
+ base_path: /test
@@ -1,7 +1,15 @@
1
1
  # frozen_string_literal: true
2
2
  class CreateOrmResources < ActiveRecord::Migration[5.0]
3
+ def options
4
+ if ENV["VALKYRIE_ID_TYPE"] == "string"
5
+ { id: :text, default: -> { '(uuid_generate_v4())::text' } }
6
+ else
7
+ { id: :uuid }
8
+ end
9
+ end
10
+
3
11
  def change
4
- create_table :orm_resources, id: :uuid do |t|
12
+ create_table :orm_resources, **options do |t|
5
13
  t.jsonb :metadata, null: false, default: {}
6
14
  t.timestamps
7
15
  end
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+ class CreatePathGinIndex < ActiveRecord::Migration[5.1]
3
+ def change
4
+ add_index :orm_resources, 'metadata jsonb_path_ops', using: :gin
5
+ end
6
+ end
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+ class CreateInternalResourceIndex < ActiveRecord::Migration[5.1]
3
+ def change
4
+ add_index :orm_resources, :internal_resource
5
+ end
6
+ end
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+ class CreateUpdatedAtIndex < ActiveRecord::Migration[5.1]
3
+ def change
4
+ add_index :orm_resources, :updated_at
5
+ end
6
+ end
@@ -4,7 +4,7 @@ require 'rails_helper'
4
4
  require 'valkyrie/specs/shared_specs'
5
5
 
6
6
  RSpec.describe <%= class_name %> do
7
- let(:model_klass) { described_class }
7
+ let(:resource_class) { described_class }
8
8
  it_behaves_like "a Valkyrie::Resource"
9
9
 
10
10
  it "has tests" do
data/lib/valkyrie.rb CHANGED
@@ -15,11 +15,9 @@ require 'json/ld'
15
15
  require 'logger'
16
16
  require 'active_triples'
17
17
  require 'rdf/vocab'
18
+ require 'rails'
18
19
  require 'active_fedora'
19
- require 'hydra-access-controls'
20
- require 'ruby_tika_app'
21
20
 
22
- # frozen_string_literal: true
23
21
  module Valkyrie
24
22
  require 'valkyrie/id'
25
23
  require 'valkyrie/change_set'
@@ -27,13 +25,9 @@ module Valkyrie
27
25
  require 'valkyrie/persistence'
28
26
  require 'valkyrie/types'
29
27
  require 'valkyrie/resource'
30
- require 'valkyrie/derivative_service'
31
28
  require 'valkyrie/storage_adapter'
32
29
  require 'valkyrie/metadata_adapter'
33
30
  require 'valkyrie/adapter_container'
34
- require 'valkyrie/file_characterization_service'
35
- require 'valkyrie/decorators/decorator_list'
36
- require 'valkyrie/decorators/decorator_with_arguments'
37
31
  require 'valkyrie/resource/access_controls'
38
32
  require 'valkyrie/indexers/access_controls_indexer'
39
33
  require 'valkyrie/storage'
@@ -14,6 +14,8 @@ module Valkyrie
14
14
  # property :title, multiple: false, required: true
15
15
  # end
16
16
  class ChangeSet < Reform::Form
17
+ include Reform::Form::ORM
18
+ include Reform::Form::ModelReflections
17
19
  include Reform::Form::ActiveModel::Validations
18
20
  feature Coercion
19
21
  class_attribute :fields
@@ -28,17 +30,17 @@ module Valkyrie
28
30
  end
29
31
 
30
32
  # Returns whether or not a given field has multiple values.
31
- # @param field [Symbol]
33
+ # @param field_name [Symbol]
32
34
  # @return [Boolean]
33
- def multiple?(field)
34
- self.class.definitions[field.to_s][:multiple] != false
35
+ def multiple?(field_name)
36
+ field(field_name)[:multiple] != false
35
37
  end
36
38
 
37
39
  # Returns whether or not a given field is required.
38
- # @param field [Symbol]
40
+ # @param field_name [Symbol]
39
41
  # @return [Boolean]
40
- def required?(field)
41
- self.class.definitions[field.to_s][:required]
42
+ def required?(field_name)
43
+ field(field_name)[:required] == true
42
44
  end
43
45
 
44
46
  # Quick setter for fields that should be in a changeset. Defaults to multiple,
@@ -70,15 +72,27 @@ module Valkyrie
70
72
  # override of Reform::Form's method to allow for single-valued fields to
71
73
  # prepopulate appropriately.
72
74
  def prepopulate!(_options = {})
73
- self.class.definitions.select { |_field, definition| definition[:multiple] == false }.each do |field, _definition|
75
+ self.class.definitions.select { |_field, definition| definition[:multiple] == false }.each_key do |field|
74
76
  value = Array.wrap(send(field.to_s)).first
75
77
  send("#{field}=", value)
76
78
  end
79
+ super
77
80
  self
78
81
  end
79
82
 
80
83
  def resource
81
84
  model
82
85
  end
86
+
87
+ def valid?
88
+ errors.clear
89
+ super
90
+ end
91
+
92
+ private
93
+
94
+ def field(field_name)
95
+ self.class.definitions.fetch(field_name.to_s)
96
+ end
83
97
  end
84
98
  end
@@ -1,4 +1,6 @@
1
1
  # frozen_string_literal: true
2
+
3
+ require 'rails/engine'
2
4
  ##
3
5
  # This engine exists for the sole purpose of enabling the
4
6
  # `valkyrie_engine:install:migrations` rake task from an including Rails
data/lib/valkyrie/id.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
  module Valkyrie
3
+ # A simple ID class to keep IDs distinguished from strings
3
4
  class ID
4
5
  attr_reader :id
5
6
  delegate :empty?, to: :id
@@ -1,19 +1,63 @@
1
1
  # frozen_string_literal: true
2
2
  module Valkyrie::Indexers
3
+ # Provides an optional interface consistent with Hydra::AccessControls
4
+ # This allows for storing access control information into an index
5
+ #
6
+ # @note This is used primarily with Solr
7
+ #
8
+ # @example Use in Solr Adapter with a CompositeIndexer
9
+ #
10
+ # # insert into config/initializers/valkyrie.rb
11
+ # Valkyrie::MetadataAdapter.register(
12
+ # Valkyrie::Persistence::Solr::MetadataAdapter.new(
13
+ # connection: Blacklight.default_index.connection,
14
+ # resource_indexer: Valkyrie::Persistence::Solr::CompositeIndexer.new(
15
+ # Valkyrie::Indexers::AccessControlsIndexer,
16
+ # Collection::TypeIndexer
17
+ # )
18
+ # ),
19
+ # :index_solr
20
+ # )
21
+ #
22
+ # @see https://github.com/pulibrary/figgy/blob/684a4fb71cad1c9592d8272416f36e2a4f4ae3c4/config/initializers/valkyrie.rb#L82
23
+ # @see lib/valkyrie/resource/access_controls.rb
3
24
  class AccessControlsIndexer
4
- attr_reader :resource
5
- def initialize(resource:)
25
+ attr_reader :resource, :config
26
+ def initialize(resource:, config: default_config)
6
27
  @resource = resource
28
+ @config = config
7
29
  end
8
30
 
9
31
  def to_solr
10
32
  return {} unless resource.respond_to?(:read_users)
11
33
  {
12
- Hydra.config[:permissions][:read].group => resource.read_groups,
13
- Hydra.config[:permissions][:read].individual => resource.read_users,
14
- Hydra.config[:permissions][:edit].individual => resource.edit_users,
15
- Hydra.config[:permissions][:edit].group => resource.edit_groups
34
+ config.fetch(:read_groups) => resource.read_groups,
35
+ config.fetch(:read_users) => resource.read_users,
36
+ config.fetch(:edit_users) => resource.edit_users,
37
+ config.fetch(:edit_groups) => resource.edit_groups
16
38
  }
17
39
  end
40
+
41
+ private
42
+
43
+ # rubocop:disable Metrics/MethodLength
44
+ def default_config
45
+ if defined?(Hydra) && Hydra.respond_to?(:config)
46
+ {
47
+ read_groups: Hydra.config[:permissions][:read].group,
48
+ read_users: Hydra.config[:permissions][:read].individual,
49
+ edit_groups: Hydra.config[:permissions][:edit].group,
50
+ edit_users: Hydra.config[:permissions][:edit].individual
51
+ }
52
+ else
53
+ {
54
+ read_groups: 'read_access_group_ssim',
55
+ read_users: 'read_access_person_ssim',
56
+ edit_groups: 'edit_access_group_ssim',
57
+ edit_users: 'edit_access_person_ssim'
58
+ }
59
+ end
60
+ end
61
+ # rubocop:enable Metrics/MethodLength
18
62
  end
19
63
  end