citeproc-ruby 1.1.8 → 1.1.10

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 (42) hide show
  1. checksums.yaml +5 -5
  2. data/Gemfile +10 -32
  3. data/lib/citeproc/ruby/renderer.rb +2 -1
  4. data/lib/citeproc/ruby/version.rb +1 -1
  5. metadata +14 -84
  6. data/.rspec +0 -3
  7. data/.rubocop.yml +0 -1156
  8. data/.simplecov +0 -4
  9. data/Guardfile +0 -14
  10. data/features/bibliography.feature +0 -25
  11. data/features/locale_overrides.feature +0 -31
  12. data/features/name_options.feature +0 -37
  13. data/features/names.feature +0 -198
  14. data/features/renderer.feature +0 -94
  15. data/features/sort.feature +0 -50
  16. data/features/step_definitions/engine.rb +0 -21
  17. data/features/step_definitions/renderer.rb +0 -85
  18. data/features/style_immanent_locale_terms.feature +0 -30
  19. data/features/support/env.rb +0 -35
  20. data/features/support/hooks.rb +0 -10
  21. data/spec/citeproc/ruby/engine_spec.rb +0 -120
  22. data/spec/citeproc/ruby/formats/default_spec.rb +0 -168
  23. data/spec/citeproc/ruby/formats/html_spec.rb +0 -167
  24. data/spec/citeproc/ruby/renderer/choose_spec.rb +0 -293
  25. data/spec/citeproc/ruby/renderer/date_spec.rb +0 -173
  26. data/spec/citeproc/ruby/renderer/group_spec.rb +0 -114
  27. data/spec/citeproc/ruby/renderer/history_spec.rb +0 -47
  28. data/spec/citeproc/ruby/renderer/label_spec.rb +0 -225
  29. data/spec/citeproc/ruby/renderer/layout_spec.rb +0 -41
  30. data/spec/citeproc/ruby/renderer/macro_spec.rb +0 -31
  31. data/spec/citeproc/ruby/renderer/names_spec.rb +0 -396
  32. data/spec/citeproc/ruby/renderer/number_spec.rb +0 -120
  33. data/spec/citeproc/ruby/renderer/text_spec.rb +0 -125
  34. data/spec/citeproc/ruby/renderer_spec.rb +0 -65
  35. data/spec/fixtures/items.rb +0 -113
  36. data/spec/fixtures/locales/locales-de-DE.xml +0 -298
  37. data/spec/fixtures/locales/locales-en-US.xml +0 -304
  38. data/spec/fixtures/locales/locales-fr-FR.xml +0 -317
  39. data/spec/fixtures/styles/apa-with-different-translations.csl +0 -451
  40. data/spec/fixtures/styles/apa.csl +0 -443
  41. data/spec/fixtures/styles/modern-language-association-8th-edition.csl +0 -293
  42. data/spec/spec_helper.rb +0 -73
