blacklight-access_controls 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (99) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +10 -0
  3. data/Gemfile +32 -0
  4. data/README.textile +74 -0
  5. data/Rakefile +47 -0
  6. data/VERSION +1 -0
  7. data/blacklight-access_controls.gemspec +29 -0
  8. data/lib/blacklight-access_controls.rb +23 -0
  9. data/lib/blacklight/access_controls.rb +14 -0
  10. data/lib/blacklight/access_controls/ability.rb +148 -0
  11. data/lib/blacklight/access_controls/catalog.rb +27 -0
  12. data/lib/blacklight/access_controls/config.rb +39 -0
  13. data/lib/blacklight/access_controls/enforcement.rb +103 -0
  14. data/lib/blacklight/access_controls/permissions_cache.rb +19 -0
  15. data/lib/blacklight/access_controls/permissions_query.rb +53 -0
  16. data/lib/blacklight/access_controls/permissions_solr_document.rb +2 -0
  17. data/lib/blacklight/access_controls/user.rb +23 -0
  18. data/lib/generators/blacklight/ability.rb +4 -0
  19. data/lib/generators/blacklight/access_controls_generator.rb +49 -0
  20. data/solr_conf/conf/abc123 +0 -0
  21. data/solr_conf/conf/admin-extra.html +24 -0
  22. data/solr_conf/conf/admin-extra.menu-bottom.html +25 -0
  23. data/solr_conf/conf/admin-extra.menu-top.html +25 -0
  24. data/solr_conf/conf/clustering/carrot2/kmeans-attributes.xml +19 -0
  25. data/solr_conf/conf/clustering/carrot2/lingo-attributes.xml +24 -0
  26. data/solr_conf/conf/clustering/carrot2/stc-attributes.xml +19 -0
  27. data/solr_conf/conf/currency.xml +67 -0
  28. data/solr_conf/conf/dataimport.properties +3 -0
  29. data/solr_conf/conf/db-data-config.xml +93 -0
  30. data/solr_conf/conf/elevate.xml +38 -0
  31. data/solr_conf/conf/lang/contractions_ca.txt +8 -0
  32. data/solr_conf/conf/lang/contractions_fr.txt +15 -0
  33. data/solr_conf/conf/lang/contractions_ga.txt +5 -0
  34. data/solr_conf/conf/lang/contractions_it.txt +23 -0
  35. data/solr_conf/conf/lang/hyphenations_ga.txt +5 -0
  36. data/solr_conf/conf/lang/stemdict_nl.txt +6 -0
  37. data/solr_conf/conf/lang/stoptags_ja.txt +420 -0
  38. data/solr_conf/conf/lang/stopwords_ar.txt +125 -0
  39. data/solr_conf/conf/lang/stopwords_bg.txt +193 -0
  40. data/solr_conf/conf/lang/stopwords_ca.txt +220 -0
  41. data/solr_conf/conf/lang/stopwords_ckb.txt +136 -0
  42. data/solr_conf/conf/lang/stopwords_cz.txt +172 -0
  43. data/solr_conf/conf/lang/stopwords_da.txt +110 -0
  44. data/solr_conf/conf/lang/stopwords_de.txt +294 -0
  45. data/solr_conf/conf/lang/stopwords_el.txt +78 -0
  46. data/solr_conf/conf/lang/stopwords_en.txt +54 -0
  47. data/solr_conf/conf/lang/stopwords_es.txt +356 -0
  48. data/solr_conf/conf/lang/stopwords_eu.txt +99 -0
  49. data/solr_conf/conf/lang/stopwords_fa.txt +313 -0
  50. data/solr_conf/conf/lang/stopwords_fi.txt +97 -0
  51. data/solr_conf/conf/lang/stopwords_fr.txt +186 -0
  52. data/solr_conf/conf/lang/stopwords_ga.txt +110 -0
  53. data/solr_conf/conf/lang/stopwords_gl.txt +161 -0
  54. data/solr_conf/conf/lang/stopwords_hi.txt +235 -0
  55. data/solr_conf/conf/lang/stopwords_hu.txt +211 -0
  56. data/solr_conf/conf/lang/stopwords_hy.txt +46 -0
  57. data/solr_conf/conf/lang/stopwords_id.txt +359 -0
  58. data/solr_conf/conf/lang/stopwords_it.txt +303 -0
  59. data/solr_conf/conf/lang/stopwords_ja.txt +127 -0
  60. data/solr_conf/conf/lang/stopwords_lv.txt +172 -0
  61. data/solr_conf/conf/lang/stopwords_nl.txt +119 -0
  62. data/solr_conf/conf/lang/stopwords_no.txt +194 -0
  63. data/solr_conf/conf/lang/stopwords_pt.txt +253 -0
  64. data/solr_conf/conf/lang/stopwords_ro.txt +233 -0
  65. data/solr_conf/conf/lang/stopwords_ru.txt +243 -0
  66. data/solr_conf/conf/lang/stopwords_sv.txt +133 -0
  67. data/solr_conf/conf/lang/stopwords_th.txt +119 -0
  68. data/solr_conf/conf/lang/stopwords_tr.txt +212 -0
  69. data/solr_conf/conf/lang/userdict_ja.txt +29 -0
  70. data/solr_conf/conf/mapping-FoldToASCII.txt +3813 -0
  71. data/solr_conf/conf/mapping-ISOLatin1Accent.txt +246 -0
  72. data/solr_conf/conf/protwords.txt +21 -0
  73. data/solr_conf/conf/schema.blacklight.xml +724 -0
  74. data/solr_conf/conf/schema.xml +1268 -0
  75. data/solr_conf/conf/schema.xml.orig +1524 -0
  76. data/solr_conf/conf/solrconfig.adams.xml +1903 -0
  77. data/solr_conf/conf/solrconfig.blacklight.xml +411 -0
  78. data/solr_conf/conf/solrconfig.old.xml +1634 -0
  79. data/solr_conf/conf/solrconfig.xml +332 -0
  80. data/solr_conf/conf/solrconfig.xml.orig +3531 -0
  81. data/solr_conf/conf/spellings.txt +2 -0
  82. data/solr_conf/conf/stopwords.txt +14 -0
  83. data/solr_conf/conf/synonyms.txt +29 -0
  84. data/solr_conf/conf/update-script.js +53 -0
  85. data/solr_conf/conf/xslt/example.xsl +132 -0
  86. data/solr_conf/conf/xslt/example_atom.xsl +67 -0
  87. data/solr_conf/conf/xslt/example_rss.xsl +66 -0
  88. data/solr_conf/conf/xslt/luke.xsl +337 -0
  89. data/solr_conf/conf/xslt/updateXml.xsl +70 -0
  90. data/spec/factories/user.rb +6 -0
  91. data/spec/spec_helper.rb +29 -0
  92. data/spec/support/solr_support.rb +11 -0
  93. data/spec/test_app_templates/blacklight.yml +18 -0
  94. data/spec/test_app_templates/lib/generators/test_app_generator.rb +25 -0
  95. data/spec/unit/ability_spec.rb +202 -0
  96. data/spec/unit/catalog_spec.rb +41 -0
  97. data/spec/unit/config_spec.rb +69 -0
  98. data/spec/unit/enforcement_spec.rb +147 -0
  99. metadata +265 -0
