ddr-models 2.0.1 → 2.1.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 (92) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +23 -17
  3. data/app/models/collection.rb +1 -35
  4. data/ddr-models.gemspec +2 -1
  5. data/lib/ddr/actions.rb +1 -0
  6. data/lib/ddr/actions/virus_check.rb +28 -0
  7. data/lib/ddr/auth.rb +4 -0
  8. data/lib/ddr/auth/ability_definitions/datastream_ability_definitions.rb +7 -5
  9. data/lib/ddr/auth/grouper_gateway.rb +9 -1
  10. data/lib/ddr/auth/permissions.rb +2 -1
  11. data/lib/ddr/auth/role_based_access_controls_enforcement.rb +5 -5
  12. data/lib/ddr/auth/roles/role_types.rb +2 -1
  13. data/lib/ddr/datastreams.rb +2 -2
  14. data/lib/ddr/datastreams/administrative_metadata_datastream.rb +27 -14
  15. data/lib/ddr/datastreams/datastream_behavior.rb +13 -0
  16. data/lib/ddr/datastreams/fits_datastream.rb +88 -0
  17. data/lib/ddr/derivatives/png_generator.rb +2 -0
  18. data/lib/ddr/derivatives/ptif_generator.rb +2 -0
  19. data/lib/ddr/events/fixity_check_event.rb +2 -2
  20. data/lib/ddr/events/virus_check_event.rb +2 -14
  21. data/lib/ddr/index.rb +29 -0
  22. data/lib/ddr/index/abstract_query_result.rb +23 -0
  23. data/lib/ddr/index/connection.rb +17 -0
  24. data/lib/ddr/index/csv_query_result.rb +61 -0
  25. data/lib/ddr/index/document_builder.rb +9 -0
  26. data/lib/ddr/index/field.rb +23 -0
  27. data/lib/ddr/index/fields.rb +83 -0
  28. data/lib/ddr/index/filter.rb +48 -0
  29. data/lib/ddr/index/filters.rb +19 -0
  30. data/lib/ddr/index/legacy_license_fields.rb +14 -0
  31. data/lib/ddr/index/query.rb +35 -0
  32. data/lib/ddr/index/query_builder.rb +74 -0
  33. data/lib/ddr/index/query_clause.rb +52 -0
  34. data/lib/ddr/index/query_result.rb +70 -0
  35. data/lib/ddr/index/query_value.rb +16 -0
  36. data/lib/ddr/index/response.rb +13 -0
  37. data/lib/ddr/index/unique_key_field.rb +12 -0
  38. data/lib/ddr/index_fields.rb +7 -53
  39. data/lib/ddr/jobs.rb +1 -1
  40. data/lib/ddr/jobs/fits_file_characterization.rb +51 -0
  41. data/lib/ddr/managers.rb +1 -0
  42. data/lib/ddr/managers/technical_metadata_manager.rb +104 -0
  43. data/lib/ddr/models.rb +39 -23
  44. data/lib/ddr/models/base.rb +0 -2
  45. data/lib/ddr/models/describable.rb +1 -1
  46. data/lib/ddr/models/effective_license.rb +9 -0
  47. data/lib/ddr/models/engine.rb +13 -0
  48. data/lib/ddr/models/file_management.rb +157 -160
  49. data/lib/ddr/models/governable.rb +0 -4
  50. data/lib/ddr/models/has_admin_metadata.rb +80 -72
  51. data/lib/ddr/models/has_children.rb +1 -1
  52. data/lib/ddr/models/has_content.rb +18 -0
  53. data/lib/ddr/models/has_struct_metadata.rb +5 -1
  54. data/lib/ddr/models/indexing.rb +32 -20
  55. data/lib/ddr/models/inherited_license.rb +13 -0
  56. data/lib/ddr/models/license.rb +38 -0
  57. data/lib/ddr/models/solr_document.rb +195 -211
  58. data/lib/ddr/models/version.rb +1 -1
  59. data/lib/ddr/models/year_facet.rb +154 -0
  60. data/lib/ddr/utils.rb +13 -1
  61. data/lib/ddr/vocab/roles.rb +0 -10
  62. data/spec/controllers/including_role_based_access_controls_enforcement_spec.rb +4 -4
  63. data/spec/datastreams/fits_datastream_spec.rb +84 -0
  64. data/spec/fixtures/fits/document.xml +65 -0
  65. data/spec/fixtures/fits/image.xml +59 -0
  66. data/spec/index/filter_spec.rb +47 -0
  67. data/spec/index/filters_spec.rb +17 -0
  68. data/spec/index/query_spec.rb +19 -0
  69. data/spec/jobs/fits_file_characterization_spec.rb +52 -0
  70. data/spec/managers/technical_metadata_manager_spec.rb +140 -0
  71. data/spec/models/active_fedora_datastream_spec.rb +44 -0
  72. data/spec/models/collection_spec.rb +7 -12
  73. data/spec/models/component_spec.rb +3 -6
  74. data/spec/models/effective_license_spec.rb +49 -0
  75. data/spec/models/has_admin_metadata_spec.rb +143 -194
  76. data/spec/models/has_struct_metadata_spec.rb +2 -2
  77. data/spec/models/indexing_spec.rb +40 -0
  78. data/spec/models/solr_document_spec.rb +96 -37
  79. data/spec/models/year_facet_spec.rb +65 -0
  80. data/spec/spec_helper.rb +1 -7
  81. data/spec/support/shared_examples_for_ddr_models.rb +0 -2
  82. data/spec/support/shared_examples_for_has_content.rb +37 -3
  83. metadata +79 -32
  84. data/lib/ddr/datastreams/properties_datastream.rb +0 -25
  85. data/lib/ddr/jobs/migrate_legacy_authorization.rb +0 -23
  86. data/lib/ddr/models/has_properties.rb +0 -15
  87. data/lib/ddr/models/licensable.rb +0 -28
  88. data/spec/auth/legacy_authorization_spec.rb +0 -94
  89. data/spec/auth/legacy_roles_spec.rb +0 -32
  90. data/spec/jobs/migrate_legacy_authorization_spec.rb +0 -43
  91. data/spec/support/shared_examples_for_has_properties.rb +0 -5
  92. data/spec/support/shared_examples_for_licensable.rb +0 -15
@@ -38,8 +38,8 @@ module Ddr
38
38
  before { item.datastreams[Ddr::Datastreams::STRUCT_METADATA].content = multiple_struct_maps_structure }
39
39
  it "should index the JSON representation of the structure" do
40
40
  indexing = item.to_solr
41
- expect(indexing.keys).to include(Ddr::IndexFields::STRUCT_MAPS)
42
- expect(indexing[Ddr::IndexFields::STRUCT_MAPS]).to eq(expected_json)
41
+ expect(indexing.keys).to include(Ddr::Index::Fields::STRUCT_MAPS)
42
+ expect(indexing[Ddr::Index::Fields::STRUCT_MAPS]).to eq(expected_json)
43
43
  end
