ddr-models 2.5.3 → 2.6.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 (36) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/users/sessions_controller.rb +0 -5
  3. data/config/initializers/devise.rb +3 -2
  4. data/config/initializers/rsolr_monkey_patches.rb +7 -0
  5. data/config/initializers/subscriptions.rb +0 -2
  6. data/ddr-models.gemspec +2 -1
  7. data/lib/ddr/actions/virus_check.rb +0 -1
  8. data/lib/ddr/auth.rb +0 -4
  9. data/lib/ddr/auth/ability_definitions/role_based_ability_definitions.rb +9 -16
  10. data/lib/ddr/derivatives/generator.rb +0 -2
  11. data/lib/ddr/derivatives/png_generator.rb +2 -4
  12. data/lib/ddr/derivatives/ptif_generator.rb +6 -7
  13. data/lib/ddr/index/fields.rb +18 -2
  14. data/lib/ddr/jobs.rb +0 -4
  15. data/lib/ddr/managers.rb +0 -1
  16. data/lib/ddr/managers/derivatives_manager.rb +3 -4
  17. data/lib/ddr/managers/workflow_manager.rb +3 -0
  18. data/lib/ddr/models.rb +6 -3
  19. data/lib/ddr/models/base.rb +13 -0
  20. data/lib/ddr/models/has_admin_metadata.rb +4 -20
  21. data/lib/ddr/models/indexing.rb +16 -0
  22. data/lib/ddr/models/solr_document.rb +8 -0
  23. data/lib/ddr/models/version.rb +1 -1
  24. data/lib/ddr/models/year_facet.rb +60 -118
  25. data/spec/auth/ability_spec.rb +1 -1
  26. data/spec/auth/roles/role_spec.rb +9 -9
  27. data/spec/index/fields_spec.rb +96 -0
  28. data/spec/models/active_fedora_datastream_spec.rb +6 -5
  29. data/spec/models/has_admin_metadata_spec.rb +49 -125
  30. data/spec/models/indexing_spec.rb +50 -18
  31. data/spec/models/solr_document_spec.rb +28 -0
  32. data/spec/models/year_facet_spec.rb +49 -22
  33. data/spec/support/shared_examples_for_ddr_models.rb +54 -2
  34. metadata +21 -8
  35. data/lib/ddr/jobs/permanent_id.rb +0 -35
  36. data/lib/ddr/managers/permanent_id_manager.rb +0 -93
@@ -55,13 +55,13 @@ module ActiveFedora
55
55
  context "the datstream is new" do
56
56
  before { allow(subject).to receive(:new?) { true } }
57
57
  it "should raise an exception" do
58
- expect { subject.validate_checksum!(checksum, checksum_type) }.to raise_error
58
+ expect { subject.validate_checksum!(checksum, checksum_type) }.to raise_error(Ddr::Models::Error)
59
59
  end
60
60
  end
61
61
  context "the datastream content has changed" do
62
62
  before { allow(subject).to receive(:content_changed?) { true } }
63
63
  it "should raise an exception" do
64
- expect { subject.validate_checksum!(checksum, checksum_type) }.to raise_error
64
+ expect { subject.validate_checksum!(checksum, checksum_type) }.to raise_error(Ddr::Models::Error)
65
65
  end
66
66
  end
67
67
  end
@@ -76,14 +76,15 @@ module ActiveFedora
76
76
  context "and the repository internal checksum in invalid" do
77
77
  before { allow(subject).to receive(:dsChecksumValid) { false } }
78
78
  it "should raise an error" do
79
- expect { subject.validate_checksum!(checksum, checksum_type) }.to raise_error
79
+ expect { subject.validate_checksum!(checksum, checksum_type) }.to raise_error(Ddr::Models::ChecksumInvalid)
80
80
  end
81
81
  end
82
82
  context "and the repository internal checksum is valid" do
83
83
  before { allow(subject).to receive(:dsChecksumValid) { true } }
84
84
  context "and the checksum type is invalid" do
