bibtex-ruby 2.1.2 → 2.2.0

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.

Potentially problematic release.


This version of bibtex-ruby might be problematic. Click here for more details.

data/lib/bibtex/value.rb CHANGED
@@ -77,6 +77,22 @@ module BibTeX
77
77
  @tokens = other.tokens.dup
78
78
  end
79
79
 
80
+ def merge(other)
81
+ dup.merge!(other)
82
+ end
83
+
84
+ def merge!(other)
85
+ other.tokens.each do |token|
86
+ add token unless include_token?(token)
87
+ end
88
+
89
+ self
90
+ end
91
+
92
+ def include_token?(token)
93
+ tokens.include?(token)
94
+ end
95
+
80
96
  def add(argument)
81
97
  case argument
82
98
  when Value
@@ -127,10 +143,17 @@ module BibTeX
127
143
  # Value.new('foo', 'bar').join #=> <'foobar'>
128
144
  # Value.new(:foo, 'bar').join #=> <:foo, 'bar'>
129
145
  #
130
- # Returns the Value instance with all consecutive String tokens joined.
131
- def join
146
+ # @param {String} separator
147
+ #
148
+ # @return {Value} the instance with all consecutive String tokens joined
149
+ def join(separator = '')
132
150
  @tokens = @tokens.inject([]) do |a,b|
133
- a[-1].is_a?(::String) && b.is_a?(::String) ? a[-1] += b : a << b; a
151
+ if a[-1].is_a?(::String) && b.is_a?(::String)
152
+ a[-1] = [a[-1], b].join(separator)
153
+ else
154
+ a << b
155
+ end
156
+ a
134
157
  end
135
158
  self
136
159
  end
@@ -19,8 +19,8 @@
19
19
  module BibTeX
20
20
  module Version
21
21
  MAJOR = 2
22
- MINOR = 1
23
- PATCH = 2
22
+ MINOR = 2
23
+ PATCH = 0
24
24
  BUILD = nil
25
25
 
26
26
  STRING = [MAJOR, MINOR, PATCH, BUILD].compact.join('.').freeze
@@ -3,9 +3,9 @@
3
3
  require 'helper'
4
4
 
5
5
  module BibTeX
6
-
6
+
7
7
  class BibliographyTest < MiniTest::Spec
8
-
8
+
9
9
  describe 'when newly created' do
10
10
  it 'should not be nil' do
11
11
  assert Bibliography.new
@@ -20,11 +20,11 @@ module BibTeX
20
20
  tmp = Tempfile.new('bibtex')
21
21
  tmp.close
22
22
  b = BibTeX.open(Test.fixtures(:bibdesk)).save_to(tmp.path)
23
-
23
+
24
24
  BibTeX.open(tmp.path) do |bib|
25
25
  bib.delete(:rails)
26
26
  end
27
-
27
+
28
28
  assert_equal b.length - 1, BibTeX.open(tmp.path).length
29
29
  end
30
30
 
@@ -32,14 +32,14 @@ module BibTeX
32
32
 
33
33
  describe '.parse' do
34
34
  it 'accepts filters' do
35
- Bibliography.parse("@misc{k, title = {\\''u}}", :filter => 'latex')[0].title.must_be :==, 'ü'
35
+ Bibliography.parse("@misc{k, title = {\\''u}}", :filter => 'latex')[0].title.must_be :==, 'ü'
36
36
  end
37
37
 
38
38
  it 'accepts filters in an array' do
39
- Bibliography.parse("@misc{k, title = {\\''u}}", :filter => ['latex'])[0].title.must_be :==, 'ü'
39
+ Bibliography.parse("@misc{k, title = {\\''u}}", :filter => ['latex'])[0].title.must_be :==, 'ü'
40
40
  end
41
41
  end
42
-
42
+
43
43
  describe 'given a populated biliography' do
44
44
  before do
45
45
  @bib = BibTeX.parse <<-END
@@ -78,13 +78,13 @@ module BibTeX
78
78
  }
