oai 0.0.3 → 0.0.4

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 (80) hide show
  1. data/README +80 -0
  2. data/Rakefile +113 -0
  3. data/bin/oai +68 -0
  4. data/examples/models/file_model.rb +63 -0
  5. data/examples/providers/dublin_core.rb +474 -0
  6. data/lib/oai.rb +7 -13
  7. data/lib/oai/client.rb +133 -83
  8. data/lib/oai/{get_record.rb → client/get_record.rb} +0 -0
  9. data/lib/oai/{header.rb → client/header.rb} +2 -2
  10. data/lib/oai/{identify.rb → client/identify.rb} +0 -0
  11. data/lib/oai/{list_identifiers.rb → client/list_identifiers.rb} +0 -0
  12. data/lib/oai/{list_metadata_formats.rb → client/list_metadata_formats.rb} +0 -0
  13. data/lib/oai/{list_records.rb → client/list_records.rb} +0 -0
  14. data/lib/oai/{list_sets.rb → client/list_sets.rb} +1 -1
  15. data/lib/oai/{metadata_format.rb → client/metadata_format.rb} +0 -0
  16. data/lib/oai/{record.rb → client/record.rb} +0 -0
  17. data/lib/oai/{response.rb → client/response.rb} +1 -1
  18. data/lib/oai/constants.rb +34 -0
  19. data/lib/oai/exception.rb +72 -1
  20. data/lib/oai/harvester.rb +38 -0
  21. data/lib/oai/harvester/config.rb +41 -0
  22. data/lib/oai/harvester/harvest.rb +144 -0
  23. data/lib/oai/harvester/logging.rb +70 -0
  24. data/lib/oai/harvester/mailer.rb +17 -0
  25. data/lib/oai/harvester/shell.rb +334 -0
  26. data/lib/oai/provider.rb +300 -0
  27. data/lib/oai/provider/metadata_format.rb +72 -0
  28. data/lib/oai/provider/metadata_format/oai_dc.rb +29 -0
  29. data/lib/oai/provider/model.rb +71 -0
  30. data/lib/oai/provider/model/activerecord_caching_wrapper.rb +135 -0
  31. data/lib/oai/provider/model/activerecord_wrapper.rb +136 -0
  32. data/lib/oai/provider/partial_result.rb +18 -0
  33. data/lib/oai/provider/response.rb +119 -0
  34. data/lib/oai/provider/response/error.rb +16 -0
  35. data/lib/oai/provider/response/get_record.rb +32 -0
  36. data/lib/oai/provider/response/identify.rb +24 -0
  37. data/lib/oai/provider/response/list_identifiers.rb +29 -0
  38. data/lib/oai/provider/response/list_metadata_formats.rb +21 -0
  39. data/lib/oai/provider/response/list_records.rb +32 -0
  40. data/lib/oai/provider/response/list_sets.rb +23 -0
  41. data/lib/oai/provider/response/record_response.rb +68 -0
  42. data/lib/oai/provider/resumption_token.rb +106 -0
  43. data/lib/oai/set.rb +14 -5
  44. data/test/activerecord_provider/config/connection.rb +5 -0
  45. data/test/activerecord_provider/config/database.yml +6 -0
  46. data/test/activerecord_provider/database/ar_migration.rb +59 -0
  47. data/test/activerecord_provider/database/oaipmhtest +0 -0
  48. data/test/activerecord_provider/fixtures/dc.yml +1501 -0
  49. data/test/activerecord_provider/helpers/providers.rb +44 -0
  50. data/test/activerecord_provider/helpers/set_provider.rb +36 -0
  51. data/test/activerecord_provider/models/dc_field.rb +7 -0
  52. data/test/activerecord_provider/models/dc_set.rb +6 -0
  53. data/test/activerecord_provider/models/oai_token.rb +3 -0
  54. data/test/activerecord_provider/tc_ar_provider.rb +93 -0
  55. data/test/activerecord_provider/tc_ar_sets_provider.rb +66 -0
  56. data/test/activerecord_provider/tc_caching_paging_provider.rb +53 -0
  57. data/test/activerecord_provider/tc_simple_paging_provider.rb +55 -0
  58. data/test/activerecord_provider/test_helper.rb +4 -0
  59. data/test/client/helpers/provider.rb +68 -0
  60. data/test/client/helpers/test_wrapper.rb +11 -0
  61. data/test/client/tc_exception.rb +36 -0
  62. data/test/{tc_get_record.rb → client/tc_get_record.rb} +11 -7
  63. data/test/client/tc_identify.rb +13 -0
  64. data/test/{tc_libxml.rb → client/tc_libxml.rb} +20 -10
  65. data/test/{tc_list_identifiers.rb → client/tc_list_identifiers.rb} +10 -8
  66. data/test/{tc_list_metadata_formats.rb → client/tc_list_metadata_formats.rb} +4 -1
  67. data/test/{tc_list_records.rb → client/tc_list_records.rb} +4 -1
  68. data/test/{tc_list_sets.rb → client/tc_list_sets.rb} +4 -2
  69. data/test/{tc_xpath.rb → client/tc_xpath.rb} +1 -1
  70. data/test/client/test_helper.rb +5 -0
  71. data/test/provider/models.rb +230 -0
  72. data/test/provider/tc_exceptions.rb +63 -0
  73. data/test/provider/tc_functional_tokens.rb +42 -0
  74. data/test/provider/tc_provider.rb +69 -0
  75. data/test/provider/tc_resumption_tokens.rb +46 -0
  76. data/test/provider/tc_simple_provider.rb +85 -0
  77. data/test/provider/test_helper.rb +36 -0
  78. metadata +123 -27
  79. data/test/tc_exception.rb +0 -38
  80. data/test/tc_identify.rb +0 -8