85
+ before { allow(subject).to receive(:content) { "foo" } }
85
86
  it "should raise an exception" do
86
- expect { subject.validate_checksum!("0123456789abcdef", "FOO-BAR") }.to raise_error
87
+ expect { subject.validate_checksum!("0123456789abcdef", "FOO-BAR") }.to raise_error(ArgumentError)
87
88
  end
88
89
  end
89
90
  context "and the checksum type is nil" do
@@ -106,7 +107,7 @@ module ActiveFedora
106
107
  end
107
108
  context "and the checksum doesn't match" do
108
109
  it "should raise an exception" do
109
- expect { subject.validate_checksum!("0123456789abcdef", checksum_type) }.to raise_error
110
+ expect { subject.validate_checksum!("0123456789abcdef", checksum_type) }.to raise_error(Ddr::Models::ChecksumInvalid)
110
111
  end
111
112
  end
112
113
  end
@@ -4,113 +4,7 @@ require 'support/ezid_mock_identifier'
4
4
  module Ddr::Models
5
5
  RSpec.describe HasAdminMetadata, type: :model, contacts: true do
6
6
 
7
- describe "permanent id and permanent url" do
8
- subject { FactoryGirl.build(:item) }
9
-
10
- describe "#assign_permanent_id!" do
11
- it "should assign the permanent id later" do
12
- expect(subject.permanent_id_manager).to receive(:assign_later) { nil }
13
- subject.assign_permanent_id!
14
- end
15
- context "when the object is created (first saved)" do
16
- context "and auto-assignment is enabled" do
17
- before { allow(Ddr::Models).to receive(:auto_assign_permanent_ids) { true } }
18
- it "should assign a permanent id" do
19
- expect(subject).to receive(:assign_permanent_id!) { nil }
20
- subject.save!
21
- end
22
- end
23
- context "and auto-assignment is disabled" do
24
- before { allow(Ddr::Models).to receive(:auto_assign_permanent_ids) { false } }
25
- it "should not assign a permanent id" do
26
- expect(subject).not_to receive(:assign_permanent_id!)
27
- subject.save!
28
- end
29
- end
30
- end
31
- context "when saved" do
32
- context "and auto-assignment is enabled" do
33
- before { allow(Ddr::Models).to receive(:auto_assign_permanent_ids) { true } }
34
- it "should assign a permanent id once" do
35
- expect(subject).to receive(:assign_permanent_id!).once { nil }
36
- subject.save!
37
- subject.title = ["New Title"]
38
- subject.save!
39
- end
40
- end
41
- context "and auto-assignment is disabled" do
42
- before { allow(Ddr::Models).to receive(:auto_assign_permanent_ids) { false } }
43
- it "should not assign a permanent id" do
44
- expect(subject).not_to receive(:assign_permanent_id!)
45
- subject.save!
46
- end
47
- end
48
- end
49
- end
50
-
51
- describe "lifecycle" do
52
- subject { FactoryGirl.create(:item) }
53
- let!(:identifier) {
54
- Ezid::MockIdentifier.create(subject.permanent_id_manager.default_metadata)
55
- }
56
- before do
57
- allow(Ddr::Models).to receive(:auto_assign_permanent_ids) { false }
58
- allow(Ezid::Identifier).to receive(:find).with(identifier.id) { identifier }
59
- subject.permanent_id = identifier.id
60
- subject.save!
61
- end
62
- describe "identifier creation" do
63
- it "sets default metadata" do
64
- expect(identifier.profile).to eq("dc")
65
- expect(identifier.export).to eq("no")
66
- expect(identifier["fcrepo3.pid"]).to eq(subject.pid)
67
- end
68
- end
69
- describe "object destruction" do
70
- it "marks the identifier as unavailable" do
71
- expect { subject.destroy }
72
- .to change(identifier, :status)
73
- .to("unavailable | deleted")
74
- end
75
- end
76
- describe "object deaccession" do
77
- it "marks the identifier as unavailable" do
78
- expect { subject.deaccession }
79
- .to change(identifier, :status)
80
- .to("unavailable | deaccessioned")
81
- end
82
- end
83
- end
84
-
85
- describe "events" do
86
- before { allow(Ddr::Models).to receive(:auto_assign_permanent_ids) { true } }
87
- context "when the operation succeeds" do
88
- let!(:mock_identifier) { Ezid::MockIdentifier.new(id: "ark:/99999/fk4zzz",
89
- metadata: "_target: http://example.com") }
90
- before do
91
- allow(Ezid::Identifier).to receive(:create) { mock_identifier }
92
- allow(Ezid::Identifier).to receive(:find) { mock_identifier }
93
- allow(subject.permanent_id_manager).to receive(:record) { mock_identifier }
94
- end
95
- it "should create a success event" do
96
- expect { subject.save }.to change { subject.update_events.count }.by(1)
97
- end
98
- end
99
- context "when there's an exception" do
100
- before { allow(Ezid::Identifier).to receive(:create).and_raise(Ezid::Error) }
101
- it "should create a failure event" do
102
- begin
103
- subject.save
104
- rescue Ezid::Error
105
- end
106
- expect(subject.update_events.last).to be_failure
107
- end
108
- end
109
- end
110
- end
111
-
112
7
  describe "workflow" do