@@ -0,0 +1,147 @@
1
+ require 'spec_helper'
2
+
3
+ describe Blacklight::AccessControls::Enforcement do
4
+ let(:controller) { CatalogController.new }
5
+ let(:search_builder) { SearchBuilder.new(method_chain, context) }
6
+ let(:method_chain) { CatalogController.search_params_logic }
7
+ let(:context) { controller }
8
+
9
+ let(:user) { User.new }
10
+ let(:ability) { Ability.new(user) }
11
+
12
+ subject { search_builder }
13
+
14
+ describe "When I am searching for content" do
15
+ before do
16
+ @solr_parameters = {}
17
+ end
18
+
19
+ context "Given I am not logged in" do
20
+ before do
21
+ subject.current_ability = ability
22
+ subject.send(:apply_gated_discovery, @solr_parameters)
23
+ end
24
+
25
+ it "Then I should be treated as a member of the 'public' group" do
26
+ expect(@solr_parameters[:fq].first).to eq 'discover_access_group_ssim:public OR read_access_group_ssim:public'
27
+ end
28
+
29
+ it "Then I should not be treated as a member of the 'registered' group" do
30
+ expect(@solr_parameters[:fq].first).to_not match(/registered/)
31
+ end
32
+ end
33
+
34
+ context "Given I am a registered user" do
35
+ let(:user) { create(:user) }
36
+
37
+ before do
38
+ allow(user).to receive(:groups) { ["faculty", "africana-faculty"] }
39
+ subject.current_ability = Ability.new(user)
40
+ subject.send(:apply_gated_discovery, @solr_parameters)
41
+ end
42
+
43
+ it "Then I should be treated as a member of the 'public' and 'registered' groups" do
44
+ ["discover","read"].each do |type|
45
+ expect(@solr_parameters[:fq].first).to match(/#{type}_access_group_ssim\:public/)
46
+ expect(@solr_parameters[:fq].first).to match(/#{type}_access_group_ssim\:registered/)
47
+ end
48
+ end
49
+
50
+ it "Then I should see assets that I have discover or read access to" do
51
+ ["discover","read"].each do |type|
52
+ expect(@solr_parameters[:fq].first).to match(/#{type}_access_person_ssim\:#{user.user_key}/)
53
+ end
54
+ end
55
+
56
+ it "Then I should see assets that my groups have discover or read access to" do
57
+ ["faculty", "africana-faculty"].each do |group_id|
58
+ ["discover","read"].each do |type|
59
+ expect(@solr_parameters[:fq].first).to match(/#{type}_access_group_ssim\:#{group_id}/)
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
65
+
66
+ describe "apply_gated_discovery" do
67
+ let(:user) { create(:user) }
68
+ let(:groups) { ["archivist","researcher"] }
69
+
70
+ before do
71
+ allow(user).to receive(:groups) { groups }
72
+ subject.current_ability = Ability.new(user)
73
+ @solr_parameters = {}
74
+ end
75
+
76
+ it "should set query fields for the user id checking against the discover, read fields" do
77
+ subject.send(:apply_gated_discovery, @solr_parameters)
78
+ ["discover","read"].each do |type|
79
+ expect(@solr_parameters[:fq].first).to match(/#{type}_access_person_ssim\:#{user.user_key}/)
80
+ end
81
+ end
82
+
83
+ it "should set query fields for all roles the user is a member of checking against the discover, read fields" do
84
+ subject.send(:apply_gated_discovery, @solr_parameters)
85
+ ["discover","read"].each do |type|
86
+ expect(@solr_parameters[:fq].first).to match(/#{type}_access_group_ssim\:archivist/)
87
+ expect(@solr_parameters[:fq].first).to match(/#{type}_access_group_ssim\:researcher/)
88
+ end
89
+ end
90
+
91
+ context 'slashes in the group names' do
92
+ let(:groups) { ["abc/123","cde/567"] }
93
+
94
+ it "should escape slashes" do
95
+ subject.send(:apply_gated_discovery, @solr_parameters)
96
+ ["discover","read"].each do |type|
97
+ expect(@solr_parameters[:fq].first).to match(/#{type}_access_group_ssim\:abc\\\/123/)
98
+ expect(@solr_parameters[:fq].first).to match(/#{type}_access_group_ssim\:cde\\\/567/)
99
+ end
100
+ end
101
+ end
102
+
103
+ context 'spaces in the group names' do
104
+ let(:groups) { ["abc 123","cd/e 567"] }
105
+
106
+ it "should escape spaces" do
107
+ subject.send(:apply_gated_discovery, @solr_parameters)
108
+ ["discover","read"].each do |type|
109
+ expect(@solr_parameters[:fq].first).to match(/#{type}_access_group_ssim\:abc\\ 123/)
110
+ expect(@solr_parameters[:fq].first).to match(/#{type}_access_group_ssim\:cd\\\/e\\ 567/)
111
+ end
112
+ end
113
+ end
114
+
115
+ context 'colons in the groups names' do
116
+ let(:groups) { ["abc:123","cde:567"] }
117
+
118
+ it "should escape colons" do
119
+ subject.send(:apply_gated_discovery, @solr_parameters)
120
+ ["discover","read"].each do |type|
121
+ expect(@solr_parameters[:fq].first).to match(/#{type}_access_group_ssim\:abc\\:123/)
122
+ expect(@solr_parameters[:fq].first).to match(/#{type}_access_group_ssim\:cde\\:567/)
123
+ end
124
+ end
125
+ end
126
+ end
127
+
128
+ describe "apply_user_permissions" do
129
+ describe "when the user is a guest user (user key nil)" do
130
+ before { subject.current_ability = ability }
131
+
132
+ it "should not create filters" do
133
+ expect(subject.send(:apply_user_permissions, ["discover","read"])).to eq []
134
+ end
135
+ end
136
+
137
+ describe "when the user is a guest user (user key empty string)" do
138
+ let(:user) { User.new(email: '') }
139
+ before { subject.current_ability = ability }
140
+
141
+ it "should not create filters" do
142
+ expect(subject.send(:apply_user_permissions, ["discover","read"])).to eq []
143
+ end
144
+ end
145
+ end
146
+
147
+ end
metadata ADDED
@@ -0,0 +1,265 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: blacklight-access_controls
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Chris Beer
8
+ - Justin Coyne
9
+ - Matt Zumwalt
10
+ - Valerie Maher
11
+ autorequire:
12
+ bindir: bin
13
+ cert_chain: []
14
+ date: 2015-12-01 00:00:00.000000000 Z
15
+ dependencies:
16
+ - !ruby/object:Gem::Dependency
17
+ name: cancancan
18
+ requirement: !ruby/object:Gem::Requirement
19
+ requirements:
20
+ - - "~>"
21
+ - !ruby/object:Gem::Version
22
+ version: '1.8'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '1.8'
30
+ - !ruby/object:Gem::Dependency
31
+ name: blacklight
32
+ requirement: !ruby/object:Gem::Requirement
33
+ requirements:
34
+ - - "~>"
35
+ - !ruby/object:Gem::Version
36
+ version: '5.16'
37
+ type: :runtime
38
+ prerelease: false
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - "~>"
42
+ - !ruby/object:Gem::Version
43
+ version: '5.16'
44
+ - !ruby/object:Gem::Dependency
45
+ name: rake
46
+ requirement: !ruby/object:Gem::Requirement
47
+ requirements:
48
+ - - "~>"
49
+ - !ruby/object:Gem::Version
50
+ version: '10.1'
51
+ type: :development
52
+ prerelease: false
53
+ version_requirements: !ruby/object:Gem::Requirement
54
+ requirements:
55
+ - - "~>"
56
+ - !ruby/object:Gem::Version
57
+ version: '10.1'
58
+ - !ruby/object:Gem::Dependency
59
+ name: rspec
60
+ requirement: !ruby/object:Gem::Requirement
61
+ requirements:
62
+ - - "~>"
63
+ - !ruby/object:Gem::Version
64
+ version: '3.1'
65
+ type: :development
66
+ prerelease: false
67
+ version_requirements: !ruby/object:Gem::Requirement
68
+ requirements:
69
+ - - "~>"
70
+ - !ruby/object:Gem::Version
71
+ version: '3.1'
72
+ - !ruby/object:Gem::Dependency
73
+ name: engine_cart
74
+ requirement: !ruby/object:Gem::Requirement
75
+ requirements:
76
+ - - "~>"
77
+ - !ruby/object:Gem::Version
78
+ version: '0.8'
79
+ type: :development
80
+ prerelease: false
81
+ version_requirements: !ruby/object:Gem::Requirement
82
+ requirements:
83
+ - - "~>"
84
+ - !ruby/object:Gem::Version
85
+ version: '0.8'
86
+ - !ruby/object:Gem::Dependency
87
+ name: solr_wrapper
88
+ requirement: !ruby/object:Gem::Requirement
89
+ requirements:
90
+ - - ">="
91
+ - !ruby/object:Gem::Version
92
+ version: '0'
93
+ type: :development
94
+ prerelease: false
95
+ version_requirements: !ruby/object:Gem::Requirement
96
+ requirements:
97
+ - - ">="
98
+ - !ruby/object:Gem::Version
99
+ version: '0'
100
+ - !ruby/object:Gem::Dependency
101
+ name: factory_girl_rails
102
+ requirement: !ruby/object:Gem::Requirement
103
+ requirements:
104
+ - - "~>"
105
+ - !ruby/object:Gem::Version
106
+ version: '4.0'
107
+ type: :development
108
+ prerelease: false
109
+ version_requirements: !ruby/object:Gem::Requirement
110
+ requirements:
111
+ - - "~>"
112
+ - !ruby/object:Gem::Version
113
+ version: '4.0'
114
+ - !ruby/object:Gem::Dependency
115
+ name: database_cleaner
116
+ requirement: !ruby/object:Gem::Requirement
117
+ requirements:
118
+ - - ">="
119
+ - !ruby/object:Gem::Version
120
+ version: '0'
121
+ type: :development
122
+ prerelease: false
123
+ version_requirements: !ruby/object:Gem::Requirement
124
+ requirements:
125
+ - - ">="
126
+ - !ruby/object:Gem::Version
127
+ version: '0'
128
+ description: Access controls for blacklight-based applications
129
+ email:
130
+ - blacklight-development@googlegroups.com
131
+ executables: []
132
+ extensions: []
133
+ extra_rdoc_files: []
134
+ files:
135
+ - ".gitignore"
136
+ - Gemfile
137
+ - README.textile
138
+ - Rakefile
139
+ - VERSION
140
+ - blacklight-access_controls.gemspec
141
+ - lib/blacklight-access_controls.rb
142
+ - lib/blacklight/access_controls.rb
143
+ - lib/blacklight/access_controls/ability.rb
144
+ - lib/blacklight/access_controls/catalog.rb
145
+ - lib/blacklight/access_controls/config.rb
146
+ - lib/blacklight/access_controls/enforcement.rb
147
+ - lib/blacklight/access_controls/permissions_cache.rb
148
+ - lib/blacklight/access_controls/permissions_query.rb
149
+ - lib/blacklight/access_controls/permissions_solr_document.rb
150
+ - lib/blacklight/access_controls/user.rb
151
+ - lib/generators/blacklight/ability.rb
152
+ - lib/generators/blacklight/access_controls_generator.rb
153
+ - solr_conf/conf/abc123
154
+ - solr_conf/conf/admin-extra.html
155
+ - solr_conf/conf/admin-extra.menu-bottom.html
156
+ - solr_conf/conf/admin-extra.menu-top.html
157
+ - solr_conf/conf/clustering/carrot2/kmeans-attributes.xml
158
+ - solr_conf/conf/clustering/carrot2/lingo-attributes.xml
159
+ - solr_conf/conf/clustering/carrot2/stc-attributes.xml
160
+ - solr_conf/conf/currency.xml
161
+ - solr_conf/conf/dataimport.properties
162
+ - solr_conf/conf/db-data-config.xml
163
+ - solr_conf/conf/elevate.xml
164
+ - solr_conf/conf/lang/contractions_ca.txt
165
+ - solr_conf/conf/lang/contractions_fr.txt
166
+ - solr_conf/conf/lang/contractions_ga.txt
167
+ - solr_conf/conf/lang/contractions_it.txt
168
+ - solr_conf/conf/lang/hyphenations_ga.txt
169
+ - solr_conf/conf/lang/stemdict_nl.txt
170
+ - solr_conf/conf/lang/stoptags_ja.txt
171
+ - solr_conf/conf/lang/stopwords_ar.txt
172
+ - solr_conf/conf/lang/stopwords_bg.txt
173
+ - solr_conf/conf/lang/stopwords_ca.txt
174
+ - solr_conf/conf/lang/stopwords_ckb.txt
175
+ - solr_conf/conf/lang/stopwords_cz.txt
176
+ - solr_conf/conf/lang/stopwords_da.txt
177
+ - solr_conf/conf/lang/stopwords_de.txt
178
+ - solr_conf/conf/lang/stopwords_el.txt
179
+ - solr_conf/conf/lang/stopwords_en.txt
180
+ - solr_conf/conf/lang/stopwords_es.txt
181
+ - solr_conf/conf/lang/stopwords_eu.txt
182
+ - solr_conf/conf/lang/stopwords_fa.txt
183
+ - solr_conf/conf/lang/stopwords_fi.txt
184
+ - solr_conf/conf/lang/stopwords_fr.txt
185
+ - solr_conf/conf/lang/stopwords_ga.txt
186
+ - solr_conf/conf/lang/stopwords_gl.txt
187
+ - solr_conf/conf/lang/stopwords_hi.txt
188
+ - solr_conf/conf/lang/stopwords_hu.txt
189
+ - solr_conf/conf/lang/stopwords_hy.txt
190
+ - solr_conf/conf/lang/stopwords_id.txt
191
+ - solr_conf/conf/lang/stopwords_it.txt
192
+ - solr_conf/conf/lang/stopwords_ja.txt
193
+ - solr_conf/conf/lang/stopwords_lv.txt
194
+ - solr_conf/conf/lang/stopwords_nl.txt
195
+ - solr_conf/conf/lang/stopwords_no.txt
196
+ - solr_conf/conf/lang/stopwords_pt.txt
197
+ - solr_conf/conf/lang/stopwords_ro.txt
198
+ - solr_conf/conf/lang/stopwords_ru.txt
199
+ - solr_conf/conf/lang/stopwords_sv.txt
200
+ - solr_conf/conf/lang/stopwords_th.txt
201
+ - solr_conf/conf/lang/stopwords_tr.txt
202
+ - solr_conf/conf/lang/userdict_ja.txt
203
+ - solr_conf/conf/mapping-FoldToASCII.txt
204
+ - solr_conf/conf/mapping-ISOLatin1Accent.txt
205
+ - solr_conf/conf/protwords.txt
206
+ - solr_conf/conf/schema.blacklight.xml
207
+ - solr_conf/conf/schema.xml
208
+ - solr_conf/conf/schema.xml.orig
209
+ - solr_conf/conf/solrconfig.adams.xml
210
+ - solr_conf/conf/solrconfig.blacklight.xml
211
+ - solr_conf/conf/solrconfig.old.xml
212
+ - solr_conf/conf/solrconfig.xml
213
+ - solr_conf/conf/solrconfig.xml.orig
214
+ - solr_conf/conf/spellings.txt
215
+ - solr_conf/conf/stopwords.txt
216
+ - solr_conf/conf/synonyms.txt
217
+ - solr_conf/conf/update-script.js
218
+ - solr_conf/conf/xslt/example.xsl
219
+ - solr_conf/conf/xslt/example_atom.xsl
220
+ - solr_conf/conf/xslt/example_rss.xsl
221
+ - solr_conf/conf/xslt/luke.xsl
222
+ - solr_conf/conf/xslt/updateXml.xsl
223
+ - spec/factories/user.rb
224
+ - spec/spec_helper.rb
225
+ - spec/support/solr_support.rb
226
+ - spec/test_app_templates/blacklight.yml
227
+ - spec/test_app_templates/lib/generators/test_app_generator.rb
228
+ - spec/unit/ability_spec.rb
229
+ - spec/unit/catalog_spec.rb
230
+ - spec/unit/config_spec.rb
231
+ - spec/unit/enforcement_spec.rb
232
+ homepage: https://github.com/projectblacklight/blacklight-access_controls
233
+ licenses:
234
+ - APACHE2
235
+ metadata: {}
236
+ post_install_message:
237
+ rdoc_options: []
238
+ require_paths:
239
+ - lib
240
+ required_ruby_version: !ruby/object:Gem::Requirement
241
+ requirements:
242
+ - - ">="
243
+ - !ruby/object:Gem::Version
244
+ version: 1.9.3
245
+ required_rubygems_version: !ruby/object:Gem::Requirement
246
+ requirements:
247
+ - - ">="
248
+ - !ruby/object:Gem::Version
249
+ version: '0'
250
+ requirements: []
251
+ rubyforge_project:
252
+ rubygems_version: 2.4.5.1
253
+ signing_key:
254
+ specification_version: 4
255
+ summary: Access controls for blacklight-based applications
256
+ test_files:
257
+ - spec/factories/user.rb
258
+ - spec/spec_helper.rb
259
+ - spec/support/solr_support.rb
260
+ - spec/test_app_templates/blacklight.yml
261
+ - spec/test_app_templates/lib/generators/test_app_generator.rb
262
+ - spec/unit/ability_spec.rb
263
+ - spec/unit/catalog_spec.rb
264
+ - spec/unit/config_spec.rb
265
+ - spec/unit/enforcement_spec.rb