@@ -0,0 +1,11 @@
1
+ module Test::Unit
2
+ class AutoRunner
3
+ alias_method :real_run, :run
4
+
5
+ def run
6
+ ProviderServer.wrap { real_run }
7
+ end
8
+
9
+ end
10
+
11
+ end
@@ -0,0 +1,36 @@
1
+ require 'test_helper'
2
+
3
+ class ExceptionTest < Test::Unit::TestCase
4
+
5
+ def test_http_error
6
+ client = OAI::Client.new 'http://www.example.com'
7
+ assert_raises(OAI::Exception) { client.identify }
8
+ end
9
+
10
+ def test_xml_error
11
+ client = OAI::Client.new 'http://www.yahoo.com'
12
+ begin
13
+ client.identify
14
+ rescue OAI::Exception => e
15
+ assert_match /response not well formed XML/, e.to_s, 'xml error'
16
+ end
17
+ end
18
+
19
+ def test_oai_error
20
+ client = OAI::Client.new 'http://localhost:3333/oai'
21
+ assert_raises(OAI::Exception) do
22
+ client.list_identifiers :resumption_token => 'bogus'
23
+ end
24
+ end
25
+
26
+ # must pass in options as a hash
27
+ def test_parameter_error
28
+ client = OAI::Client.new 'http://localhost:3333/oai'
29
+ assert_raises(OAI::ArgumentException) {client.get_record('foo')}
30
+ assert_raises(OAI::ArgumentException) {client.list_identifiers('foo')}
31
+ assert_raises(OAI::ArgumentException) {client.list_records('foo')}
32
+ assert_raises(OAI::ArgumentException) {client.list_metadata_formats('foo')}
33
+ assert_raises(OAI::ArgumentException) {client.list_sets('foo')}
34
+ end
35
+
36
+ end
@@ -1,22 +1,25 @@
1
+ require 'test_helper'
2
+
1
3
  class GetRecordTest < Test::Unit::TestCase
4
+
2
5
  def test_get_one
3
- client = OAI::Client.new 'http://www.pubmedcentral.gov/oai/oai.cgi'
4
- response = client.get_record :identifier => 'oai:pubmedcentral.gov:13901'
6
+ client = OAI::Client.new 'http://localhost:3333/oai'
7
+ response = client.get_record :identifier => 'oai:test/3'
5
8
  assert_kind_of OAI::GetRecordResponse, response
6
9
  assert_kind_of OAI::Record, response.record
7
10
  assert_kind_of REXML::Element, response.record.metadata
8
11
  assert_kind_of OAI::Header, response.record.header
9
12
 
10
13
  # minimal check that the header is working
11
- assert_equal 'oai:pubmedcentral.gov:13901',
14
+ assert_equal 'oai:test/3',
12
15
  response.record.header.identifier
13
16
 
14
17
  # minimal check that the metadata is working
15
- assert 'en', response.record.metadata.elements['.//dc:language'].text
18
+ #assert 'en', response.record.metadata.elements['.//dc:language'].text
16
19
  end