113
-
114
8
  let(:collection) { FactoryGirl.create(:collection) }
115
9
  let(:item) { FactoryGirl.create(:item) }
116
10
  let(:component) { FactoryGirl.create(:component) }
@@ -122,17 +16,34 @@ module Ddr::Models
122
16
  end
123
17
 
124
18
  describe "#published?" do
19
+ subject { collection }
125
20
  context "object is published" do
126
- before { allow(collection).to receive(:workflow_state) { Ddr::Managers::WorkflowManager::PUBLISHED } }
127
- it "should return true" do
128
- expect(collection).to be_published
129
- end
21
+ before { subject.workflow_state = Ddr::Managers::WorkflowManager::PUBLISHED }
22
+ it { is_expected.to be_published }
130
23
  end
131
- context "object is not published" do
132
- before { allow(collection).to receive(:workflow_state) { nil } }
133
- it "should return false" do
134
- expect(collection).not_to be_published
135
- end
24
+ context "object workflow is not set" do
25
+ before { subject.workflow_state = nil }
26
+ it { is_expected.not_to be_published }
27
+ end
28
+ context "object is unpublished" do
29
+ before { subject.workflow_state = Ddr::Managers::WorkflowManager::UNPUBLISHED }
30
+ it { is_expected.not_to be_published }
31
+ end
32
+ end
33
+
34
+ describe "#unpublished?" do
35
+ subject { collection }
36
+ context "object is published" do
37
+ before { subject.workflow_state = Ddr::Managers::WorkflowManager::PUBLISHED }
38
+ it { is_expected.not_to be_unpublished }
39
+ end
40
+ context "object is unpublished" do
41
+ before { subject.workflow_state = Ddr::Managers::WorkflowManager::UNPUBLISHED }
42
+ it { is_expected.to be_unpublished }
43
+ end
44
+ context "object workflow is not set" do
45
+ before { subject.workflow_state = nil }
46
+ it { is_expected.not_to be_unpublished }
136
47
  end
137
48
  end
138
49
 
@@ -167,7 +78,6 @@ module Ddr::Models
167
78
  end
168
79
 
169
80
  describe "roles" do
170
-
171
81
  subject { FactoryGirl.build(:item) }
172
82
 
173
83
  describe "#copy_resource_roles_from" do
@@ -207,9 +117,7 @@ module Ddr::Models
207
117
  end
208
118
 
209
119
  describe "contacts" do
210
-
211
120
  subject { FactoryGirl.build(:item) }
212
-
213
121
  before do
214
122
  allow(Ddr::Models::Contact).to receive(:get).with(:find, slug: 'xa') do
215
123
  {'id'=>1, 'slug'=>'xa', 'name'=>'Contact A', 'short_name'=>'A'}
@@ -227,19 +135,37 @@ module Ddr::Models
227
135
  end