79
79
  END
80
80
  end
81
-
81
+
82
82
  describe '#entries_at' do
83
83
  it 'returns a list of all entries identified by the passed-in keys' do
84
84
  assert_equal [@bib['segaran2007'], @bib['rails']], @bib.entries_at('segaran2007', :rails)
85
85
  end
86
86
  end
87
-
87
+
88
88
  describe '#extend_initials' do
89
89
  it 'extends the initials in matching names' do
90
90
  @bib.names.map(&:to_s).wont_include 'Flanagan, Dave'
@@ -92,41 +92,56 @@ module BibTeX
92
92
  @bib.names.map(&:to_s).must_include 'Flanagan, Dave'
93
93
  end
94
94
  end
95
-
95
+
96
96
  describe '#extend_initials!' do
97
97
  it 'extends the initials of all names to the longest prototype' do
98
98
  assert_equal "Ruby, Sam Thomas, Dave Hansson Heinemeier, David Flanagan, David Matsumoto, Y. Segaran, T.",
99
99
  @bib.extend_initials!.names.map(&:sort_order).uniq.join(' ')
100
100
  end
101
101
  end
102
-
102
+
103
103
  describe '#unify' do
104
104
  it 'sets all fields matching the given pattern to the passed-in value' do
105
105
  @bib.unify :publisher, /reilly/i, 'OReilly'
106
106
  assert_equal 'OReilly', @bib['segaran2007'].publisher
107
107
  assert_equal 'OReilly', @bib['flanagan2008'].publisher
108
108
  end
109
-
109
+
110
110
  it 'does not change the value of fields that do not match' do
111
111
  @bib.unify :publisher, /reilly/i, 'OReilly'
112
112
  assert_equal 'The Pragmatic Bookshelf', @bib['rails'].publisher
113
113
  end
114
-
114
+
115
115
  it 'passes each entry with matching fields to the block if given' do
116
116
  years = []
117
117
  @bib.unify(:publisher, /reilly/i) { |e| years << e.year.to_s }
118
118
  assert_equal ['2007','2008'], years.sort
119
119
  end
120
-
120
+
121
121
  it 'returns the bibliography' do
122
122
  assert_equal @bib, @bib.unify(:publisher, /reilly/i, 'OReilly')
123
123
  end
124
124
  end
125
-
125
+
126
+ describe '#group_by' do
127
+ it 'returns an empy hash by default' do
128
+ assert_equal({}, Bibliography.new.group_by)
129
+ assert_equal({}, Bibliography.new.group_by(:a, :b))
130
+ end
131
+
132
+ it 'returns a hash with all the entries mapped to their default digest' do
133
+ assert_equal @bib.entries.length, @bib.group_by.length
134
+ end
135
+
136
+ it 'uses the given block to determine the key' do
137
+ assert_equal @bib.entries.length, (@bib.group_by { 'x' })['x'].length
138
+ end
139
+ end
140
+
126
141
  it 'supports access by index' do
127
- assert_equal 'ruby', @bib[1].keywords
142
+ assert_equal 'ruby', @bib[1].keywords
128
143
  end
129
-
144
+
130
145
  it 'supports access by range' do
131
146
  assert_equal %w{2008 2007}, @bib[1..2].map(&:year)
132
147
  end
@@ -134,7 +149,7 @@ module BibTeX
134
149
  it 'supports access by index and offset' do
135
150
  assert_equal %w{2008 2007}, @bib[1,2].map(&:year)
136
151
  end
137
-
152
+
138
153
  it 'supports queries by symbol key' do
139
154
  refute_nil @bib[:rails]
140
155
  assert_nil @bib[:ruby]
@@ -145,7 +160,7 @@ module BibTeX
145
160
  refute_nil @bib.q(:first, :rails)
146
161
  assert_nil @bib.q(:first, :railss)
147
162
  end
148
-
163
+
149
164
  it 'supports queries by string key' do