44
44
  end
45
45
 
@@ -0,0 +1,40 @@
1
+ module Ddr::Models
2
+ RSpec.describe Indexing do
3
+
4
+ let(:obj) { FactoryGirl.build(:item) }
5
+
6
+ let(:role1) { FactoryGirl.build(:role, :curator, :person, :resource) }
7
+ let(:role2) { FactoryGirl.build(:role, :curator, :person, :policy) }
8
+ let(:role3) { FactoryGirl.build(:role, :editor, :group, :policy) }
9
+ let(:role4) { FactoryGirl.build(:role, :editor, :person, :policy) }
10
+
11
+ subject { obj.index_fields }
12
+
13
+ before do
14
+ obj.license = "cc-by-nc-nd-40"
15
+ obj.rightsMetadata.license.title = ["License Title"]
16
+ obj.rightsMetadata.license.description = ["License Description"]
17
+ obj.rightsMetadata.license.url = ["http://library.duke.edu"]
18
+ obj.local_id = "foo"
19
+ obj.adminMetadata.doi << "http://doi.org/10.1000/182"
20
+ obj.permanent_id = "ark:/99999/fk4zzz"
21
+ obj.permanent_url = "http://id.library.duke.edu/ark:/99999/fk4zzz"
22
+ obj.display_format = "Image"
23
+ obj.roles.grant role1, role2, role3, role4
24
+ end
25
+
26
+ its([Indexing::LICENSE]) { is_expected.to eq("cc-by-nc-nd-40") }
27
+ its([Indexing::LICENSE_TITLE]) { is_expected.to eq("License Title") }
28
+ its([Indexing::LICENSE_DESCRIPTION]) { is_expected.to eq("License Description") }
29
+ its([Indexing::LICENSE_URL]) { is_expected.to eq("http://library.duke.edu") }
30
+ its([Indexing::LOCAL_ID]) { is_expected.to eq("foo") }
31
+ its([Indexing::DOI]) { is_expected.to eq(["http://doi.org/10.1000/182"]) }
32
+ its([Indexing::PERMANENT_ID]) { is_expected.to eq("ark:/99999/fk4zzz") }
33
+ its([Indexing::PERMANENT_URL]) { is_expected.to eq("http://id.library.duke.edu/ark:/99999/fk4zzz") }
34
+ its([Indexing::DISPLAY_FORMAT]) { is_expected.to eq("Image") }
35
+ its([Indexing::ACCESS_ROLE]) { is_expected.to eq(obj.roles.to_json) }
36
+ its([Indexing::POLICY_ROLE]) { is_expected.to contain_exactly(role2.agent.first, role3.agent.first, role4.agent.first) }
37
+ its([Indexing::RESOURCE_ROLE]) { is_expected.to contain_exactly(role1.agent.first) }
38
+
39
+ end
40
+ end
@@ -2,32 +2,48 @@ require 'spec_helper'
2
2
 
3
3
  RSpec.describe SolrDocument, type: :model, contacts: true do
4
4
 
5
- describe "#inherited_license" do
6
- let(:apo_solr_response) { [{"system_create_dtsi"=>"2015-03-10T15:20:16Z", "system_modified_dtsi"=>"2015-03-10T15:21:50Z", "object_state_ssi"=>"A", "active_fedora_model_ssi"=>"Collection", "id"=>"changeme:224", "object_profile_ssm"=>["{\"datastreams\":{\"DC\":{\"dsLabel\":\"Dublin Core Record for this object\",\"dsVersionID\":\"DC1.0\",\"dsCreateDate\":\"2015-03-10T15:20:16Z\",\"dsState\":\"A\",\"dsMIME\":\"text/xml\",\"dsFormatURI\":\"http://www.openarchives.org/OAI/2.0/oai_dc/\",\"dsControlGroup\":\"X\",\"dsSize\":341,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"changeme:224+DC+DC1.0\",\"dsLocationType\":null,\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"0555f020bbfc94c07745f530af4195fed9cf4e4ba539a30727f2d2d5743627be\"},\"RELS-EXT\":{\"dsLabel\":\"Fedora Object-to-Object Relationship Metadata\",\"dsVersionID\":\"RELS-EXT.1\",\"dsCreateDate\":\"2015-03-10T15:20:18Z\",\"dsState\":\"A\",\"dsMIME\":\"application/rdf+xml\",\"dsFormatURI\":null,\"dsControlGroup\":\"X\",\"dsSize\":417,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"changeme:224+RELS-EXT+RELS-EXT.1\",\"dsLocationType\":null,\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"6a7c2621534cd1cb28d9cfa7e45bb128a1f3c05028e29def4dea479be9596d7d\"},\"descMetadata\":{\"dsLabel\":\"Descriptive Metadata for this object\",\"dsVersionID\":\"descMetadata.1\",\"dsCreateDate\":\"2015-03-10T15:20:18Z\",\"dsState\":\"A\",\"dsMIME\":\"application/n-triples\",\"dsFormatURI\":null,\"dsControlGroup\":\"M\",\"dsSize\":80,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"changeme:224+descMetadata+descMetadata.1\",\"dsLocationType\":\"INTERNAL_ID\",\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"bbba526a1ca47f19dfe110f25a0a721bda481dc414f7ec89e3f02c5562eaa9a2\"},\"rightsMetadata\":{\"dsLabel\":null,\"dsVersionID\":\"rightsMetadata.0\",\"dsCreateDate\":\"2015-03-10T15:20:17Z\",\"dsState\":\"A\",\"dsMIME\":\"text/xml\",\"dsFormatURI\":null,\"dsControlGroup\":\"M\",\"dsSize\":550,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"changeme:224+rightsMetadata+rightsMetadata.0\",\"dsLocationType\":\"INTERNAL_ID\",\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"210d5a228bd96e22b20723de1dd20ea8d897252063713d0815369c49045c5c05\"},\"properties\":{},\"thumbnail\":{},\"adminMetadata\":{},\"defaultRights\":{\"dsLabel\":null,\"dsVersionID\":\"defaultRights.0\",\"dsCreateDate\":\"2015-03-10T15:21:50Z\",\"dsState\":\"A\",\"dsMIME\":\"text/xml\",\"dsFormatURI\":null,\"dsControlGroup\":\"M\",\"dsSize\":634,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"changeme:224+defaultRights+defaultRights.0\",\"dsLocationType\":\"INTERNAL_ID\",\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"1a2d9e665228d5e3cbf5f8ddd0d641172c20f98b4e05d62f741b7b9010696ad0\"}},\"objLabel\":null,\"objOwnerId\":\"fedoraAdmin\",\"objModels\":[\"info:fedora/afmodel:Collection\",\"info:fedora/fedora-system:FedoraObject-3.0\"],\"objCreateDate\":\"2015-03-10T15:20:16Z\",\"objLastModDate\":\"2015-03-10T15:20:18Z\",\"objDissIndexViewURL\":\"http://localhost:8983/fedora/objects/changeme%3A224/methods/fedora-system%3A3/viewMethodIndex\",\"objItemIndexViewURL\":\"http://localhost:8983/fedora/objects/changeme%3A224/methods/fedora-system%3A3/viewItemIndex\",\"objState\":\"A\"}"], "title_tesim"=>["Test Collection"], "edit_access_person_ssim"=>["coblej@duke.edu"], "inheritable_read_access_group_ssim"=>["public"], "is_governed_by_ssim"=>["info:fedora/changeme:224"], "has_model_ssim"=>["info:fedora/afmodel:Collection"], "title_ssi"=>"Test Collection", "internal_uri_ssi"=>"info:fedora/changeme:224", "default_license_description_tesim"=>["Default License Description"], "default_license_title_tesim"=>["Default License Title"], "default_license_url_tesim"=>["http://test.license.org/"], "_version_"=>1495270331036729344, "timestamp"=>"2015-03-10T15:21:50.793Z"}] }
7
- before do
8
- allow(subject).to receive(:admin_policy_pid).and_return('changeme:224')
9
- allow(ActiveFedora::SolrService).to receive(:query).and_return(apo_solr_response)
5
+ describe "index field method access" do
6
+ describe "when there is an index field" do
7
+ before { Ddr::Index::Fields.const_set(:FOO_BAR, "foo_bar_ssim") }
8
+ after { Ddr::Index::Fields.send(:remove_const, :FOO_BAR) }
9
+ describe "and the field is not present" do
10
+ its(:foo_bar) { is_expected.to be_nil }
11
+ end
12
+ describe "and the field is a single value (not an array)" do
13
+ before { subject[Ddr::Index::Fields::FOO_BAR] = "foo" }
14
+ its(:foo_bar) { is_expected.to eq("foo") }
15
+ end
16
+ describe "and the field value is an array" do
17
+ before { subject[Ddr::Index::Fields::FOO_BAR] = ["foo", "bar"] }
18
+ its(:foo_bar) { is_expected.to eq("foo, bar") }
19
+ end
10
20
  end