228
136
 
229
137
  describe "locking" do
230
-
231
138
  subject { FactoryGirl.build(:item) }
232
139
 
233
140
  describe "#locked?" do
234
141
  context "object is locked" do
235
142
  before { subject.is_locked = true }
236
- it "should be true" do
237
- expect(subject.locked?).to be true
143
+ context "repository is locked" do
144
+ before { Ddr::Models.repository_locked = true }
145
+ after { Ddr::Models.repository_locked = false }
146
+ it "should be true" do
147
+ expect(subject.locked?).to be true
148
+ end
149
+ end
150
+ context "repository is not locked" do
151
+ it "should be true" do
152
+ expect(subject.locked?).to be true
153
+ end
238
154
  end
239
155
  end
240
156
  context "object is not locked" do
241
- it "should be false" do
242
- expect(subject.locked?).to be false
157
+ before { subject.is_locked = false }
158
+ context "repository is locked" do
159
+ before { Ddr::Models.repository_locked = true }
160
+ after { Ddr::Models.repository_locked = false }
161
+ it "should be true" do
162
+ expect(subject.locked?).to be true
163
+ end
164
+ end
165
+ context "repository is not locked" do
166
+ it "should be false" do
167
+ expect(subject.locked?).to be false
168
+ end
243
169
  end
244
170
  end
245
171
  end
@@ -273,8 +199,6 @@ module Ddr::Models
273
199
  expect(subject.locked?).to be false
274
200
  end
275
201
  end
276
-
277
202
  end
278
-
279
203
  end
280
204
  end
@@ -23,39 +23,71 @@ module Ddr::Models
23
23
  obj.rightsMetadata.license.title = ["License Title"]
24
24
  obj.rightsMetadata.license.url = ["http://library.duke.edu"]
25
25
  obj.roles.grant role1, role2, role3, role4
26
- obj.set_desc_metadata_values(:category, "Category Facet")
27
- obj.set_desc_metadata_values(:company, "Company Facet")
28
- obj.set_desc_metadata_values(:folder, "Folder Facet")
29
- obj.set_desc_metadata_values(:medium, "Medium Facet")
30
- obj.set_desc_metadata_values(:placement_company, "Placement Company Facet")
31
- obj.set_desc_metadata_values(:product, "Product Facet")
32
- obj.set_desc_metadata_values(:publication, "Publication Facet")
33
- obj.set_desc_metadata_values(:setting, "Setting Facet")
34
- obj.set_desc_metadata_values(:tone, "Tone Facet")
26
+ obj.set_desc_metadata_values(:arranger, "Arranger Value")
27
+ obj.set_desc_metadata_values(:category, "Category Value")
28
+ obj.set_desc_metadata_values(:company, "Company Value")
29
+ obj.set_desc_metadata_values(:composer, "Composer Value")
30
+ obj.set_desc_metadata_values(:engraver, "Engraver Value")
31
+ obj.set_desc_metadata_values(:folder, "Folder Value")
32
+ obj.set_desc_metadata_values(:genre, "Genre Value")
33
+ obj.set_desc_metadata_values(:illustrated, "Illustrated Value")
34
+ obj.set_desc_metadata_values(:illustrator, "Illustrator Value")
35
+ obj.set_desc_metadata_values(:instrumentation, "Instrumentation Value")
36
+ obj.set_desc_metadata_values(:interviewer_name, "Interviewer Name Value")
37
+ obj.set_desc_metadata_values(:lithographer, "Lithographer Value")
38
+ obj.set_desc_metadata_values(:lyricist, "Lyricist Value")
39
+ obj.set_desc_metadata_values(:medium, "Medium Value")
40
+ obj.set_desc_metadata_values(:performer, "Performer Value")
41
+ obj.set_desc_metadata_values(:placement_company, "Placement Company Value")
42
+ obj.set_desc_metadata_values(:producer, "Producer Value")
43
+ obj.set_desc_metadata_values(:product, "Product Value")
44
+ obj.set_desc_metadata_values(:publication, "Publication Value")
45
+ obj.set_desc_metadata_values(:roll_number, "10")
46
+ obj.set_desc_metadata_values(:setting, "Setting Value")
47
+ obj.set_desc_metadata_values(:subseries, "Subseries Value")
48
+ obj.set_desc_metadata_values(:temporal, "Temporal Value")
49
+ obj.set_desc_metadata_values(:tone, "Tone Value")
50
+ obj.set_desc_metadata_values(:volume, "100")
35
51
  end