150
165
  refute_nil @bib['rails']
151
166
  assert_nil @bib['ruby']
@@ -171,7 +186,7 @@ module BibTeX
171
186
  assert_equal 0, @bib[/reilly/].length
172
187
  assert_equal 2, @bib[/reilly/i].length
173
188
  end
174
-
189
+
175
190
  it 'supports queries by type string and conditions' do
176
191
  assert_equal 1, @bib['@book[keywords=ruby]'].length
177
192
  end
@@ -209,20 +224,20 @@ module BibTeX
209
224
  entry.year = '2006'
210
225
  assert_equal 0, @bib[entry].length
211
226
  end
212
-
227
+
213
228
  it 'supports query and additional block' do
214
229
  assert_equal 1, @bib.q('@book') { |e| e.keywords.split(/,/).length > 1 }.length
215
230
  end
216
-
231
+
217
232
  it 'supports saving the bibliography to a file' do
218
233
  tmp = Tempfile.new('bibtex')
219
234
  tmp.close
220
235
  @bib.save_to(tmp.path)
221
236
  assert_equal @bib.length, BibTeX.open(tmp.path).length
222
237
  end
223
-
238
+
224
239
  describe '#query' do
225
-
240
+
226
241
  it 'returns all elements when passed no arguments' do
227
242
  @bib.query.length.must_be :==, 6
228
243
  end
@@ -230,47 +245,47 @@ module BibTeX
230
245
  it 'returns all elements when passed :all and an empty condition' do
231
246
  @bib.query(:all, '').length.must_be :==, 6
232
247
  end
233
-
248
+
234
249
  it 'returns all entries when passed a * wildcard' do
235
250
  @bib.query('@*').length.must_be :==, 5
236
251
  end
237
-
252
+
238
253
  end
239
-
254
+
240
255
  describe 'given a filter' do
241
256
  before do
242
257
  @filter = Object
243
258
  def @filter.apply (value); value.is_a?(::String) ? value.upcase : value; end
244
259
  end
245
-
260
+
246
261
  it 'supports arbitrary conversions' do
247
262
  @bib.convert(@filter)
248
263
  assert_equal 'RUBY, RAILS', @bib[:rails].keywords
249
264
  end
250
-
265
+
251
266
  it 'supports conditional arbitrary conversions' do
252
267
  @bib.convert(@filter) { |e| e.key != 'rails' }
253
268
  assert_equal 'ruby, rails', @bib[:rails].keywords
254
269
  assert_equal 'RUBY', @bib[:flanagan2008].keywords
255
270
  end
256
-
271
+
257
272
  end
258
-
273
+
259
274
  describe 'LaTeX filter' do
260
275
  before do
261
276
  @bib['rails'].keywords = 'r\\"uby'
262
277
  end
263
-
278
+
264
279
  it 'converts LaTeX umlauts' do
265
280
  @bib.convert(:latex)['rails'].keywords.must_be :==, 'rüby'
266
281
  end
267
-
282
+
268
283
  end
269
-
284
+
270
285
  describe 'BibTeXML export' do
271
286
  before { @bibtexml = Tempfile.new('bibtexml') }
272
287
  after { @bibtexml.unlink }
273
-
288
+
274
289
  it 'supports exporting to BibTeXML' do
275
290
  @bib.to_xml.write(@bibtexml, 2)
276
291
  @bibtexml.rewind
@@ -286,10 +301,10 @@ module BibTeX
286
301
  xml.root.namespace.must_be :==, 'http://bibtexml.sf.net/'
287
302
  xml.root.get_elements('//bibtex:person').wont_be_empty
288
303
  end
289
-
304
+
290
305
  end
291
306
  end
292
-
293
-
307
+
308
+
294
309
  end
295
310
  end
@@ -23,12 +23,12 @@ module BibTeX
23
23
  it 'has no cross-reference by default' do
24
24
  assert_equal false, Entry.new.has_cross_reference?
25
25
  end