11
- it "should return a hash of the default license attributes of the governing object" do
12
- expect(subject.inherited_license).to include(title: "Default License Title",
13
- description: "Default License Description",
14
- url: "http://test.license.org/")
21
+ describe "when there is no index field" do
22
+ it "should raise an exception" do
23
+ expect { subject.foo_bar }.to raise_error(NoMethodError)
24
+ end
15
25
  end
16
26
  end
17
27
 
18
- describe "#permanent_id" do
19
- before { subject[Ddr::IndexFields::PERMANENT_ID] = "foo" }
20
- its(:permanent_id) { is_expected.to eq("foo") }
28
+ describe "#admin_policy_uri" do
29
+ describe "when is_governed_by is not set" do
30
+ its(:admin_policy_uri) { is_expected.to be_nil }
31
+ end
32
+ describe "when is_governed_by is set" do
33
+ before { subject[Ddr::Index::Fields::IS_GOVERNED_BY] = "info:fedora/test:1" }
34
+ its(:admin_policy_uri) { should eq("info:fedora/test:1") }
35
+ end
21
36
  end
22
37
 
23
38
  describe "#admin_policy" do
24
- describe "when there is not admin policy relationship" do
39
+ describe "when there is not an admin policy relationship" do
40
+ before { allow(subject).to receive(:admin_policy_pid) { nil } }
25
41
  its(:admin_policy) { should be_nil }
26
42
  end
27
43
  describe "where there is an admin policy relationship" do
28
44
  let(:admin_policy) { FactoryGirl.create(:collection) }
29
45
  before do
30
- subject[Ddr::IndexFields::IS_GOVERNED_BY] = [ admin_policy.internal_uri ]
46
+ subject[Ddr::Index::Fields::IS_GOVERNED_BY] = [ admin_policy.internal_uri ]
31
47
  end
32
48
  it "should get the admin policy document" do
33
49
  expect(subject.admin_policy.id).to eq(admin_policy.id)
@@ -35,19 +51,39 @@ RSpec.describe SolrDocument, type: :model, contacts: true do
35
51
  end
36
52
  end
37
53
 
38
- describe "#local_id" do
39
- before { subject[Ddr::IndexFields::LOCAL_ID] = "abcdef" }
40
- its(:local_id) { is_expected.to eq("abcdef") }
54
+ describe "#parent_uri" do
55
+ describe "when is_part_of is present" do
56
+ before { subject[Ddr::Index::Fields::IS_PART_OF] = "info:fedora/test:1" }
57
+ its(:parent_uri) { is_expected.to eq("info:fedora/test:1") }
58
+ end
59
+ describe "when is_part_of is not present" do
60
+ describe "when is_member_of_collection is present" do
61
+ before { subject[Ddr::Index::Fields::IS_MEMBER_OF_COLLECTION] = "info:fedora/test:1" }
62
+ its(:parent_uri) { is_expected.to eq("info:fedora/test:1") }
63
+ end
64
+ describe "when is_member_of_collection is not present" do
65
+ its(:parent_uri) { is_expected.to be_nil }
66
+ end
67
+ end
41
68
  end
42
69
 
43
- describe "#admin_set" do
44
- before { subject[Ddr::IndexFields::ADMIN_SET] = "foobar" }
45
- its(:admin_set) { should eq("foobar") }
70
+ describe "#parent" do
71
+ describe "when there is a parent URI" do
72
+ let(:doc) { described_class.new({"id"=>"test:1"}) }
73
+ before do
74
+ allow(subject).to receive(:parent_uri) { "info:fedora/test:1" }
75
+ allow(described_class).to receive(:find).with("info:fedora/test:1") { doc }
76
+ end
77
+ its(:parent) { is_expected.to eq(doc) }
78
+ end
79
+ describe "when there is no parent URI" do
80
+ its(:parent) { is_expected.to be_nil }
81
+ end
46
82
  end
47
83
 
48
84
  describe "#roles" do
49
85
  let(:json) { "[{\"role_type\":[\"Editor\"],\"agent\":[\"Editors\"],\"scope\":[\"policy\"]},{\"role_type\":[\"Contributor\"],\"agent\":[\"bob@example.com\"],\"scope\":[\"resource\"]}]" }
50
- before { subject[Ddr::IndexFields::ACCESS_ROLE] = json }
86
+ before { subject[Ddr::Index::Fields::ACCESS_ROLE] = json }
51
87
  it "should deserialize the roles from JSON" do
52
88
  expect(subject.roles.to_a)