36
52
 
37
53
  its([Indexing::ACCESS_ROLE]) { is_expected.to eq(obj.roles.to_json) }
54
+ its([Indexing::ARRANGER_FACET]) { is_expected.to eq(["Arranger Value"]) }
38
55
  its([Indexing::ASPACE_ID]) { is_expected.to eq("aspace_dccea43034e1b8261e14cf999e86449d") }
39
- its([Indexing::CATEGORY_FACET]) { is_expected.to eq(["Category Facet"]) }
40
- its([Indexing::COMPANY_FACET]) { is_expected.to eq(["Company Facet"]) }
56
+ its([Indexing::CATEGORY_FACET]) { is_expected.to eq(["Category Value"]) }
57
+ its([Indexing::COMPANY_FACET]) { is_expected.to eq(["Company Value"]) }
58
+ its([Indexing::COMPOSER_FACET]) { is_expected.to eq(["Composer Value"]) }
41
59
  its([Indexing::DISPLAY_FORMAT]) { is_expected.to eq("Image") }
42
60
  its([Indexing::DOI]) { is_expected.to eq(["http://doi.org/10.1000/182"]) }
43
- its([Indexing::FOLDER_FACET]) { is_expected.to eq(["Folder Facet"]) }
61
+ its([Indexing::ENGRAVER_FACET]) { is_expected.to eq(["Engraver Value"]) }
62
+ its([Indexing::FOLDER_FACET]) { is_expected.to eq(["Folder Value"]) }
63
+ its([Indexing::GENRE_FACET]) { is_expected.to eq(["Genre Value"]) }
64
+ its([Indexing::ILLUSTRATED_FACET]) { is_expected.to eq(["Illustrated Value"]) }
65
+ its([Indexing::ILLUSTRATOR_FACET]) { is_expected.to eq(["Illustrator Value"]) }
66
+ its([Indexing::INSTRUMENTATION_FACET]) { is_expected.to eq(["Instrumentation Value"]) }
67
+ its([Indexing::INTERVIEWER_NAME_FACET]) { is_expected.to eq(["Interviewer Name Value"]) }
44
68
  its([Indexing::LICENSE]) { is_expected.to eq("cc-by-nc-nd-40") }
45
69
  its([Indexing::LICENSE_DESCRIPTION]) { is_expected.to eq("License Description") }
46
70
  its([Indexing::LICENSE_TITLE]) { is_expected.to eq("License Title") }
47
71
  its([Indexing::LICENSE_URL]) { is_expected.to eq("http://library.duke.edu") }
72
+ its([Indexing::LITHOGRAPHER_FACET]) { is_expected.to eq(["Lithographer Value"]) }
48
73
  its([Indexing::LOCAL_ID]) { is_expected.to eq("foo") }
49
- its([Indexing::MEDIUM_FACET]) { is_expected.to eq(["Medium Facet"]) }
74
+ its([Indexing::LYRICIST_FACET]) { is_expected.to eq(["Lyricist Value"]) }
75
+ its([Indexing::MEDIUM_FACET]) { is_expected.to eq(["Medium Value"]) }
76
+ its([Indexing::PERFORMER_FACET]) { is_expected.to eq(["Performer Value"]) }
50
77
  its([Indexing::PERMANENT_ID]) { is_expected.to eq("ark:/99999/fk4zzz") }
51
78
  its([Indexing::PERMANENT_URL]) { is_expected.to eq("http://id.library.duke.edu/ark:/99999/fk4zzz") }