26
-
26
+
27
27
  it 'is not cross-referenced by default' do
28
28
  assert_equal false, Entry.new.cross_referenced?
29
29
  Entry.new.cross_referenced_by.must_be_empty
30
30
  end
31
-
31
+
32
32
  describe 'given a bibliography with cross referenced entries' do
33
33
  before do
34
34
  @bib = Bibliography.parse <<-END
@@ -37,7 +37,7 @@ module BibTeX
37
37
  @incollection{b1, crossref = "b"}
38
38
  END
39
39
  end
40
-
40
+
41
41
  describe '#has_cross_reference?' do
42
42
  it 'returns true if the entry has a valid cross-reference' do
43
43
  assert_equal true, @bib['a1'].has_cross_reference?
@@ -47,7 +47,7 @@ module BibTeX
47
47
  assert_equal false, @bib['b1'].has_cross_reference?
48
48
  end
49
49
  end
50
-
50
+
51
51
  describe '#cross_referenced?' do
52
52
  it 'returns true if the entry is cross-referenced by another entry' do
53
53
  assert_equal true, @bib['a'].cross_referenced?
@@ -56,23 +56,23 @@ module BibTeX
56
56
  assert_equal false, @bib['a1'].cross_referenced?
57
57
  end
58
58
  end
59
-
59
+
60
60
  describe '#cross_referenced_by' do
61
61
  it 'returns a list of all entries that cross-reference this entry' do
62
62
  @bib['a'].cross_referenced_by.must_include(@bib['a1'])
63
63
  end
64
-
64
+
65
65
  it 'returns an empty list if there are no cross-references to this entry' do
66
66
  @bib['a1'].cross_referenced_by.must_be_empty
67
67
  end
68
68
  end
69
-
69
+
70
70
  describe '#respond_to?' do
71
71
  it 'takes into account the inherited attributes' do
72
72
  @bib['a1'].respond_to?(:title)
73
73
  end
74
74
  end
75
-
75
+
76
76
  describe 'resolve field values using array accessors #[]' do
77
77
  describe 'when a "title" is set in the entry itself' do
78
78
  before { @bib['a1'].title = 'A1' }
@@ -80,13 +80,13 @@ module BibTeX
80
80
  @bib['a1'].title.must_be :==, 'A1'
81
81
  end
82
82
  end
83
-
83
+
84
84
  describe 'when "title" is undefined for the entry but defined in the reference' do
85
85
  it 'returns the referenced title' do
86
86
  @bib['a1'].title.must_be :==, @bib['a'].title
87
87
  end
88
88
  end
89
-
89
+
90
90
  describe 'when "booktitle" is undefined for the entry but defined in the reference' do
91
91
  before { @bib['a'].booktitle = "A Booktitle" }
92
92
  it 'returns the referenced booktitle' do
@@ -99,7 +99,7 @@ module BibTeX
99
99
  @bib['a1'].booktitle.must_be :==, @bib['a'].title
100
100
  end
101
101
  end
102
-
102
+
103
103
  it 'does not store referenced values permanently' do
104
104
  refute_nil @bib['a1'].booktitle
105
105
  assert_nil @bib['a1'].fields[:booktitle]
@@ -109,20 +109,20 @@ module BibTeX
109
109
  it 'returns an empty list by default' do
110
110
  Entry.new.inherited_fields.must_be_empty
111
111
  end
112
-
112
+
113
113
  it 'returns an empty list if this entry has no cross-reference' do
114
114
  @bib['a'].inherited_fields.must_be_empty
115
115
  end
116
-
116
+
117
117
  it 'returns an empty list if this entry has a cross-reference but the reference does not exist in the bibliography' do
118
118
  @bib['b1'].inherited_fields.must_be_empty
119
119
  end
120
-
120
+
121
121
  it 'returns a list of all fields not set in the field but in the reference' do
122
122
  @bib['a1'].inherited_fields.must_be :==, [:booktitle, :editor, :title]
123
123
  end