17
20
 
18
21
  def test_missing_identifier
19
- client = OAI::Client.new 'http://www.pubmedcentral.gov/oai/oai.cgi'
22
+ client = OAI::Client.new 'http://localhost:3333/oai'
20
23
  begin
21
24
  client.get_record :metadata_prefix => 'oai_dc'
22
25
  flunk 'invalid get_record did not throw OAI::Exception'
@@ -26,8 +29,9 @@ class GetRecordTest < Test::Unit::TestCase
26
29
  end
27
30
 
28
31
  def test_deleted_record
29
- client = OAI::Client.new 'http://ir.library.oregonstate.edu/dspace-oai/request'
30
- record = client.get_record :identifier => 'oai:ir.library.oregonstate.edu:1957/19'
32
+ client = OAI::Client.new 'http://localhost:3333/oai'
33
+ record = client.get_record :identifier => 'oai:test/275'
31
34
  assert record.deleted?
32
35
  end
36
+
33
37
  end
@@ -0,0 +1,13 @@
1
+ require 'test_helper'
2
+
3
+ class IdentifyTest < Test::Unit::TestCase
4
+
5
+ def test_ok
6
+ client = OAI::Client.new 'http://localhost:3333/oai'
7
+ response = client.identify
8
+ assert_kind_of OAI::IdentifyResponse, response
9
+ assert_equal 'Complex Provider [http://localhost]', response.to_s
10
+ #assert_equal 'PubMed Central (PMC3 - NLM DTD) [http://www.pubmedcentral.gov/oai/oai.cgi]', response.to_s
11
+ end
12
+
13
+ end
@@ -1,9 +1,11 @@
1
+ require 'test_helper'
2
+
1
3
  class LibXMLTest < Test::Unit::TestCase
2
4
 
3
5
  def test_oai_exception
4
6
  return unless have_libxml
5
7
 
6
- uri = 'http://www.pubmedcentral.gov/oai/oai.cgi'
8
+ uri = 'http://localhost:3333/oai'
7
9
  client = OAI::Client.new uri, :parser => 'libxml'
8
10
  assert_raises(OAI::Exception) {client.get_record(:identifier => 'nosuchid')}
9
11
  end
@@ -14,36 +16,44 @@ class LibXMLTest < Test::Unit::TestCase
14
16
  # since there is regex magic going on to remove default oai namespaces
15
17
  # it's worth trying a few different oai targets
16
18
  oai_targets = %w{
17
- http://etd.caltech.edu:80/ETD-db/OAI/oai
18
- http://ir.library.oregonstate.edu/dspace-oai/request
19
- http://libeprints.open.ac.uk/perl/oai2
20
- http://memory.loc.gov/cgi-bin/oai2_0
19
+ http://localhost:3333/oai
21
20
  }
22
21
 
22
+ #oai_targets = %w{
23
+ # http://etd.caltech.edu:80/ETD-db/OAI/oai
24
+ # http://ir.library.oregonstate.edu/dspace-oai/request
25
+ # http://memory.loc.gov/cgi-bin/oai2_0
26
+ # http://libeprints.open.ac.uk/perl/oai2
27
+ #}
28
+
29
+
23
30
  oai_targets.each do |uri|
24
31
  client = OAI::Client.new uri, :parser => 'libxml'
25
32
  records = client.list_records
26
33
  records.each do |record|
27
34
  assert record.header.identifier
28
- next unless record.deleted?
35
+ next if record.deleted?
29
36
  assert_kind_of XML::Node, record.metadata
30
37
  end
31
38
  end
32
39
  end
33
40
 
34
41
  def test_deleted_record
35
- uri = 'http://ir.library.oregonstate.edu/dspace-oai/request'
42
+ return unless have_libxml
43
+
44
+ uri = 'http://localhost:3333/oai'
36
45
  client = OAI::Client.new(uri, :parser => 'libxml')
37
- record = client.get_record :identifier => 'oai:ir.library.oregonstate.edu:1957/19'
46
+ response = client.get_record :identifier => 'oai:test/275'
47
+ assert response.record.deleted?
38
48
  end
39
-
49
+
40
50
  private
41
51
 
42
52
  def have_libxml
43
53
  begin
44
54
  require 'xml/libxml'
45
55
  return true