52
- its([Indexing::PLACEMENT_COMPANY_FACET]) { is_expected.to eq(["Placement Company Facet"]) }
79
+ its([Indexing::PLACEMENT_COMPANY_FACET]) { is_expected.to eq(["Placement Company Value"]) }
53
80
  its([Indexing::POLICY_ROLE]) { is_expected.to contain_exactly(role2.agent.first, role3.agent.first, role4.agent.first) }
54
- its([Indexing::PRODUCT_FACET]) { is_expected.to eq(["Product Facet"]) }
55
- its([Indexing::PUBLICATION_FACET]) { is_expected.to eq(["Publication Facet"]) }
81
+ its([Indexing::PRODUCER_FACET]) { is_expected.to eq(["Producer Value"]) }
82
+ its([Indexing::PRODUCT_FACET]) { is_expected.to eq(["Product Value"]) }
83
+ its([Indexing::PUBLICATION_FACET]) { is_expected.to eq(["Publication Value"]) }
56
84
  its([Indexing::RESOURCE_ROLE]) { is_expected.to contain_exactly(role1.agent.first) }
57
- its([Indexing::SETTING_FACET]) { is_expected.to eq(["Setting Facet"]) }
58
- its([Indexing::TONE_FACET]) { is_expected.to eq(["Tone Facet"]) }
85
+ its([Indexing::ROLL_NUMBER_FACET]) { is_expected.to eq(["10"]) }
86
+ its([Indexing::SETTING_FACET]) { is_expected.to eq(["Setting Value"]) }
87
+ its([Indexing::SUBSERIES_FACET]) { is_expected.to eq(["Subseries Value"]) }
88
+ its([Indexing::TEMPORAL_FACET]) { is_expected.to eq(["Temporal Value"]) }
89
+ its([Indexing::TONE_FACET]) { is_expected.to eq(["Tone Value"]) }
90
+ its([Indexing::VOLUME_FACET]) { is_expected.to eq(["100"]) }
59
91
  end
60
92
 
61
93
  describe "content-bearing object indexing" do
@@ -2,6 +2,33 @@ require 'spec_helper'
2
2
 
3
3
  RSpec.describe SolrDocument, type: :model, contacts: true do
4
4
 
5
+ describe "class methods" do
6
+ describe ".find" do
7
+ describe "when it exists" do
8
+ before { Item.create(pid: "test:1") }
9
+ subject { described_class.find("test:1") }
10
+ its(:id) { is_expected.to eq("test:1") }
11
+ end
12
+ describe "when not found" do
13
+ it "raises an error" do
14
+ expect { described_class.find("foo") }.to raise_error(SolrDocument::NotFound)
15
+ end
16
+ end
17
+ end
18
+ describe ".find_by_permanent_id" do
19
+ describe "when it exists" do
20
+ before { Item.create(pid: "test:1", permanent_id: "foo") }
21
+ subject { described_class.find_by_permanent_id("foo") }
22
+ its(:id) { is_expected.to eq("test:1") }
23
+ end
24
+ describe "when not found" do
25
+ it "raises an error" do
26
+ expect { described_class.find_by_permanent_id("foo") }.to raise_error(SolrDocument::NotFound)
27
+ end
28
+ end
29
+ end
30
+ end
31
+
5
32
  describe "index field method access" do
6
33
  describe "when there is an index field" do
7
34
  before { Ddr::Index::Fields.const_set(:FOO_BAR, "foo_bar_ssim") }
@@ -195,4 +222,5 @@ RSpec.describe SolrDocument, type: :model, contacts: true do
195
222
  end
196
223
  end
197
224
  end
225
+
198
226
  end
@@ -1,64 +1,91 @@
1
1
  module Ddr::Models
2
2
  RSpec.describe YearFacet do
3
3
 
4
- subject { described_class.new(obj) }
4
+ subject { described_class.call(obj) }
5
5
  let(:obj) { Item.new }
6
6
  before { obj.date = [ date ] }
7
7
 
8
8
  describe "splitting on semicolons" do
9
9
  let(:date) { "1935; 1936; 1937; 1938" }