124
124
  end
125
-
125
+
126
126
  describe '#save_inherited_fields' do
127
127
  it 'copies referenced values to the entry' do
128
128
  @bib['a1'].title = 'a1'
@@ -132,15 +132,15 @@ module BibTeX
132
132
  end
133
133
  end
134
134
  end
135
-
135
+
136
136
  end
137
137
  end
138
-
138
+
139
139
  describe '#names' do
140
140
  it 'returns an empty list by default' do
141
141
  Entry.new.names.must_be :==, []
142
142
  end
143
-
143
+
144
144
  it 'returns the author (if set)' do
145
145
  Entry.new(:author => 'A').names.must_be :==, %w{ A }
146
146
  end
@@ -148,7 +148,7 @@ module BibTeX
148
148
  it 'returns all authors (if set)' do
149
149
  Entry.new(:author => 'A B and C D').parse_names.names.length.must_be :==, 2
150
150
  end
151
-
151
+
152
152
  it 'returns the editor (if set)' do
153
153
  Entry.new(:editor => 'A').names.must_be :==, %w{ A }
154
154
  end
@@ -156,14 +156,14 @@ module BibTeX
156
156
  it 'returns the translator (if set)' do
157
157
  Entry.new(:translator => 'A').names.must_be :==, %w{ A }
158
158
  end
159
-
159
+
160
160
  end
161
-
161
+
162
162
  describe 'month conversion' do
163
163
  before do
164
164
  @entry = Entry.new
165
165
  end
166
-
166
+
167
167
  [[:jan,'January'], [:feb,'February'], [:sep,'September']].each do |m|
168
168
  it 'should convert english months' do
169
169
  @entry.month = m[1]
@@ -188,7 +188,41 @@ module BibTeX
188
188
  assert_equal m[0], @entry.month.v
189
189
  end
190
190
  end
191
-
191
+
192
+ end
193
+
194
+ describe '#values_at' do
195
+ it 'returns an empty array by default' do
196
+ assert_equal [], Entry.new.values_at
197
+ end
198
+
199
+ it 'returns an empty array when given no arguments' do
200
+ assert_equal [], Entry.new(:title => 'foo').values_at
201
+ end
202
+
203
+ it 'returns a nil array if the passed in key is not set' do
204
+ assert_equal [nil], Entry.new.values_at(:title)
205
+ end
206
+
207
+ it 'returns an array with the value of the passed in key' do
208
+ assert_equal ['x'], Entry.new(:title => 'x').values_at(:title)
209
+ assert_equal ['a', 'b'], Entry.new(:title => 'b', :year => 'a').values_at(:year, :title)
210
+ end
211
+ end
212
+
213
+ describe '#digest' do
214
+ it 'returns an empty string by default' do
215
+ assert_equal '', Entry.new.digest
216
+ end
217
+
218
+ it 'includes type and all defined fields' do
219
+ assert_equal 'book', Entry.new(:type => 'book').digest
220
+ assert_equal 'book|title:foo', Entry.new(:type => 'book', :title => 'foo').digest
221
+ end
222
+
223
+ it 'accepts a filter' do
224
+ assert_equal 'book|year:2012', Entry.new(:type => 'book', :title => 'foo', :year => 2012).digest([:year])
225
+ end
192
226
  end
193
227
 
194
228
  describe 'given an entry' do
@@ -205,7 +239,7 @@ module BibTeX
205
239
  e.parse_names
206
240
  end
207
241
  end
208
-
242
+
209
243
  it 'supports renaming! of field attributes' do
210
244
  @entry.rename!(:title => :foo)
211
245
  refute @entry.has_field?(:title)
@@ -220,12 +254,11 @@ module BibTeX
220
254
 
221
255
  assert e.has_field?(:foo)
222
256
  refute e.has_field?(:title)
223
-
257
+
224
258
  assert_equal 'Moby Dick', @entry[:title]
225
259
  assert_equal 'Moby Dick', e[:foo]