46
- rescue
56
+ rescue LoadError
47
57
  return false
48
58
  end
49
59
  end
@@ -1,7 +1,9 @@
1
+ require 'test_helper'
2
+
1
3
  class ListIdentifiersTest < Test::Unit::TestCase
2
4
 
3
5
  def test_list_with_resumption_token
4
- client = OAI::Client.new 'http://www.pubmedcentral.gov/oai/oai.cgi'
6
+ client = OAI::Client.new 'http://localhost:3333/oai'
5
7
 
6
8
  # get a list of identifier headers
7
9
  response = client.list_identifiers :metadata_prefix => 'oai_dc'
@@ -26,16 +28,16 @@ class ListIdentifiersTest < Test::Unit::TestCase
26
28
  end
27
29
 
28
30
  def test_list_with_date_range
29
- client = OAI::Client.new 'http://alcme.oclc.org/xtcat/servlet/OAIHandler'
30
- from_date = Date.new(2001,1,1)
31
- until_date = Date.new(2006,1,1)
31
+ client = OAI::Client.new 'http://localhost:3333/oai'
32
+ from_date = Date.new(1998,1,1)
33
+ until_date = Date.new(2002,1,1)
32
34
  response = client.list_identifiers :from => from_date, :until => until_date
33
35
  assert response.entries.size > 0
34
36
  end
35
37
 
36
38
  def test_list_with_datetime_range
37
39
  # xtcat should support higher granularity
38
- client = OAI::Client.new 'http://alcme.oclc.org/xtcat/servlet/OAIHandler'
40
+ client = OAI::Client.new 'http://localhost:3333/oai'
39
41
  from_date = DateTime.new(2001,1,1)
40
42
  until_date = DateTime.now
41
43
  response = client.list_identifiers :from => from_date, :until => until_date
@@ -43,8 +45,8 @@ class ListIdentifiersTest < Test::Unit::TestCase
43
45
  end
44
46
 
45
47
  def test_invalid_argument
46
- client = OAI::Client.new 'http://arXiv.org/oai2'
47
- assert_raise(OAI::Exception) {client.list_identifiers :foo => 'bar'}
48
+ client = OAI::Client.new 'http://localhost:3333/oai'
49
+ assert_raise(OAI::ArgumentException) {client.list_identifiers :foo => 'bar'}
48
50
  end
49
-
51
+
50
52
  end
@@ -1,6 +1,8 @@
1
+ require 'test_helper'
2
+
1
3
  class ListMetadataFormatsTest < Test::Unit::TestCase
2
4
  def test_list
3
- client = OAI::Client.new 'http://www.pubmedcentral.gov/oai/oai.cgi'
5
+ client = OAI::Client.new 'http://localhost:3333/oai'
4
6
  response = client.list_metadata_formats
5
7
  assert_kind_of OAI::ListMetadataFormatsResponse, response
6
8
  assert response.entries.size > 0
@@ -11,5 +13,6 @@ class ListMetadataFormatsTest < Test::Unit::TestCase
11
13
  assert_equal 'http://www.openarchives.org/OAI/2.0/oai_dc.xsd', format.schema
12
14
  assert_equal 'http://www.openarchives.org/OAI/2.0/oai_dc/', format.namespace
13
15
  end
16
+
14
17
  end
15
18
 
@@ -1,9 +1,12 @@
1
+ require 'test_helper'
2
+
1
3
  class GetRecordsTest < Test::Unit::TestCase
2
4
  def test_get_records
3
- client = OAI::Client.new 'http://www.pubmedcentral.gov/oai/oai.cgi'
5
+ client = OAI::Client.new 'http://localhost:3333/oai'
4
6
  response = client.list_records
5
7
  assert_kind_of OAI::ListRecordsResponse, response
6
8
  assert response.entries.size > 0
7
9
  assert_kind_of OAI::Record, response.entries[0]
8
10
  end
11
+
9
12
  end
@@ -1,7 +1,9 @@
1
+ require 'test_helper'
2
+
1
3
  class ListSetsTest < Test::Unit::TestCase
2
4
 
3
5
  def test_list
4
- client = OAI::Client.new 'http://www.pubmedcentral.gov/oai/oai.cgi'
6
+ client = OAI::Client.new 'http://localhost:3333/oai'
5
7
  response = client.list_sets
6
8
  assert_kind_of OAI::ListSetsResponse, response