10
- its(:values) { is_expected.to eq([1935, 1936, 1937, 1938]) }
10
+ it { is_expected.to eq([1935, 1936, 1937, 1938]) }
11
11
  end
12
12
 
13
13
  describe "year range" do
14
- %w( 1935-1940 1935/1940 ).each do |value|
14
+ %w( 1935-1940 1935/1940 1935?/1940? 1935~/1940~ ).each do |value|
15
15
  describe value do
16
16
  let(:date) { value }
17
- its(:values) { is_expected.to eq((1935..1940).to_a) }
17
+ it { is_expected.to eq((1935..1940).to_a) }
18
18
  end
19
19
  end
20
20
  end
21
21
 
22
- describe "in decade" do
23
- %w( 192x 192X 192? 192- 192-? ).each do |value|
22
+ describe "decade" do
23
+ %w( 192u 192x 192X 192? 192- 192-? 1920s 1920s? ).each do |value|
24
24
  describe value do
25
25
  let(:date) { value }
26
- its(:values) { is_expected.to eq((1920..1929).to_a) }
26
+ it { is_expected.to eq((1920..1929).to_a) }
27
27
  end
28
28
  end
29
29
  end
30
30
 
31
- describe "in century -- YYxx (19xx)" do
32
- let(:date) { "19xx" }
33
- its(:values) { is_expected.to eq((1900..1999).to_a) }
31
+ describe "century" do
32
+ %w( 19xx 19uu ).each do |value|
33
+ describe value do
34
+ let(:date) { value }
35
+ it { is_expected.to eq((1900..1999).to_a) }
36
+ end
37
+ end
34
38
  end
35
39
 
36
- describe "decade" do
37
- %w( 1920s 1920s? ).each do |value|
40
+ describe "uncertain interval" do
41
+ let(:date) { "199u/200u" }
42
+ it { is_expected.to eq((1990..2009).to_a) }
43
+ end
44
+
45
+ describe "set" do
46
+ let(:date) { "[1999,2000,2003]" }
47
+ it { is_expected.to eq([1999, 2000, 2003]) }
48
+ end
49
+
50
+ describe "year" do
51
+ %w( 2010 2010? 2010~ ).each do |value|
38
52
  describe value do
39
53
  let(:date) { value }
40
- its(:values) { is_expected.to eq((1920..1929).to_a) }
54
+ it { is_expected.to eq([2010]) }
41
55
  end
42
56
  end
43
57
  end
44
58
 
45
- describe "year + month" do
46
- %w( 2010-01 2010/01 ).each do |value|
59
+ describe "month" do
60
+ %w( 2010-01 2010/01 2010-12? 2010-11/2010-12 ).each do |value|
47
61
  describe value do
48
62
  let(:date) { value }
49
- its(:values) { is_expected.to eq([2010]) }
63
+ it { is_expected.to eq([2010]) }
50
64
  end
51
65
  end
52
66
  end
53
67
 
54
- describe "between" do
55
- let(:date) { "Between 1965 and 1968" }
56
- its(:values) { is_expected.to eq((1965..1968).to_a) }
68
+ describe "day" do
69
+ %w( 2010-12-10 2010-12-10? 2010-12-10/2010-12-20 ).each do |value|
70
+ describe value do
71
+ let(:date) { value }
72
+ it { is_expected.to eq([2010]) }
73
+ end
74
+ end
57
75
  end
58
76
 
59
- describe "year" do
60
- let(:date) { "1965" }
61
- its(:values) { is_expected.to eq([1965]) }
77
+ describe "season" do
78
+ %w( 2010-21 2010-22 2010-23 2010-24 ).each do |value|
79
+ describe value do
80
+ let(:date) { value }
81
+ it { is_expected.to eq([2010]) }
82
+ end
83
+ end
84
+ end
85
+
86
+ describe "between" do
87
+ let(:date) { "Between 1965 and 1968" }
88
+ it { is_expected.to eq((1965..1968).to_a) }
62
89
  end
63
90
 
64
91
  end