226
260
  end
227
261
 
228
-
229
262
  it 'supports citeproc export' do
230
263
  e = @entry.to_citeproc
231
264
  assert_equal 'book', e['type']
@@ -235,13 +268,13 @@ module BibTeX
235
268
  assert_equal 'Herman', e['author'][0]['given']
236
269
  assert_equal 'Melville', e['author'][0]['family']
237
270
  end
238
-
271
+
239
272
  describe 'given a filter' do
240
273
  before do
241
274
  @filter = Object.new
242
275
  def @filter.apply (value); value.is_a?(::String) ? value.upcase : value; end
243
276
  end
244
-
277
+
245
278
  it 'supports arbitrary conversion' do
246
279
  e = @entry.convert(@filter)
247
280
  assert_equal 'MOBY DICK', e.title
@@ -265,19 +298,19 @@ module BibTeX
265
298
  assert_equal 'PENGUIN', e.publisher
266
299
  assert_equal 'Penguin', @entry.publisher
267
300
  end
268
-
301
+
269
302
  end
270
-
303
+
271
304
  describe 'LaTeX filter' do
272
305
  before do
273
306
  @entry.title = 'M\\"{o}by Dick'
274
307
  end
275
-
308
+
276
309
  describe '#convert' do
277
310
  it 'converts LaTeX umlauts' do
278
311
  @entry.convert(:latex).title.must_be :==, 'Möby Dick'
279
312
  end
280
-
313
+
281
314
  it 'does not change the original entry' do
282
315
  e = @entry.convert(:latex)
283
316
  e.wont_be :==, @entry
@@ -289,14 +322,14 @@ module BibTeX
289
322
  it 'converts LaTeX umlauts' do
290
323
  @entry.convert!(:latex).title.must_be :==, 'Möby Dick'
291
324
  end
292
-
325
+
293
326
  it 'changes the original entry in-place' do
294
327
  e = @entry.convert!(:latex)
295
328
  e.must_be :equal?, @entry
296
329
  e.title.to_s.length.must_be :==, @entry.title.to_s.length
297
330
  end
298
331
  end
299
-
332
+
300
333
  end
301
334
  end
302
335
 
@@ -309,16 +342,16 @@ module BibTeX
309
342
  e.parse_names
310
343
  end
311
344
  end
312
-
345
+
313
346
  it 'should use non-dropping-particle by default' do
314
347
  assert_equal 'van', @entry.to_citeproc['author'][0]['non-dropping-particle']
315
348
  end
316
-
349
+
317
350
  it 'should accept option to use non-dropping-particle' do
318
351
  assert_equal 'van', @entry.to_citeproc(:particle => 'non-dropping-particle')['author'][0]['non-dropping-particle']
319
352
  end
320
353
  end
321
-
354
+
322
355
  def test_simple
323
356
  bib = BibTeX::Bibliography.open(Test.fixtures(:entry), :debug => false)
324
357
  refute_nil(bib)
@@ -340,25 +373,25 @@ module BibTeX
340
373
  assert_equal('Selected \\emph{Poetry} and `Tales\'', bib.data[0].title)
341
374
  assert_equal('Tales and Sketches', bib.data[1].title)
342
375
  end
343
-
376
+
344
377
  def test_ghost_methods
345
378
  bib = BibTeX::Bibliography.open(Test.fixtures(:entry), :debug => false)
346
379
 
347
380
  assert_equal 'Poe, Edgar A.', bib[0].author.to_s
348
-
381
+
349
382
  expected = 'Poe, Edgar Allen'
350
383
  bib.data[0].author = expected
351
-
384
+
352
385
  assert_equal expected, bib[0].author.to_s
353
386
  end
354
-
355
- def test_creation_simple
387
+
388
+ def test_creation_simple
356
389
  entry = BibTeX::Entry.new
357
390
  entry.type = :book
358
391
  entry.key = :raven
359
392
  entry.author = 'Poe, Edgar A.'