7
9
  assert response.entries.size > 0
@@ -12,6 +14,6 @@ class ListSetsTest < Test::Unit::TestCase
12
14
  assert_kind_of OAI::Set, set
13
15
  end
14
16
  end
15
-
17
+
16
18
  end
17
19
 
@@ -1,4 +1,4 @@
1
- require 'oai/xpath'
1
+ require 'test_helper'
2
2
 
3
3
  class XpathTest < Test::Unit::TestCase
4
4
  include OAI::XPath
@@ -0,0 +1,5 @@
1
+ require 'oai'
2
+ require 'test/unit'
3
+
4
+ require File.dirname(__FILE__) + '/helpers/provider'
5
+ require File.dirname(__FILE__) + '/helpers/test_wrapper'
@@ -0,0 +1,230 @@
1
+ class Record
2
+ attr_accessor :id, :titles, :creator, :tags, :sets, :updated_at, :deleted
3
+
4
+ def initialize(id,
5
+ titles = 'title',
6
+ creator = 'creator',
7
+ tags = 'tag',
8
+ sets = nil,
9
+ deleted = false,
10
+ updated_at = Time.new.utc)
11
+
12
+ @id = id;
13
+ @titles = titles
14
+ @creator = creator
15
+ @tags = tags
16
+ @sets = sets
17
+ @deleted = deleted
18
+ @updated_at = updated_at
19
+ end
20
+
21
+ # Override Object.id
22
+ def id
23
+ @id
24
+ end
25
+
26
+ def in_set(spec)
27
+ if @sets.respond_to?(:each)
28
+ @sets.each { |set| return true if set.spec == spec }
29
+ else
30
+ return true if @sets.spec == spec
31
+ end
32
+ false
33
+ end
34
+
35
+ end
36
+
37
+ class TestModel < OAI::Provider::Model
38
+ include OAI::Provider
39
+
40
+ def initialize(limit = nil)
41
+ super(limit)
42
+ @records = []
43
+ @sets = []
44
+ @earliest = Time.now
45
+ end
46
+
47
+ def earliest
48
+ (@records.min {|a,b| a.updated_at <=> b.updated_at }).updated_at
49
+ end
50
+
51
+ def latest
52
+ @records.max {|a,b| a.updated_at <=> b.updated_at }.updated_at
53
+ end
54
+
55
+ def sets
56
+ @sets
57
+ end
58
+
59
+ def find(selector, opts={})
60
+ return nil unless selector
61
+
62
+ case selector
63
+ when :all
64
+ if opts[:resumption_token]
65
+ raise OAI::ResumptionTokenException.new unless @limit
66
+ begin
67
+ token = ResumptionToken.parse(opts[:resumption_token])
68
+
69
+ if token.last < @groups.size - 1
70
+ PartialResult.new(@groups[token.last], token.next(token.last + 1))
71
+ else
72
+ @groups[token.last]
73
+ end
74
+ rescue
75
+ raise OAI::ResumptionTokenException.new
76
+ end
77
+ else
78
+ records = @records.select do |rec|
79
+ ((opts[:set].nil? || rec.in_set(opts[:set])) &&
80
+ (opts[:from].nil? || rec.updated_at >= opts[:from]) &&
81
+ (opts[:until].nil? || rec.updated_at <= opts[:until]))
82
+ end
83
+
84
+ if @limit && records.size > @limit
85
+ @groups = generate_chunks(records, @limit)
86
+ return PartialResult.new(@groups[0],
87
+ ResumptionToken.new(opts.merge({:last => 1})))
88
+ end
89
+ return records
90
+ end
91
+ else
92
+ begin
93
+ @records.each do |record|
94
+ return record if record.id.to_s == selector
95
+ end
96
+ rescue
97
+ end
98
+ nil
99
+ end
100
+ end
101
+
102
+ def generate_chunks(records, limit)
103
+ groups = []
104
+ records.each_slice(limit) do |group|
105
+ groups << group
106
+ end
107
+ groups
108
+ end
109
+
110
+ def generate_records(number, timestamp = Time.now, sets = [], deleted = false)
111
+ @earliest = timestamp.dup if @earliest.nil? || timestamp < @earliest
112
+
113
+ # Add any sets we don't already have
114
+ sets = [sets] unless sets.respond_to?(:each)
115
+ sets.each do |set|
116
+ @sets << set unless @sets.include?(set)
117
+ end
118
+
119
+ # Generate some records
120
+ number.times do |id|
121
+ rec = Record.new(@records.size, "title_#{id}", "creator_#{id}", "tag_#{id}")
122
+ rec.updated_at = timestamp.utc
123
+ rec.sets = sets
124
+ rec.deleted = deleted
125
+ @records << rec
126
+ end
127
+ end
128
+
129
+ end
130
+
131
+ class SimpleModel < TestModel
132
+
133
+ def initialize
134
+ super
135
+ # Create a couple of sets
136
+ set_one = OAI::Set.new()
137
+ set_one.name = "Test Set One"
138
+ set_one.spec = "A"
139
+ set_one.description = "This is test set one."
140
+
141
+ set_two = OAI::Set.new()
142
+ set_two.name = "Test Set Two"
143
+ set_two.spec = "A:B"
144
+ set_two.description = "This is test set two."
145
+
146
+ generate_records(5, Chronic.parse("oct 5 2002"), set_one)
147
+ generate_records(1, Chronic.parse("nov 5 2002"), [set_two], true)
148
+ generate_records(4, Chronic.parse("nov 5 2002"), [set_two])
149
+ end
150
+
151
+ end
152
+
153
+ class BigModel < TestModel
154
+
155
+ def initialize(limit = nil)
156
+ super(limit)
157
+ generate_records(100, Chronic.parse("October 2 2000"))
158
+ generate_records(100, Chronic.parse("November 2 2000"))
159
+ generate_records(100, Chronic.parse("December 2 2000"))
160
+ generate_records(100, Chronic.parse("January 2 2001"))
161
+ generate_records(100, Chronic.parse("February 2 2001"))
162
+ end
163
+
164
+ end
165
+
166
+ class MappedModel < TestModel
167
+
168
+ def initialize
169
+ super
170
+ set_one = OAI::Set.new()
171
+ set_one.name = "Test Set One"
172
+ set_one.spec = "A"
173
+ set_one.description = "This is test set one."
174
+
175
+ generate_records(5, Chronic.parse("dec 1 2006"), set_one)
176
+ end
177
+
178
+ def map_oai_dc
179
+ {:title => :creator, :creator => :titles, :subject => :tags}
180
+ end
181
+
182
+ end
183
+
184
+ class ComplexModel < TestModel
185
+
186
+ def initialize(limit = nil)
187
+ super(limit)
188
+ # Create a couple of sets
189
+ set_one = OAI::Set.new
190
+ set_one.name = "Set One"
191
+ set_one.spec = "One"
192
+ set_one.description = "This is test set one."
193
+
194
+ set_two = OAI::Set.new
195
+ set_two.name = "Set Two"
196
+ set_two.spec = "Two"
197
+ set_two.description = "This is test set two."
198
+
199
+ set_three = OAI::Set.new
200
+ set_three.name = "Set Three"
201
+ set_three.spec = "Three"
202
+ set_three.description = "This is test set three."
203
+
204
+ set_four = OAI::Set.new
205
+ set_four.name = "Set Four"
206
+ set_four.spec = "Four"
207
+ set_four.description = "This is test set four."
208
+
209
+ set_one_two = OAI::Set.new
210
+ set_one_two.name = "Set One and Two"
211
+ set_one_two.spec = "One:Two"
212
+ set_one_two.description = "This is combination set of One and Two."
213
+
214
+ set_three_four = OAI::Set.new
215
+ set_three_four.name = "Set Three and Four"
216
+ set_three_four.spec = "Three:Four"
217
+ set_three_four.description = "This is combination set of Three and Four."
218
+
219
+ generate_records(250, Chronic.parse("May 2 1998"), [set_one, set_one_two])
220
+ generate_records(50, Chronic.parse("June 2 1998"), [set_one, set_one_two], true)
221
+ generate_records(50, Chronic.parse("October 10 1998"), [set_three, set_three_four], true)
222
+ generate_records(250, Chronic.parse("July 2 2002"), [set_two, set_one_two])
223
+
224
+ generate_records(250, Chronic.parse("September 15 2004"), [set_three, set_three_four])
225
+ generate_records(50, Chronic.parse("October 10 2004"), [set_three, set_three_four], true)
226
+ generate_records(250, Chronic.parse("December 25 2005"), [set_four, set_three_four])
227
+ end
228
+
229
+ end
230
+