ddr-models 2.5.3 → 2.6.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
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