360
393
  entry.title = 'The Raven'
361
-
394
+
362
395
  assert_equal :book, entry.type
363
396
  assert_equal 'raven', entry.key
364
397
  assert_equal 'Poe, Edgar A.', entry.author
@@ -372,7 +405,7 @@ module BibTeX
372
405
  :author => 'Poe, Edgar A.',
373
406
  :title => 'The Raven'
374
407
  })
375
-
408
+
376
409
  assert_equal :book, entry.type
377
410
  assert_equal 'raven', entry.key
378
411
  assert_equal 'Poe, Edgar A.', entry.author
@@ -386,38 +419,38 @@ module BibTeX
386
419
  e.author = 'Poe, Edgar A.'
387
420
  e.title = 'The Raven'
388
421
  end
389
-
422
+
390
423
  assert_equal :book, entry.type
391
424
  assert_equal 'raven', entry.key
392
425
  assert_equal 'Poe, Edgar A.', entry.author
393
426
  assert_equal 'The Raven', entry.title
394
427
  end
395
-
428
+
396
429
  def test_sorting
397
430
  entries = []
398
431
  entries << Entry.new({ :type => 'book', :key => 'raven3', :author => 'Poe, Edgar A.', :title => 'The Raven'})
399
432
  entries << Entry.new({ :type => 'book', :key => 'raven2', :author => 'Poe, Edgar A.', :title => 'The Raven'})
400
433
  entries << Entry.new({ :type => 'book', :key => 'raven1', :author => 'Poe, Edgar A.', :title => 'The Raven'})
401
434
  entries << Entry.new({ :type => 'book', :key => 'raven1', :author => 'Poe, Edgar A.', :title => 'The Aven'})
402
-
435
+
403
436
  entries.sort!
404
-
437
+
405
438
  assert_equal ['raven1', 'raven1', 'raven2', 'raven3'], entries.map(&:key)
406
439
  assert_equal ['The Aven', 'The Raven'], entries.map(&:title)[0,2]
407
440
 
408
441
  end
409
-
442
+
410
443
  describe 'default keys' do
411
444
  before {
412
445
  @e1 = Entry.new(:type => 'book', :author => 'Poe, Edgar A.', :title => 'The Raven', :editor => 'John Hopkins', :year => 1996)
413
446
  @e2 = Entry.new(:type => 'book', :title => 'The Raven', :editor => 'John Hopkins', :year => 1996)
414
447
  @e3 = Entry.new(:type => 'book', :author => 'Poe, Edgar A.', :title => 'The Raven', :editor => 'John Hopkins')
415
448
  }
416
-
449
+
417
450
  it 'should return "unknown-a" for an empty Entry' do
418
451
  Entry.new.key.must_be :==, 'unknown-a'
419
452
  end
420
-
453
+
421
454
  it 'should return a key made up of author-year-a if all fields are present' do
422
455
  @e1.key.must_be :==, 'poe1996a'
423
456
  end
@@ -434,30 +467,30 @@ module BibTeX
434
467
  @e3.key.must_be :==, 'poe-a'
435
468
  end
436
469
  end
437
-
470
+
438
471
  describe 'when the entry is added to a Bibliography' do
439
472
  before {
440
473
  @e = Entry.new
441
474
  @bib = Bibliography.new
442
475
  }
443
-
476
+
444
477
  it 'should register itself with its key' do
445
478
  @bib << @e
446
479
  @bib.entries.keys.must_include @e.key
447
480
  end
448
-
481
+
449
482
  describe "when there is already an element registered with the entry's key" do
450
483
  before { @bib << Entry.new }
451
-
484
+
452
485
  it "should find a suitable key" do
453
486
  k = @e.key
454
487
  @bib << @e
455
488
  @bib.entries.keys.must_include @e.key
456
489
  k.wont_be :==, @e.key
457
490
  end
458
-
491
+
459
492
  end
460
493
  end
461
-
494
+
462
495
  end
463
496
  end