@@ -1,41 +0,0 @@
1
- require 'spec_helper'
2
-
3
- module CiteProc
4
- module Ruby
5
-
6
- describe 'Renderer#render_layout' do
7
- let(:renderer) { Renderer.new }
8
-
9
- let(:node) { CSL::Style::Layout.new }
10
-
11
- let(:item) {
12
- i = CiteProc::CitationItem.new(:id => 'ID-1')
13
- i.data = CiteProc::Item.new(:id => 'ID-1')
14
- i
15
- }
16
-
17
- it 'returns an empty string when empty' do
18
- expect(renderer.render(item, node)).to eq('')
19
- end
20
-
21
- describe 'with child nodes' do
22
- before(:each) do
23
- node << CSL::Style::Text.new(:value => 'foo')
24
- node << CSL::Style::Text.new(:value => 'bar')
25
- end
26
-
27
- it 'renders each child' do
28
- expect(renderer.render(item, node)).to eq('foobar')
29
- end
30
-
31
- it 'uses the delimiters if specified' do
32
- node[:delimiter] = '-'
33
- expect(renderer.render(item, node)).to eq('foo-bar')
34
- end
35
- end
36
-
37
- end
38
-
39
- end
40
- end
41
-
@@ -1,31 +0,0 @@
1
- require 'spec_helper'
2
-
3
- module CiteProc
4
- module Ruby
5
-
6
- describe 'Renderer#render_macro' do
7
- let(:renderer) { Renderer.new }
8
-
9
- let(:node) { CSL::Style::Macro.new }
10
-
11
- let(:item) {
12
- i = CiteProc::CitationItem.new(:id => 'ID-1')
13
- i.data = CiteProc::Item.new(:id => 'ID-1')
14
- i
15
- }
16
-
17
- it 'returns an empty string when empty' do
18
- expect(renderer.render(item, node)).to eq('')
19
- end
20
-
21
- it 'renders each child' do
22
- node << CSL::Style::Text.new(:value => 'foo')
23
- node << CSL::Style::Text.new(:value => 'bar')
24
-
25
- expect(renderer.render(item, node)).to eq('foobar')
26
- end
27
-
28
- end
29
-
30
- end
31
- end
@@ -1,396 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
-
3
- require 'spec_helper'
4
-
5
- module CiteProc
6
- module Ruby
7
-
8
- describe "Renderer#render_names" do
9
- let(:renderer) { Renderer.new }
10
-
11
- let(:node) { CSL::Style::Names.new }
12
-
13
- let(:item) {
14
- i = CiteProc::CitationItem.new(:id => 'ID-1')
15
- i.data = CiteProc::Item.new(:id => 'ID-1')
16
- i
17
- }
18
-
19
- let(:poe) { people(:poe) }
20
- let(:philosophers) { CiteProc::Names.new('Plato and Socrates and Aristotle') }
21
-
22
- describe 'given an empty node' do
23
- it 'returns an empty string for an empty item' do
24
- expect(renderer.render(item, node)).to eq('')
25
- end
26
-
27
- it 'returns an empty string for an item with variables' do
28
- item.data.edition = 'foo'
29
- expect(renderer.render_names(item, node)).to eq('')
30
- end
31
- end
32
-
33
- describe 'given a single name for the variable' do
34
- before do
35
- item.data.author = poe
36
- node[:variable] = 'author'
37
- end
38
-
39
- it 'formats it in long form' do
40
- expect(renderer.render_names(item, node)).to eq('Edgar Allen Poe')
41
- end
42
-
43
- it 'supports nested name node options' do
44
- node << CSL::Style::Name.new(:form => 'short')
45
- expect(renderer.render_names(item, node)).to eq('Poe')
46
- end
47
-
48
- it 'supports nested label node' do
49
- node << CSL::Style::Label.new(:prefix => ' [', :suffix => ']')
50
- expect(renderer.render_names(item, node)).to eq('Edgar Allen Poe [author]')
51
- end
52
- end
53
-
54
- describe 'given multiple names for a single variable' do
55
- before do
56
- item.data.editor = philosophers
57
- node[:variable] = 'editor'
58
- end
59
-
60
- it 'formats them as a list' do
61
- expect(renderer.render_names(item, node)).to eq('Plato, Socrates, Aristotle')
62
- end
63
-
64
- it 'supports nested name node options' do
65
- node << CSL::Style::Name.new(:and => 'symbol')
66
- expect(renderer.render_names(item, node)).to eq('Plato, Socrates, & Aristotle')
67
- end
68
-
69
- it 'supports nested label node' do
70
- node << CSL::Style::Label.new(:prefix => ' (', :suffix => ')')
71
- expect(renderer.render_names(item, node)).to eq('Plato, Socrates, Aristotle (editors)')
72
- end
73
- end
74
-
75
- describe 'given multiple variables' do
76
- before do
77
- node[:variable] = 'author editor'
78
- node[:delimiter] = '; '
79
- end
80
-
81
- it 'renders all matching lists combinded using default delimiter' do
82
- expect(renderer.render_names(item, node)).to eq('')
83
-
84
- item.data.author = poe
85
- expect(renderer.render_names(item, node)).to eq('Edgar Allen Poe')
86
-
87
- item.data.editor = philosophers
88
- expect(renderer.render_names(item, node)).to eq('Edgar Allen Poe; Plato, Socrates, Aristotle')
89
- end
90
-
91
- it 'keeps the variable order' do
92
- item.data.author = poe
93
- item.data.editor = philosophers
94
-
95
- node[:variable] = 'editor author'
96
- expect(renderer.render_names(item, node)).to eq('Plato, Socrates, Aristotle; Edgar Allen Poe')
97
- end
98
-
99
- it 'supports labels' do
100
- item.data.author = poe
101
- item.data.editor = philosophers
102
-
103
- node << CSL::Style::Label.new(:prefix => ' (', :suffix => ')')
104
-
105
- expect(renderer.render_names(item, node)).to eq('Edgar Allen Poe (author); Plato, Socrates, Aristotle (editors)')
106
- end
107
-
108
- it 'resolves the editor translator special case' do
109
- renderer.format = :text
110
-
111
- node[:variable] = 'translator author editor'
112
-
113
- item.data.editor = 'Patrick F. Quinn and G. R. Thompson'
114
- item.data.author = poe
115
-
116
- node.name = { :and => 'symbol', :form => 'short' }
117
- node.label = { :prefix => ' (', :suffix => ')' }
118
-
119
- expect(renderer.render_names(item, node)).to eq('Poe (author); Quinn & Thompson (editors)')
120
-
121
- item.data.translator = poe
122
- expect(renderer.render_names(item, node)).to eq('Poe (translator); Poe (author); Quinn & Thompson (editors)')
123
-
124
- item.data.translator = 'Patrick F. Quinn and G. R. Thompson'
125
-
126
- expect(renderer.render(item, node)).to eq('Quinn & Thompson (editors & translators); Poe (author)')
127
- end
128
- end
129
- end
130
-
131
- describe "Renderer#render_name" do
132
- let(:renderer) { Renderer.new }
133
-
134
- let(:node) { CSL::Style::Name.new }
135
-
136
- let(:poe) { people(:poe) }
137
- let(:philosophers) { CiteProc::Names.new('Plato and Socrates and Aristotle') }
138
-
139
- describe 'given an empty node' do
140
- it 'returns an empty string given no names' do
141
- expect(renderer.render_name(CiteProc::Names.new, node)).to eq('')
142
- end
143
-
144
- it 'formats the given name in long form' do
145
- expect(renderer.render_name(poe, node)).to eq('Edgar Allen Poe')
146
- end
147
-
148
- it 'formats multiple names delimitted by commas' do
149
- expect(renderer.render_name(philosophers, node)).to eq('Plato, Socrates, Aristotle')
150
- end
151
- end
152
-
153
- describe 'given a node with and "and" attribute' do
154
- it 'inserts a delimited connector' do
155
- node[:and] = 'symbol'
156
- expect(renderer.render_name(philosophers, node)).to eq('Plato, Socrates, & Aristotle')
157
-
158
- node[:and] = 'text'
159
- expect(renderer.render_name(philosophers, node)).to eq('Plato, Socrates, and Aristotle')
160
- end
161
- end
162
-
163
- describe 'given a node with delimier-precedes-last' do
164
- it 'inserts final delimiter only for three or more names when set to "contextual"' do
165
- node.delimiter_contextually_precedes_last!
166
- expect(renderer.render_name(philosophers, node)).to eq('Plato, Socrates, Aristotle')
167
-
168
- node[:and] = 'text'
169
- expect(renderer.render_name(philosophers, node)).to eq('Plato, Socrates, and Aristotle')
170
-
171
- expect(renderer.render_name(philosophers.take(2), node)).to eq('Plato and Socrates')
172
-
173
- node[:and] = nil
174
- expect(renderer.render_name(philosophers.take(2), node)).to eq('Plato, Socrates')
175
- end
176
-
177
- it 'inserts final delimiter when set to "always"' do
178
- node.delimiter_always_precedes_last!
179
-
180
- expect(renderer.render_name(philosophers, node)).to eq('Plato, Socrates, Aristotle')
181
-
182
- node[:and] = 'text'
183
- expect(renderer.render_name(philosophers, node)).to eq('Plato, Socrates, and Aristotle')
184
-
185
- expect(renderer.render_name(philosophers.take(2), node)).to eq('Plato, and Socrates')
186
-
187
- node[:and] = nil
188
- expect(renderer.render_name(philosophers.take(2), node)).to eq('Plato, Socrates')
189
- end
190
-
191
- it 'never inserts final delimiter when set to "never" (unless there is no "and")' do
192
- node.delimiter_never_precedes_last!
193
-
194
- expect(renderer.render_name(philosophers, node)).to eq('Plato, Socrates, Aristotle')
195
- expect(renderer.render_name(philosophers.take(2), node)).to eq('Plato, Socrates')
196
-
197
- node[:and] = 'text'
198
- expect(renderer.render_name(philosophers, node)).to eq('Plato, Socrates and Aristotle')
199
- expect(renderer.render_name(philosophers.take(2), node)).to eq('Plato and Socrates')
200
- end
201
-
202
- it 'supports only-after-inverted-name rule' do
203
- names = CiteProc::Names.new('Doe, J. and Smith, S. and Williams, T.')
204
- node.delimiter_precedes_last_after_inverted_name!
205
-
206
- # always delimit when there is no and!
207
- expect(renderer.render_name(names, node)).to eq('J. Doe, S. Smith, T. Williams')
208
- expect(renderer.render_name(names.take(2), node)).to eq('J. Doe, S. Smith')
209
-
210
- node[:and] = 'text'
211
- expect(renderer.render_name(names, node)).to eq('J. Doe, S. Smith and T. Williams')
212
- expect(renderer.render_name(names.take(2), node)).to eq('J. Doe and S. Smith')
213
-
214
- node[:'name-as-sort-order'] = 'first'
215
- expect(renderer.render_name(names, node)).to eq('Doe, J., S. Smith and T. Williams')
216
- expect(renderer.render_name(names.take(2), node)).to eq('Doe, J., and S. Smith')
217
-
218
- node[:'name-as-sort-order'] = 'all'
219
- expect(renderer.render_name(names, node)).to eq('Doe, J., Smith, S., and Williams, T.')
220
- expect(renderer.render_name(names.take(2), node)).to eq('Doe, J., and Smith, S.')
221
- end
222
- end
223
-
224
- describe 'truncation of name lists' do
225
- let(:names) { CiteProc::Names.new('Doe, J. and Smith, S. and Williams, T.') }
226
-
227
- it 'supports et-al formatting via an et-al node' do
228
- node[:'et-al-min'] = 3
229
- node[:'et-al-use-first'] = 2
230
-
231
- others = CSL::Style::EtAl.new(:prefix => '!!')
232
- allow(node).to receive(:et_al).and_return(others)
233
-
234
- expect(renderer.render_name(names, node)).to eq('J. Doe, S. Smith, !!et al.')
235
-
236
- others[:term] = 'and others'
237
- expect(renderer.render_name(names, node)).to eq('J. Doe, S. Smith, !!and others')
238
- end
239
-
240
- it 'supports et-al-use-last' do
241
- node[:'et-al-min'] = 3
242
- node[:'et-al-use-first'] = 2
243
- node[:'et-al-use-last'] = true
244
-
245
- # truncated list must be at least two names short!
246
- expect(renderer.render_name(names, node)).to eq('J. Doe, S. Smith, et al.')
247
-
248
- node[:'et-al-use-first'] = 1
249
- expect(renderer.render_name(names, node)).to eq('J. Doe, … T. Williams')
250
- end
251
-
252
- describe 'with default delimiter settings' do
253
- it 'truncates the list if it matches or exceeds et-al-min' do
254
- node[:'et-al-min'] = 3
255
- node[:'et-al-use-first'] = 2
256
-
257
- expect(renderer.render_name(names, node)).to eq('J. Doe, S. Smith, et al.')
258
-
259
- node[:'et-al-use-first'] = 1
260
- expect(renderer.render_name(names, node)).to eq('J. Doe et al.')
261
- end
262
-
263
- it 'does not truncate the list if it is less than et-al-min' do
264
- node[:'et-al-min'] = 4
265
- node[:'et-al-use-first'] = 2
266
-
267
- expect(renderer.render_name(names, node)).to eq('J. Doe, S. Smith, T. Williams')
268
- end
269
- end
270
-
271
- describe 'with delimiter-precedes-et-al set' do
272
- it 'inserts delimiter only for two or more names when set to "contextual" or nil' do
273
- node.truncate_when! 3
274
- node.truncate_at! 2
275
-
276
- # default behaviour should match contextual!
277
- expect(renderer.render_name(philosophers, node)).to eq('Plato, Socrates, et al.')
278
-
279
- node.truncate_at! 1
280
- expect(renderer.render_name(philosophers, node)).to eq('Plato et al.')
281
-
282
- # set contextual explicitly
283
- node.delimiter_contextually_precedes_et_al!
284
- expect(renderer.render_name(philosophers, node)).to eq('Plato et al.')
285
-
286
- node.truncate_at! 2
287
- expect(renderer.render_name(philosophers, node)).to eq('Plato, Socrates, et al.')
288
- end
289
-
290
- it 'inserts delimiter when set to "always"' do
291
- node.truncate_when! 3
292
- node.truncate_at! 2
293
-
294
- node.delimiter_always_precedes_et_al!
295
- expect(renderer.render_name(philosophers, node)).to eq('Plato, Socrates, et al.')
296
-
297
- node.truncate_at! 1
298
- expect(renderer.render_name(philosophers, node)).to eq('Plato, et al.')
299
- end
300
-
301
- it 'never inserts delimiter when set to "never"' do
302
- node.truncate_when! 3
303
- node.truncate_at! 2
304
-
305
- node.delimiter_never_precedes_et_al!
306
- expect(renderer.render_name(philosophers, node)).to eq('Plato, Socrates et al.')
307
-
308
- node.truncate_at! 1
309
- expect(renderer.render_name(philosophers, node)).to eq('Plato et al.')
310
- end
311
-
312
- it 'supports only-after-inverted-name rule' do
313
- node.truncate_when! 3
314
- node.truncate_at! 2
315
-
316
- node.delimiter_precedes_et_al_after_inverted_name!
317
-
318
- expect(renderer.render_name(names, node)).to eq('J. Doe, S. Smith et al.')
319
-
320
- node[:'name-as-sort-order'] = 'first'
321
- expect(renderer.render_name(names, node)).to eq('Doe, J., S. Smith et al.')
322
-
323
- node.truncate_at! 1
324
- expect(renderer.render_name(names, node)).to eq('Doe, J., et al.')
325
-
326
- node[:'name-as-sort-order'] = 'all'
327
- expect(renderer.render_name(names, node)).to eq('Doe, J., et al.')
328
-
329
- node.truncate_at! 2
330
- expect(renderer.render_name(names, node)).to eq('Doe, J., Smith, S., et al.')
331
- end
332
- end
333
- end
334
-
335
- describe 'name-part formatting' do
336
- let(:part) { CSL::Style::NamePart.new(:'text-case' => 'uppercase') }
337
- before { node.parts << part }
338
-
339
- it 'supports family name formatting' do
340
- part[:name] = 'family'
341
- expect(renderer.render_name(poe, node)).to eq('Edgar Allen POE')
342
- end
343
-
344
- it 'family part includes non-demoted particles' do
345
- part[:name] = 'family'
346
-
347
- expect(renderer.render_name(people(:la_fontaine), node)).to eq('Jean de LA FONTAINE')
348
- expect(renderer.render_name(people(:humboldt), node)).to eq('Alexander von HUMBOLDT')
349
- expect(renderer.render_name(people(:van_gogh), node)).to eq('Vincent VAN GOGH')
350
- end
351
-
352
- it 'family part affixes includes name suffix for non-inverted names' do
353
- part.merge! :name => 'family', :prefix => '(', :suffix => ')'
354
-
355
- la_fontaine = people(:la_fontaine)
356
- la_fontaine[0].suffix = 'Jr.'
357
-
358
- expect(renderer.render_name(la_fontaine, node)).to eq('Jean de (LA FONTAINE Jr.)')
359
- end
360
-
361
- it 'supports given name formatting' do
362
- part[:name] = 'given'
363
- expect(renderer.render_name(poe, node)).to eq('EDGAR ALLEN Poe')
364
- end
365
-
366
- it 'given part includes particles' do
367
- part[:name] = 'given'
368
-
369
- expect(renderer.render_name(people(:la_fontaine), node)).to eq('JEAN DE La Fontaine')
370
- expect(renderer.render_name(people(:humboldt), node)).to eq('ALEXANDER VON Humboldt')
371
- expect(renderer.render_name(people(:van_gogh), node)).to eq('VINCENT van Gogh')
372
- end
373
-
374
- it 'given part affixes enclose demoted particles' do
375
- part.merge! :name => 'given', :prefix => '(', :suffix => ')'
376
-
377
- la_fontaine = people(:la_fontaine)
378
-
379
- expect(renderer.render_name(la_fontaine, node)).to eq('(JEAN DE) La Fontaine')
380
-
381
- node.all_names_as_sort_order!
382
- expect(renderer.render_name(la_fontaine, node)).to eq('La Fontaine, (JEAN DE)')
383
-
384
- la_fontaine[0].always_demote_particle!
385
- expect(renderer.render_name(la_fontaine, node)).to eq('Fontaine, (JEAN DE La)')
386
- end
387
-
388
- it 'does not alter the passed-in name object' do
389
- part[:name] = 'family'
390
- expect(renderer.render_name(poe, node)).to eq('Edgar Allen POE')
391
- expect(poe.to_s).to eq('Edgar Allen Poe')
392
- end
393
- end
394
- end
395
- end
396
- end