53
89
  .to eq([Ddr::Auth::Roles::Role.build(type: "Editor", agent: "Editors", scope: "policy"),
@@ -55,11 +91,6 @@ RSpec.describe SolrDocument, type: :model, contacts: true do
55
91
  end
56
92
  end
57
93
 
58
- describe "#display_format" do
59
- before { subject[Ddr::IndexFields::DISPLAY_FORMAT] = "Image" }
60
- its(:display_format) { should eq("Image") }
61
- end
62
-
63
94
  describe "#struct_maps" do
64
95
  context "no indexed struct maps" do
65
96
  it "should return an empty hash" do
@@ -67,7 +98,7 @@ RSpec.describe SolrDocument, type: :model, contacts: true do
67
98
  end
68
99
  end
69
100
  context "indexed struct maps" do
70
- before { subject[Ddr::IndexFields::STRUCT_MAPS] = multiple_struct_maps_structure_to_json }
101
+ before { subject[Ddr::Index::Fields::STRUCT_MAPS] = multiple_struct_maps_structure_to_json }
71
102
  it "should return a hash of the struct maps" do
72
103
  expect(subject.struct_maps).to eq(JSON.parse(multiple_struct_maps_structure_to_json))
73
104
  end
@@ -81,7 +112,7 @@ RSpec.describe SolrDocument, type: :model, contacts: true do
81
112
  end
82
113
  end
83
114
  context "indexed struct maps" do
84
- before { subject[Ddr::IndexFields::STRUCT_MAPS] = multiple_struct_maps_structure_to_json }
115
+ before { subject[Ddr::Index::Fields::STRUCT_MAPS] = multiple_struct_maps_structure_to_json }
85
116
  context "requested struct map is indexed" do
86
117
  it "should return the struct map" do
87
118
  expect(subject.struct_map('default')).to eq(JSON.parse(multiple_struct_maps_structure_to_json)["default"])
@@ -95,11 +126,6 @@ RSpec.describe SolrDocument, type: :model, contacts: true do
95
126
  end
96
127
  end
97
128
 
98
- describe "#display_format" do
99
- before { subject[Ddr::IndexFields::DISPLAY_FORMAT] = "Image" }
100
- its(:display_format) { should eq("Image") }
101
- end
102
-
103
129
  describe "contacts" do
104
130
  before do
105
131
  allow(YAML).to receive(:load_file) { { 'xa' => { 'name' => 'Contact A', 'short_name' => 'A' },
@@ -108,17 +134,16 @@ RSpec.describe SolrDocument, type: :model, contacts: true do
108
134
  end
109
135
  describe "#research_help" do
110
136
  context "object has research help contact" do
111
- before { subject[Ddr::IndexFields::RESEARCH_HELP_CONTACT] = 'yb' }
137
+ before { subject[Ddr::Index::Fields::RESEARCH_HELP_CONTACT] = 'yb' }
112
138
  it "should return the object's research help contact" do
113
139
  expect(subject.research_help.slug).to eq('yb')
114
140
  end
115
141
  end
116
142
  context "object does not have research help contact" do
117
143
  context "collection has research help contact" do
118
- let(:apo_solr_response) { [{"system_create_dtsi"=>"2015-03-10T15:20:16Z", "system_modified_dtsi"=>"2015-03-10T15:21:50Z", "object_state_ssi"=>"A", "active_fedora_model_ssi"=>"Collection", "id"=>"changeme:224", "object_profile_ssm"=>["{\"datastreams\":{\"DC\":{\"dsLabel\":\"Dublin Core Record for this object\",\"dsVersionID\":\"DC1.0\",\"dsCreateDate\":\"2015-03-10T15:20:16Z\",\"dsState\":\"A\",\"dsMIME\":\"text/xml\",\"dsFormatURI\":\"http://www.openarchives.org/OAI/2.0/oai_dc/\",\"dsControlGroup\":\"X\",\"dsSize\":341,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"changeme:224+DC+DC1.0\",\"dsLocationType\":null,\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"0555f020bbfc94c07745f530af4195fed9cf4e4ba539a30727f2d2d5743627be\"},\"RELS-EXT\":{\"dsLabel\":\"Fedora Object-to-Object Relationship Metadata\",\"dsVersionID\":\"RELS-EXT.1\",\"dsCreateDate\":\"2015-03-10T15:20:18Z\",\"dsState\":\"A\",\"dsMIME\":\"application/rdf+xml\",\"dsFormatURI\":null,\"dsControlGroup\":\"X\",\"dsSize\":417,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"changeme:224+RELS-EXT+RELS-EXT.1\",\"dsLocationType\":null,\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"6a7c2621534cd1cb28d9cfa7e45bb128a1f3c05028e29def4dea479be9596d7d\"},\"descMetadata\":{\"dsLabel\":\"Descriptive Metadata for this object\",\"dsVersionID\":\"descMetadata.1\",\"dsCreateDate\":\"2015-03-10T15:20:18Z\",\"dsState\":\"A\",\"dsMIME\":\"application/n-triples\",\"dsFormatURI\":null,\"dsControlGroup\":\"M\",\"dsSize\":80,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"changeme:224+descMetadata+descMetadata.1\",\"dsLocationType\":\"INTERNAL_ID\",\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"bbba526a1ca47f19dfe110f25a0a721bda481dc414f7ec89e3f02c5562eaa9a2\"},\"rightsMetadata\":{\"dsLabel\":null,\"dsVersionID\":\"rightsMetadata.0\",\"dsCreateDate\":\"2015-03-10T15:20:17Z\",\"dsState\":\"A\",\"dsMIME\":\"text/xml\",\"dsFormatURI\":null,\"dsControlGroup\":\"M\",\"dsSize\":550,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"changeme:224+rightsMetadata+rightsMetadata.0\",\"dsLocationType\":\"INTERNAL_ID\",\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"210d5a228bd96e22b20723de1dd20ea8d897252063713d0815369c49045c5c05\"},\"properties\":{},\"thumbnail\":{},\"adminMetadata\":{},\"defaultRights\":{\"dsLabel\":null,\"dsVersionID\":\"defaultRights.0\",\"dsCreateDate\":\"2015-03-10T15:21:50Z\",\"dsState\":\"A\",\"dsMIME\":\"text/xml\",\"dsFormatURI\":null,\"dsControlGroup\":\"M\",\"dsSize\":634,\"dsVersionable\":true,\"dsInfoType\":null,\"dsLocation\":\"changeme:224+defaultRights+defaultRights.0\",\"dsLocationType\":\"INTERNAL_ID\",\"dsChecksumType\":\"SHA-256\",\"dsChecksum\":\"1a2d9e665228d5e3cbf5f8ddd0d641172c20f98b4e05d62f741b7b9010696ad0\"}},\"objLabel\":null,\"objOwnerId\":\"fedoraAdmin\",\"objModels\":[\"info:fedora/afmodel:Collection\",\"info:fedora/fedora-system:FedoraObject-3.0\"],\"objCreateDate\":\"2015-03-10T15:20:16Z\",\"objLastModDate\":\"2015-03-10T15:20:18Z\",\"objDissIndexViewURL\":\"http://localhost:8983/fedora/objects/changeme%3A224/methods/fedora-system%3A3/viewMethodIndex\",\"objItemIndexViewURL\":\"http://localhost:8983/fedora/objects/changeme%3A224/methods/fedora-system%3A3/viewItemIndex\",\"objState\":\"A\"}"], "title_tesim"=>["Test Collection"], "edit_access_person_ssim"=>["coblej@duke.edu"], "inheritable_read_access_group_ssim"=>["public"], "is_governed_by_ssim"=>["info:fedora/changeme:224"], "has_model_ssim"=>["info:fedora/afmodel:Collection"], "title_ssi"=>"Test Collection", "internal_uri_ssi"=>"info:fedora/changeme:224", Ddr::IndexFields::RESEARCH_HELP_CONTACT=>"xa", "_version_"=>1495270331036729344, "timestamp"=>"2015-03-10T15:21:50.793Z"}] }
144
+ let(:admin_policy) { described_class.new({Ddr::Index::Fields::RESEARCH_HELP_CONTACT=>["xa"]}) }
119
145
  before do
120
- allow(subject).to receive(:admin_policy_pid).and_return('changeme:224')
121
- allow(ActiveFedora::SolrService).to receive(:query).and_return(apo_solr_response)
146
+ allow(subject).to receive(:admin_policy) { admin_policy }
122
147
  end
123
148
  it "should return the collection's research help contact" do
124
149
  expect(subject.research_help.slug).to eq("xa")
@@ -133,4 +158,38 @@ RSpec.describe SolrDocument, type: :model, contacts: true do
133
158
  end
134
159
  end
135
160
 
161
+ describe "structural metadata" do
162
+ describe "#multires_image_file_paths" do
163
+ context "no structural metadata" do
164
+ its(:multires_image_file_paths) { is_expected.to match([]) }
165
+ end
166
+ context "structural metadata" do
167
+ let(:struct_map) do
168
+ {"type"=>"default", "divs"=>
169
+ [{"id"=>"viccb010010010", "label"=>"1", "order"=>"1", "type"=>"Image", "fptrs"=>["test:5"], "divs"=>[]},
170
+ {"id"=>"viccb010020010", "label"=>"2", "order"=>"2", "type"=>"Image", "fptrs"=>["test:6"], "divs"=>[]},
171
+ {"id"=>"viccb010030010", "label"=>"3", "order"=>"3", "type"=>"Image", "fptrs"=>["test:7"], "divs"=>[]}]
172
+ }
173
+ end
174
+ before { allow(subject).to receive(:struct_map) { struct_map } }
175
+ context "no structural objects with multi-res images" do
176
+ before do
177
+ allow(SolrDocument).to receive(:find).with('test:5') { double(multires_image_file_path: nil) }
178
+ allow(SolrDocument).to receive(:find).with('test:6') { double(multires_image_file_path: nil) }
179
+ allow(SolrDocument).to receive(:find).with('test:7') { double(multires_image_file_path: nil) }
180
+ end
181
+ its(:multires_image_file_paths) { is_expected.to match([]) }
182
+ end
183
+ context "structural objects with multi-res images" do
184
+ let(:expected_result) { [ "/path/file1.ptif", "/path/file2.ptif" ] }
185
+ before do
186
+ allow(SolrDocument).to receive(:find).with('test:5') { double(multires_image_file_path: "/path/file1.ptif") }
187
+ allow(SolrDocument).to receive(:find).with('test:6') { double(multires_image_file_path: nil) }
188
+ allow(SolrDocument).to receive(:find).with('test:7') { double(multires_image_file_path: "/path/file2.ptif") }
189
+ end
190
+ its(:multires_image_file_paths) { is_expected.to match(expected_result) }
191
+ end
192
+ end
193
+ end
194
+ end
136
195
  end
@@ -0,0 +1,65 @@
1
+ module Ddr::Models
2
+ RSpec.describe YearFacet do
3
+
4
+ subject { described_class.new(obj) }
5
+ let(:obj) { Item.new }
6
+ before { obj.date = [ date ] }
7
+
8
+ describe "splitting on semicolons" do
9
+ let(:date) { "1935; 1936; 1937; 1938" }
10
+ its(:values) { is_expected.to eq([1935, 1936, 1937, 1938]) }
11
+ end
12
+
13
+ describe "year range" do
14
+ %w( 1935-1940 1935/1940 ).each do |value|
15
+ describe value do
16
+ let(:date) { value }
17
+ its(:values) { is_expected.to eq((1935..1940).to_a) }
18
+ end
19
+ end
20
+ end
21
+
22
+ describe "in decade" do
23
+ %w( 192x 192X 192? 192- 192-? ).each do |value|
24
+ describe value do
25
+ let(:date) { value }
26
+ its(:values) { is_expected.to eq((1920..1929).to_a) }
27
+ end
28
+ end
29
+ end
30
+
31
+ describe "in century -- YYxx (19xx)" do
32
+ let(:date) { "19xx" }
33
+ its(:values) { is_expected.to eq((1900..1999).to_a) }
34
+ end
35
+
36
+ describe "decade" do
37
+ %w( 1920s 1920s? ).each do |value|
38
+ describe value do
39
+ let(:date) { value }
40
+ its(:values) { is_expected.to eq((1920..1929).to_a) }
41
+ end
42
+ end
43
+ end
44
+
45
+ describe "year + month" do
46
+ %w( 2010-01 2010/01 ).each do |value|
47
+ describe value do
48
+ let(:date) { value }
49
+ its(:values) { is_expected.to eq([2010]) }
50
+ end
51
+ end
52
+ end
53
+
54
+ describe "between" do
55
+ let(:date) { "Between 1965 and 1968" }
56
+ its(:values) { is_expected.to eq((1965..1968).to_a) }
57
+ end
58
+
59
+ describe "year" do
60
+ let(:date) { "1965" }
61
+ its(:values) { is_expected.to eq([1965]) }
62
+ end
63
+
64
+ end
65
+ end
@@ -23,13 +23,6 @@ Dir[File.join(File.dirname(__FILE__), "support", "*.rb")].each { |f| require f }
23
23
 
24
24
  DatabaseCleaner.strategy = :truncation
25
25
 
26
- require "ddr-antivirus"
27
- Ddr::Antivirus.configure do |config|
28
- config.scanner_adapter = :null
29
- require "logger"
30
- config.logger = Logger.new(File::NULL)
31
- end
32
-
33
26
  RSpec.configure do |config|
34
27
 
35
28
  config.include ActionDispatch::TestProcess
@@ -116,6 +109,7 @@ RSpec.configure do |config|
116
109
  config.external_file_store = Dir.mktmpdir
117
110
  config.multires_image_external_file_store = Dir.mktmpdir
118
111
  config.external_file_subpath_pattern = "--"
112
+ config.fits_home = Dir.mktmpdir
119
113
  end
120
114
  end
121
115
 
@@ -2,9 +2,7 @@ RSpec.shared_examples "a DDR model" do
2
2
 
3
3
  it_behaves_like "a describable object"
4
4
  it_behaves_like "a governable object"
5
- it_behaves_like "a licensable object"
6
5
  it_behaves_like "an access controllable object"
7
- it_behaves_like "an object that has properties"
8
6
  it_behaves_like "an object that has a display title"
9
7
  it_behaves_like "an object that has identifiers"
10
8
 
@@ -5,6 +5,8 @@ RSpec.shared_examples "an object that can have content" do
5
5
 
6
6
  subject { described_class.new(title: [ "I Have Content!" ]) }
7
7
 
8
+ before { allow(Resque).to receive(:enqueue) }
9
+
8
10
  it "should delegate :validate_checksum! to :content" do
9
11
  checksum = "dea56f15b309e47b74fa24797f85245dda0ca3d274644a96804438bbd659555a"
10
12
  expect(subject.content).to receive(:validate_checksum!).with(checksum, "SHA-256")
@@ -22,20 +24,20 @@ RSpec.shared_examples "an object that can have content" do
22
24
  let(:file) { fixture_file_upload("imageA.tif", "image/tiff") }
23
25
  before { subject.upload file }
24
26
  it "should index the content ds control group" do
25
- expect(subject.to_solr).to include(Ddr::IndexFields::CONTENT_CONTROL_GROUP)
27
+ expect(subject.to_solr).to include(Ddr::Index::Fields::CONTENT_CONTROL_GROUP)
26
28
  end
27
29
  end
28
30
 
29
31
  describe "extracted text" do
30
32
  describe "when it is not present" do
31
33
  its(:has_extracted_text?) { should be false }
32
- its(:to_solr) { should_not include(Ddr::IndexFields::EXTRACTED_TEXT) }
34
+ its(:to_solr) { should_not include(Ddr::Index::Fields::EXTRACTED_TEXT) }
33
35
  end
34
36
  describe "when it is present" do
35
37
  before { subject.extractedText.content = "This is my text. See Spot run." }
36
38
  its(:has_extracted_text?) { should be true }
37
39
  it "should be indexed" do
38
- expect(subject.to_solr[Ddr::IndexFields::EXTRACTED_TEXT]).to eq("This is my text. See Spot run.")
40
+ expect(subject.to_solr[Ddr::Index::Fields::EXTRACTED_TEXT]).to eq("This is my text. See Spot run.")
39
41
  end
40
42
  end
41
43
  end
@@ -71,6 +73,22 @@ RSpec.shared_examples "an object that can have content" do
71
73
  expect(subject.derivatives).to receive(:update_derivatives)
72
74
  subject.save
73
75
  end
76
+ describe "file characterization" do
77
+ context "characterize files is false" do
78
+ before { allow(Ddr::Models).to receive(:characterize_files?) { false } }
79
+ it "should not enqueue a FITS file characterization job" do
80
+ expect(Resque).to_not receive(:enqueue).with(Ddr::Jobs::FitsFileCharacterization, instance_of(String))
81
+ subject.save
82
+ end
83
+ end
84
+ context "characterize files is true" do
85
+ before { allow(Ddr::Models).to receive(:characterize_files?) { true } }
86
+ it "should enqueue a FITS file characterization job" do
87
+ expect(Resque).to receive(:enqueue).with(Ddr::Jobs::FitsFileCharacterization, instance_of(String))
88
+ subject.save
89
+ end
90
+ end
91
+ end
74
92
  end
75
93
 
76
94
  context "and it's an existing object with content" do
@@ -80,6 +98,22 @@ RSpec.shared_examples "an object that can have content" do
80
98
  expect(subject.derivatives).to receive(:update_derivatives)
81
99
  subject.upload! file
82
100
  end
101
+ describe "file characterization" do
102
+ context "characterize files is false" do
103
+ before { allow(Ddr::Models).to receive(:characterize_files?) { false } }
104
+ it "should not enqueue a FITS file characterization job" do
105
+ expect(Resque).to_not receive(:enqueue).with(Ddr::Jobs::FitsFileCharacterization, instance_of(String))
106
+ subject.upload! file
107
+ end
108
+ end
109
+ context "characterize files is true" do
110
+ before { allow(Ddr::Models).to receive(:characterize_files?) { true } }
111
+ it "should enqueue a FITS file characterization job" do
112
+ expect(Resque).to receive(:enqueue).with(Ddr::Jobs::FitsFileCharacterization, instance_of(String))
113
+ subject.upload! file
114
+ end
115
+ end
116
+ end
83
117
  end
84
118
  end
85
119
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ddr-models
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.1
4
+ version: 2.1.0.rc1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jim Coble
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-08-21 00:00:00.000000000 Z
12
+ date: 2015-09-17 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
@@ -67,20 +67,6 @@ dependencies:
67
67
  - - "~>"
68
68
  - !ruby/object:Gem::Version
69
69
  version: '0.5'
70
- - !ruby/object:Gem::Dependency
71
- name: ddr-antivirus
72
- requirement: !ruby/object:Gem::Requirement
73
- requirements:
74
- - - "~>"
75
- - !ruby/object:Gem::Version
76
- version: 1.3.1
77
- type: :runtime
78
- prerelease: false
79
- version_requirements: !ruby/object:Gem::Requirement
80
- requirements:
81
- - - "~>"
82
- - !ruby/object:Gem::Version
83
- version: 1.3.1
84
70
  - !ruby/object:Gem::Dependency
85
71
  name: devise
86
72
  requirement: !ruby/object:Gem::Requirement
@@ -199,6 +185,34 @@ dependencies:
199
185
  - - "~>"
200
186
  - !ruby/object:Gem::Version
201
187
  version: '1.12'
188
+ - !ruby/object:Gem::Dependency
189
+ name: ddr-aux-client
190
+ requirement: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - "~>"
193
+ - !ruby/object:Gem::Version
194
+ version: '1.1'
195
+ type: :runtime
196
+ prerelease: false
197
+ version_requirements: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - "~>"
200
+ - !ruby/object:Gem::Version
201
+ version: '1.1'
202
+ - !ruby/object:Gem::Dependency
203
+ name: ddr-antivirus
204
+ requirement: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - '='
207
+ - !ruby/object:Gem::Version
208
+ version: 2.0.0
209
+ type: :runtime
210
+ prerelease: false
211
+ version_requirements: !ruby/object:Gem::Requirement
212
+ requirements:
213
+ - - '='
214
+ - !ruby/object:Gem::Version
215
+ version: 2.0.0
202
216
  - !ruby/object:Gem::Dependency
203
217
  name: bundler
204
218
  requirement: !ruby/object:Gem::Requirement
@@ -357,6 +371,7 @@ files:
357
371
  - lib/ddr-models.rb
358
372
  - lib/ddr/actions.rb
359
373
  - lib/ddr/actions/fixity_check.rb
374
+ - lib/ddr/actions/virus_check.rb
360
375
  - lib/ddr/auth.rb
361
376
  - lib/ddr/auth/ability.rb
362
377
  - lib/ddr/auth/ability_definitions.rb
@@ -412,9 +427,9 @@ files:
412
427
  - lib/ddr/datastreams/administrative_metadata_datastream.rb
413
428
  - lib/ddr/datastreams/datastream_behavior.rb
414
429
  - lib/ddr/datastreams/descriptive_metadata_datastream.rb
430
+ - lib/ddr/datastreams/fits_datastream.rb
415
431
  - lib/ddr/datastreams/metadata_datastream.rb
416
432
  - lib/ddr/datastreams/plain_text_datastream.rb
417
- - lib/ddr/datastreams/properties_datastream.rb
418
433
  - lib/ddr/datastreams/structural_metadata_datastream.rb
419
434
  - lib/ddr/derivatives.rb
420
435
  - lib/ddr/derivatives/generator.rb
@@ -431,14 +446,32 @@ files:
431
446
  - lib/ddr/events/update_event.rb
432
447
  - lib/ddr/events/validation_event.rb
433
448
  - lib/ddr/events/virus_check_event.rb
449
+ - lib/ddr/index.rb
450
+ - lib/ddr/index/abstract_query_result.rb
451
+ - lib/ddr/index/connection.rb
452
+ - lib/ddr/index/csv_query_result.rb
453
+ - lib/ddr/index/document_builder.rb
454
+ - lib/ddr/index/field.rb
455
+ - lib/ddr/index/fields.rb
456
+ - lib/ddr/index/filter.rb
457
+ - lib/ddr/index/filters.rb
458
+ - lib/ddr/index/legacy_license_fields.rb
459
+ - lib/ddr/index/query.rb
460
+ - lib/ddr/index/query_builder.rb
461
+ - lib/ddr/index/query_clause.rb
462
+ - lib/ddr/index/query_result.rb
463
+ - lib/ddr/index/query_value.rb
464
+ - lib/ddr/index/response.rb
465
+ - lib/ddr/index/unique_key_field.rb
434
466
  - lib/ddr/index_fields.rb
435
467
  - lib/ddr/jobs.rb
436
- - lib/ddr/jobs/migrate_legacy_authorization.rb
468
+ - lib/ddr/jobs/fits_file_characterization.rb
437
469
  - lib/ddr/jobs/permanent_id.rb
438
470
  - lib/ddr/managers.rb
439
471
  - lib/ddr/managers/derivatives_manager.rb
440
472
  - lib/ddr/managers/manager.rb
441
473
  - lib/ddr/managers/permanent_id_manager.rb
474
+ - lib/ddr/managers/technical_metadata_manager.rb
442
475
  - lib/ddr/managers/workflow_manager.rb
443
476
  - lib/ddr/metadata.rb
444
477
  - lib/ddr/metadata/premis_event.rb
@@ -446,6 +479,7 @@ files:
446
479
  - lib/ddr/models/access_controllable.rb
447
480
  - lib/ddr/models/base.rb
448
481
  - lib/ddr/models/describable.rb
482
+ - lib/ddr/models/effective_license.rb
449
483
  - lib/ddr/models/engine.rb
450
484
  - lib/ddr/models/error.rb
451
485
  - lib/ddr/models/event_loggable.rb
@@ -457,15 +491,16 @@ files:
457
491
  - lib/ddr/models/has_children.rb
458
492
  - lib/ddr/models/has_content.rb
459
493
  - lib/ddr/models/has_multires_image.rb
460
- - lib/ddr/models/has_properties.rb
461
494
  - lib/ddr/models/has_struct_metadata.rb
462
495
  - lib/ddr/models/has_thumbnail.rb
463
496
  - lib/ddr/models/indexing.rb
464
- - lib/ddr/models/licensable.rb
497
+ - lib/ddr/models/inherited_license.rb
498
+ - lib/ddr/models/license.rb
465
499
  - lib/ddr/models/solr_document.rb
466
500
  - lib/ddr/models/struct_div.rb
467
501
  - lib/ddr/models/structure.rb
468
502
  - lib/ddr/models/version.rb
503
+ - lib/ddr/models/year_facet.rb
469
504
  - lib/ddr/notifications.rb
470
505
  - lib/ddr/utils.rb
471
506
  - lib/ddr/vocab.rb
@@ -487,10 +522,8 @@ files:
487
522
  - spec/auth/group_spec.rb
488
523
  - spec/auth/groups_spec.rb
489
524
  - spec/auth/ldap_gateway_spec.rb
490
- - spec/auth/legacy_authorization_spec.rb
491
525
  - spec/auth/legacy_default_permissions_spec.rb
492
526
  - spec/auth/legacy_permissions_spec.rb
493
- - spec/auth/legacy_roles_spec.rb
494
527
  - spec/auth/roles/detached_role_set_spec.rb
495
528
  - spec/auth/roles/property_role_set_spec.rb
496
529
  - spec/auth/roles/role_set_query_spec.rb
@@ -503,6 +536,7 @@ files:
503
536
  - spec/controllers/application_controller_spec.rb
504
537
  - spec/controllers/including_role_based_access_controls_enforcement_spec.rb
505
538
  - spec/controllers/users/sessions_controller_spec.rb
539
+ - spec/datastreams/fits_datastream_spec.rb
506
540
  - spec/derivatives/png_generator_spec.rb
507
541
  - spec/derivatives/ptif_generator_spec.rb
508
542
  - spec/dummy/README.rdoc
@@ -563,6 +597,8 @@ files:
563
597
  - spec/factories/user_factories.rb
564
598
  - spec/fixtures/16bit.tif
565
599
  - spec/fixtures/8bit.tif
600
+ - spec/fixtures/fits/document.xml
601
+ - spec/fixtures/fits/image.xml
566
602
  - spec/fixtures/imageA.tif
567
603
  - spec/fixtures/imageB.tif
568
604
  - spec/fixtures/imageC.tif
@@ -570,24 +606,31 @@ files:
570
606
  - spec/fixtures/sample.pdf
571
607
  - spec/fixtures/target.png
572
608
  - spec/helpers/models_helper_spec.rb
573
- - spec/jobs/migrate_legacy_authorization_spec.rb
609
+ - spec/index/filter_spec.rb
610
+ - spec/index/filters_spec.rb
611
+ - spec/index/query_spec.rb
612
+ - spec/jobs/fits_file_characterization_spec.rb
574
613
  - spec/managers/derivatives_manager_spec.rb
614
+ - spec/managers/technical_metadata_manager_spec.rb
575
615
  - spec/models/active_fedora_base_spec.rb
576
616
  - spec/models/active_fedora_datastream_spec.rb
577
617
  - spec/models/attachment_spec.rb
578
618
  - spec/models/collection_spec.rb
579
619
  - spec/models/component_spec.rb
580
620
  - spec/models/descriptive_metadata_datastream_spec.rb
621
+ - spec/models/effective_license_spec.rb
581
622
  - spec/models/events_spec.rb
582
623
  - spec/models/file_management_spec.rb
583
624
  - spec/models/has_admin_metadata_spec.rb
584
625
  - spec/models/has_children_spec.rb
585
626
  - spec/models/has_struct_metadata_spec.rb
627
+ - spec/models/indexing_spec.rb
586
628
  - spec/models/item_spec.rb
587
629
  - spec/models/solr_document_spec.rb
588
630
  - spec/models/struct_div_spec.rb
589
631
  - spec/models/structure_spec.rb
590
632
  - spec/models/target_spec.rb
633
+ - spec/models/year_facet_spec.rb
591
634
  - spec/routing/user_routing_spec.rb
592
635
  - spec/spec_helper.rb
593
636
  - spec/support/ezid_mock_identifier.rb
@@ -599,9 +642,7 @@ files:
599
642
  - spec/support/shared_examples_for_events.rb
600
643
  - spec/support/shared_examples_for_governables.rb
601
644
  - spec/support/shared_examples_for_has_content.rb
602
- - spec/support/shared_examples_for_has_properties.rb
603
645
  - spec/support/shared_examples_for_indexing.rb
604
- - spec/support/shared_examples_for_licensable.rb
605
646
  - spec/support/shared_examples_for_non_collection_models.rb
606
647
  - spec/support/shared_examples_for_role_sets.rb
607
648
  - spec/support/structural_metadata_helper.rb
@@ -622,9 +663,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
622
663
  version: '0'
623
664
  required_rubygems_version: !ruby/object:Gem::Requirement
624
665
  requirements:
625
- - - ">="
666
+ - - ">"
626
667
  - !ruby/object:Gem::Version
627
- version: '0'
668
+ version: 1.3.1
628
669
  requirements: []
629
670
  rubyforge_project:
630
671
  rubygems_version: 2.2.2
@@ -642,10 +683,8 @@ test_files:
642
683
  - spec/auth/group_spec.rb
643
684
  - spec/auth/groups_spec.rb
644
685
  - spec/auth/ldap_gateway_spec.rb
645
- - spec/auth/legacy_authorization_spec.rb
646
686
  - spec/auth/legacy_default_permissions_spec.rb
647
687
  - spec/auth/legacy_permissions_spec.rb
648
- - spec/auth/legacy_roles_spec.rb
649
688
  - spec/auth/roles/detached_role_set_spec.rb
650
689
  - spec/auth/roles/property_role_set_spec.rb
651
690
  - spec/auth/roles/role_set_query_spec.rb
@@ -658,6 +697,7 @@ test_files:
658
697
  - spec/controllers/application_controller_spec.rb
659
698
  - spec/controllers/including_role_based_access_controls_enforcement_spec.rb
660
699
  - spec/controllers/users/sessions_controller_spec.rb
700
+ - spec/datastreams/fits_datastream_spec.rb
661
701
  - spec/derivatives/png_generator_spec.rb
662
702
  - spec/derivatives/ptif_generator_spec.rb
663
703
  - spec/dummy/README.rdoc
@@ -718,6 +758,8 @@ test_files:
718
758
  - spec/factories/user_factories.rb
719
759
  - spec/fixtures/16bit.tif
720
760
  - spec/fixtures/8bit.tif
761
+ - spec/fixtures/fits/document.xml
762
+ - spec/fixtures/fits/image.xml
721
763
  - spec/fixtures/imageA.tif
722
764
  - spec/fixtures/imageB.tif
723
765
  - spec/fixtures/imageC.tif
@@ -725,24 +767,31 @@ test_files:
725
767
  - spec/fixtures/sample.pdf
726
768
  - spec/fixtures/target.png
727
769
  - spec/helpers/models_helper_spec.rb
728
- - spec/jobs/migrate_legacy_authorization_spec.rb
770
+ - spec/index/filter_spec.rb
771
+ - spec/index/filters_spec.rb
772
+ - spec/index/query_spec.rb
773
+ - spec/jobs/fits_file_characterization_spec.rb
729
774
  - spec/managers/derivatives_manager_spec.rb
775
+ - spec/managers/technical_metadata_manager_spec.rb
730
776
  - spec/models/active_fedora_base_spec.rb
731
777
  - spec/models/active_fedora_datastream_spec.rb
732
778
  - spec/models/attachment_spec.rb
733
779
  - spec/models/collection_spec.rb
734
780
  - spec/models/component_spec.rb
735
781
  - spec/models/descriptive_metadata_datastream_spec.rb
782
+ - spec/models/effective_license_spec.rb
736
783
  - spec/models/events_spec.rb
737
784
  - spec/models/file_management_spec.rb
738
785
  - spec/models/has_admin_metadata_spec.rb
739
786
  - spec/models/has_children_spec.rb
740
787
  - spec/models/has_struct_metadata_spec.rb
788
+ - spec/models/indexing_spec.rb
741
789
  - spec/models/item_spec.rb
742
790
  - spec/models/solr_document_spec.rb
743
791
  - spec/models/struct_div_spec.rb
744
792
  - spec/models/structure_spec.rb
745
793
  - spec/models/target_spec.rb
794
+ - spec/models/year_facet_spec.rb
746
795
  - spec/routing/user_routing_spec.rb
747
796
  - spec/spec_helper.rb
748
797
  - spec/support/ezid_mock_identifier.rb
@@ -754,9 +803,7 @@ test_files:
754
803
  - spec/support/shared_examples_for_events.rb
755
804
  - spec/support/shared_examples_for_governables.rb
756
805
  - spec/support/shared_examples_for_has_content.rb
757
- - spec/support/shared_examples_for_has_properties.rb
758
806
  - spec/support/shared_examples_for_indexing.rb
759
- - spec/support/shared_examples_for_licensable.rb
760
807
  - spec/support/shared_examples_for_non_collection_models.rb
761
808
  - spec/support/shared_examples_for_role_sets.rb
762
809
  - spec/support/structural_metadata_helper.rb