csl 1.2.1 → 1.2.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/features/step_definitions/locale_steps.rb +7 -5
- data/features/step_definitions/parser_steps.rb +8 -8
- data/features/step_definitions/style_steps.rb +3 -3
- data/lib/csl/loader.rb +3 -3
- data/lib/csl/node.rb +5 -0
- data/lib/csl/style/group.rb +1 -6
- data/lib/csl/version.rb +1 -1
- data/spec/csl/info_spec.rb +50 -50
- data/spec/csl/locale/date_spec.rb +13 -13
- data/spec/csl/locale/style_options_spec.rb +3 -3
- data/spec/csl/locale/term_spec.rb +51 -51
- data/spec/csl/locale_spec.rb +36 -36
- data/spec/csl/node_spec.rb +64 -62
- data/spec/csl/parser_spec.rb +19 -19
- data/spec/csl/schema_spec.rb +27 -26
- data/spec/csl/style/choose_spec.rb +8 -8
- data/spec/csl/style/date_spec.rb +2 -2
- data/spec/csl/style/label_spec.rb +8 -8
- data/spec/csl/style/names_spec.rb +2 -2
- data/spec/csl/style/number_spec.rb +17 -17
- data/spec/csl/style/sort_spec.rb +1 -1
- data/spec/csl/style_spec.rb +27 -27
- data/spec/csl/treelike_spec.rb +20 -20
- metadata +2 -2
@@ -11,21 +11,21 @@ module CSL
|
|
11
11
|
|
12
12
|
describe '#conditions' do
|
13
13
|
it 'returns an empty list by default' do
|
14
|
-
Choose::Block.new.conditions.
|
14
|
+
expect(Choose::Block.new.conditions).to be_empty
|
15
15
|
end
|
16
16
|
|
17
17
|
describe 'when the node has a single condition' do
|
18
18
|
let(:node) { Choose::Block.new(:'is-numeric' => 'edition' )}
|
19
19
|
|
20
20
|
it 'returns an array with an array containing the type, matcher and values of the condition' do
|
21
|
-
node.conditions.
|
21
|
+
expect(node.conditions).to eq([[:'is-numeric', :all?, ['edition']]])
|
22
22
|
end
|
23
23
|
|
24
24
|
describe 'when the condition has multiple values' do
|
25
25
|
before { node[:'is-numeric'] << ' issue' }
|
26
26
|
|
27
27
|
it 'it splits the values in the conditions list' do
|
28
|
-
node.conditions.
|
28
|
+
expect(node.conditions).to eq([[:'is-numeric', :all?, ['edition', 'issue']]])
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
@@ -33,12 +33,12 @@ module CSL
|
|
33
33
|
before { node[:disambiguate] = 'true' }
|
34
34
|
|
35
35
|
it 'returns an array with two elements' do
|
36
|
-
node.conditions.
|
36
|
+
expect(node.conditions.size).to eq(2)
|
37
37
|
end
|
38
38
|
|
39
39
|
it 'returns both conditions as arrays' do
|
40
|
-
node.conditions.map(&:first).sort.
|
41
|
-
node.conditions.map(&:last).sort.
|
40
|
+
expect(node.conditions.map(&:first).sort).to eq([:disambiguate, :'is-numeric'])
|
41
|
+
expect(node.conditions.map(&:last).sort).to eq([['edition'], ['true']])
|
42
42
|
end
|
43
43
|
end
|
44
44
|
end
|
@@ -47,14 +47,14 @@ module CSL
|
|
47
47
|
let(:node) { Choose::Block.new(:'variable-any' => 'author editor' )}
|
48
48
|
|
49
49
|
it 'strips the match override from the type name and inserts it as the matcher' do
|
50
|
-
node.conditions.
|
50
|
+
expect(node.conditions).to eq([[:variable, :any?, ['author', 'editor']]])
|
51
51
|
end
|
52
52
|
|
53
53
|
describe 'other conditions' do
|
54
54
|
before { node[:position] = 'false' }
|
55
55
|
|
56
56
|
it 'are not affected by the override' do
|
57
|
-
node.conditions.map { |c| c[1].to_s }.sort.
|
57
|
+
expect(node.conditions.map { |c| c[1].to_s }.sort).to eq(%w{ all? any? })
|
58
58
|
end
|
59
59
|
end
|
60
60
|
end
|
data/spec/csl/style/date_spec.rb
CHANGED
@@ -9,11 +9,11 @@ module CSL
|
|
9
9
|
|
10
10
|
describe '#numeric-leading-zeros?' do
|
11
11
|
|
12
|
-
it {
|
12
|
+
it { is_expected.not_to be_numeric_leading_zeros }
|
13
13
|
|
14
14
|
it 'returns true when the form is set accordingly' do
|
15
15
|
subject[:form] = 'numeric-leading-zeros'
|
16
|
-
subject.
|
16
|
+
expect(subject).to be_numeric_leading_zeros
|
17
17
|
end
|
18
18
|
end
|
19
19
|
|
@@ -3,9 +3,9 @@ require 'spec_helper'
|
|
3
3
|
module CSL
|
4
4
|
describe Style::Label do
|
5
5
|
|
6
|
-
it {
|
7
|
-
it {
|
8
|
-
it {
|
6
|
+
it { is_expected.not_to be_names_label }
|
7
|
+
it { is_expected.not_to be_always_pluralize }
|
8
|
+
it { is_expected.not_to be_never_pluralize }
|
9
9
|
|
10
10
|
describe '.terms' do
|
11
11
|
Hash[*%w{
|
@@ -17,7 +17,7 @@ module CSL
|
|
17
17
|
chapter-number chapter
|
18
18
|
}].each do |variable, term|
|
19
19
|
it "returns #{term.inspect} for #{variable.inspect}" do
|
20
|
-
Style::Label.terms[variable].
|
20
|
+
expect(Style::Label.terms[variable]).to eq(term)
|
21
21
|
end
|
22
22
|
end
|
23
23
|
end
|
@@ -25,18 +25,18 @@ module CSL
|
|
25
25
|
describe 'a label inside a names node' do
|
26
26
|
before(:each) { Style::Names.new << subject }
|
27
27
|
|
28
|
-
it {
|
28
|
+
it { is_expected.to be_names_label }
|
29
29
|
end
|
30
30
|
|
31
31
|
describe '#term' do
|
32
|
-
it {
|
32
|
+
it { is_expected.to be_empty }
|
33
33
|
|
34
34
|
it 'returns the term for the current variable' do
|
35
35
|
subject[:variable] = 'page'
|
36
|
-
subject.term.
|
36
|
+
expect(subject.term).to eq('page')
|
37
37
|
|
38
38
|
subject[:variable] = 'number-of-volumes'
|
39
|
-
subject.term.
|
39
|
+
expect(subject.term).to eq('volume')
|
40
40
|
end
|
41
41
|
end
|
42
42
|
|
@@ -7,7 +7,7 @@ module CSL
|
|
7
7
|
|
8
8
|
describe Style::Name do
|
9
9
|
|
10
|
-
it {
|
10
|
+
it { is_expected.to be_delimiter_contextually_precedes_last }
|
11
11
|
|
12
12
|
[:never, :always, :contextually].each do |setting|
|
13
13
|
setter = "delimiter_#{setting}_precedes_last!"
|
@@ -15,7 +15,7 @@ module CSL
|
|
15
15
|
|
16
16
|
describe "##{setter}" do
|
17
17
|
it 'sets the delimiter precedes last option accordingly' do
|
18
|
-
subject.send(setter).send(predicate).
|
18
|
+
expect(subject.send(setter).send(predicate)).to eq(true)
|
19
19
|
end
|
20
20
|
end
|
21
21
|
end
|
@@ -5,79 +5,79 @@ module CSL
|
|
5
5
|
|
6
6
|
describe '.new' do
|
7
7
|
it 'returns an empty number tag by default' do
|
8
|
-
Style::Number.new.
|
8
|
+
expect(Style::Number.new).not_to have_attributes
|
9
9
|
end
|
10
10
|
|
11
11
|
it 'accepts a form attribute' do
|
12
|
-
Style::Number.new(:form => 'roman').
|
12
|
+
expect(Style::Number.new(:form => 'roman')).to be_roman
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
16
16
|
describe '#numeric?' do
|
17
17
|
it 'returns true by default' do
|
18
|
-
Style::Number.new.
|
18
|
+
expect(Style::Number.new).to be_numeric
|
19
19
|
end
|
20
20
|
|
21
21
|
it 'returns false if the form attribute is set to a value other than :numeric' do
|
22
|
-
Style::Number.new(:form => 'foo').
|
22
|
+
expect(Style::Number.new(:form => 'foo')).not_to be_numeric
|
23
23
|
end
|
24
24
|
|
25
25
|
it 'returns false if the form attribute is set to :numeric' do
|
26
|
-
Style::Number.new(:form => 'numeric').
|
26
|
+
expect(Style::Number.new(:form => 'numeric')).to be_numeric
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
30
30
|
describe '#roman?' do
|
31
31
|
it 'returns false by default' do
|
32
|
-
Style::Number.new.
|
32
|
+
expect(Style::Number.new).not_to be_roman
|
33
33
|
end
|
34
34
|
|
35
35
|
it 'returns false if the form attribute is set to a value other than :numeric' do
|
36
|
-
Style::Number.new(:form => 'ordinal').
|
36
|
+
expect(Style::Number.new(:form => 'ordinal')).not_to be_roman
|
37
37
|
end
|
38
38
|
|
39
39
|
it 'returns false if the form attribute is set to :roman' do
|
40
|
-
Style::Number.new(:form => 'roman').
|
40
|
+
expect(Style::Number.new(:form => 'roman')).to be_roman
|
41
41
|
end
|
42
42
|
end
|
43
43
|
|
44
44
|
describe '#ordinal?' do
|
45
45
|
it 'returns false by default' do
|
46
|
-
Style::Number.new.
|
46
|
+
expect(Style::Number.new).not_to be_ordinal
|
47
47
|
end
|
48
48
|
|
49
49
|
it 'returns false if the form attribute is set to a value other than :ordinal' do
|
50
|
-
Style::Number.new(:form => 'long-ordinal').
|
50
|
+
expect(Style::Number.new(:form => 'long-ordinal')).not_to be_ordinal
|
51
51
|
end
|
52
52
|
|
53
53
|
it 'returns false if the form attribute is set to :ordinal' do
|
54
|
-
Style::Number.new(:form => 'ordinal').
|
55
|
-
Style::Number.new(:form => :ordinal).
|
54
|
+
expect(Style::Number.new(:form => 'ordinal')).to be_ordinal
|
55
|
+
expect(Style::Number.new(:form => :ordinal)).to be_ordinal
|
56
56
|
end
|
57
57
|
end
|
58
58
|
|
59
59
|
describe '#long_ordinal?' do
|
60
60
|
it 'returns false by default' do
|
61
|
-
Style::Number.new.
|
61
|
+
expect(Style::Number.new).not_to be_long_ordinal
|
62
62
|
end
|
63
63
|
|
64
64
|
it 'returns false if the form attribute is set to a value other than :"long-ordinal"' do
|
65
|
-
Style::Number.new(:form => 'ordinal').
|
65
|
+
expect(Style::Number.new(:form => 'ordinal')).not_to be_long_ordinal
|
66
66
|
end
|
67
67
|
|
68
68
|
it 'returns false if the form attribute is set to :ordinal' do
|
69
|
-
Style::Number.new(:form => 'long-ordinal').
|
69
|
+
expect(Style::Number.new(:form => 'long-ordinal')).to be_long_ordinal
|
70
70
|
end
|
71
71
|
end
|
72
72
|
|
73
73
|
|
74
74
|
describe '#to_xml' do
|
75
75
|
it 'returns an empty number tag by default' do
|
76
|
-
Style::Number.new.to_xml.
|
76
|
+
expect(Style::Number.new.to_xml).to eq('<number/>')
|
77
77
|
end
|
78
78
|
|
79
79
|
it 'returns a tag with a all attribute assignments' do
|
80
|
-
Style::Number.new(:form => 'roman').to_xml.
|
80
|
+
expect(Style::Number.new(:form => 'roman').to_xml).to eq('<number form="roman"/>')
|
81
81
|
end
|
82
82
|
end
|
83
83
|
|
data/spec/csl/style/sort_spec.rb
CHANGED
data/spec/csl/style_spec.rb
CHANGED
@@ -7,78 +7,78 @@ module CSL
|
|
7
7
|
end
|
8
8
|
|
9
9
|
it 'has a 1.x version by default' do
|
10
|
-
@style[:version].
|
10
|
+
expect(@style[:version]).to match(/1\.\d+(\.\d+)?/)
|
11
11
|
end
|
12
12
|
|
13
13
|
it 'has the default version' do
|
14
|
-
@style.default_attribute?(:version).
|
14
|
+
expect(@style.default_attribute?(:version)).to be_truthy
|
15
15
|
end
|
16
16
|
|
17
17
|
it 'has a the default namespace attribute' do
|
18
|
-
@style[:xmlns].
|
19
|
-
@style.default_attribute?(:xmlns).
|
18
|
+
expect(@style[:xmlns]).to eq(CSL::Schema.namespace)
|
19
|
+
expect(@style.default_attribute?(:xmlns)).to be_truthy
|
20
20
|
end
|
21
21
|
|
22
22
|
describe '#to_xml' do
|
23
23
|
it 'returns an empty style' do
|
24
|
-
@style.to_xml.
|
24
|
+
expect(@style.to_xml).to match(/^<style[^>]*\/>/)
|
25
25
|
end
|
26
26
|
|
27
27
|
it 'includes the xml namespace' do
|
28
|
-
@style.to_xml.
|
28
|
+
expect(@style.to_xml).to match(CSL::Schema.namespace)
|
29
29
|
end
|
30
30
|
|
31
31
|
it 'supports round-trip for apa style' do
|
32
32
|
apa = Style.load(:apa)
|
33
|
-
apa.
|
33
|
+
expect(apa).to be_a(Style)
|
34
34
|
|
35
35
|
xml = apa.to_xml
|
36
|
-
xml.
|
36
|
+
expect(xml).to match(/^<style[^>]*>/)
|
37
37
|
|
38
|
-
Style.parse(xml).
|
38
|
+
expect(Style.parse(xml)).to be_a(Style)
|
39
39
|
end
|
40
40
|
end
|
41
41
|
|
42
42
|
describe '#deep_copy' do
|
43
43
|
it 'works on apa style' do
|
44
44
|
apa = Style.load(:apa)
|
45
|
-
apa.
|
45
|
+
expect(apa).to be_a(Style)
|
46
46
|
|
47
47
|
xml = apa.to_xml
|
48
48
|
|
49
49
|
copy = apa.deep_copy
|
50
50
|
|
51
|
-
apa.to_xml.
|
52
|
-
copy.to_xml.
|
51
|
+
expect(apa.to_xml).to eq(xml) # original unchanged!
|
52
|
+
expect(copy.to_xml).to eq(xml)
|
53
53
|
end
|
54
54
|
end
|
55
55
|
|
56
56
|
describe '#children' do
|
57
57
|
|
58
|
-
it {
|
59
|
-
it {
|
60
|
-
it {
|
61
|
-
it {
|
62
|
-
it {
|
58
|
+
it { is_expected.not_to have_info }
|
59
|
+
it { is_expected.not_to have_locale }
|
60
|
+
it { is_expected.not_to have_macro }
|
61
|
+
it { is_expected.not_to have_citation }
|
62
|
+
it { is_expected.not_to have_bibliography }
|
63
63
|
|
64
64
|
describe 'when it has a title' do
|
65
65
|
before { @style.title = 'foo' }
|
66
66
|
|
67
|
-
it { @style.
|
67
|
+
it { expect(@style).to have_info }
|
68
68
|
|
69
69
|
it 'info.title is a text node' do
|
70
|
-
@style.info.title.
|
70
|
+
expect(@style.info.title).to be_a(TextNode)
|
71
71
|
end
|
72
72
|
|
73
73
|
it '#title returns the title as a string' do
|
74
|
-
@style.title.
|
74
|
+
expect(@style.title).to be_a(String)
|
75
75
|
end
|
76
76
|
end
|
77
77
|
end
|
78
78
|
|
79
79
|
describe '#id accessor' do
|
80
80
|
it 'returns nil by default' do
|
81
|
-
@style.id.
|
81
|
+
expect(@style.id).to be_nil
|
82
82
|
end
|
83
83
|
|
84
84
|
it 'writer sets the id to the passed-in string' do
|
@@ -88,11 +88,11 @@ module CSL
|
|
88
88
|
|
89
89
|
describe 'independent and dependent styles' do
|
90
90
|
it 'styles are independent by default' do
|
91
|
-
@style.
|
91
|
+
expect(@style).to be_independent
|
92
92
|
end
|
93
93
|
|
94
94
|
it 'styles do not have independent-parent links by default' do
|
95
|
-
@style.
|
95
|
+
expect(@style).not_to have_independent_parent_link
|
96
96
|
end
|
97
97
|
|
98
98
|
it 'when setting an independet-parent link a style becomes dependent' do
|
@@ -102,7 +102,7 @@ module CSL
|
|
102
102
|
|
103
103
|
describe 'macros' do
|
104
104
|
it 'has no macros by default' do
|
105
|
-
@style.
|
105
|
+
expect(@style).not_to have_macros
|
106
106
|
end
|
107
107
|
|
108
108
|
it 'raises a validation error when adding a macro without name' do
|
@@ -113,12 +113,12 @@ module CSL
|
|
113
113
|
before { @style << Style::Macro.new(:name => 'author') }
|
114
114
|
|
115
115
|
it 'has macros' do
|
116
|
-
@style.
|
116
|
+
expect(@style).to have_macros
|
117
117
|
end
|
118
118
|
|
119
119
|
it 'the macro is registered in the macros hash' do
|
120
|
-
@style.macros.
|
121
|
-
@style.macros['author'].
|
120
|
+
expect(@style.macros).to have_key('author')
|
121
|
+
expect(@style.macros['author']).to be_a(Style::Macro)
|
122
122
|
end
|
123
123
|
|
124
124
|
it 'raises a validation error when adding a macro with a duplicate name' do
|
data/spec/csl/treelike_spec.rb
CHANGED
@@ -19,17 +19,17 @@ module CSL
|
|
19
19
|
let(:lvl2) { TestTree.new.add_child(TestTree.new).add_child(TestTree.new) }
|
20
20
|
|
21
21
|
it 'has no children by default' do
|
22
|
-
node.
|
22
|
+
expect(node).not_to have_children
|
23
23
|
end
|
24
24
|
|
25
25
|
it 'is empty by default' do
|
26
|
-
node.
|
26
|
+
expect(node).to be_empty
|
27
27
|
end
|
28
28
|
|
29
29
|
describe '#children' do
|
30
30
|
|
31
31
|
it 'is empty by default' do
|
32
|
-
node.children.
|
32
|
+
expect(node.children).to be_empty
|
33
33
|
end
|
34
34
|
|
35
35
|
it 'grows when adding child nodes' do
|
@@ -40,58 +40,58 @@ module CSL
|
|
40
40
|
|
41
41
|
describe '#nodename' do
|
42
42
|
it 'returns the class name in attribute form by default' do
|
43
|
-
node.nodename.
|
43
|
+
expect(node.nodename).to eq('test-tree')
|
44
44
|
end
|
45
45
|
end
|
46
46
|
|
47
47
|
describe '#ancestors' do
|
48
48
|
it 'returns and empty list by default' do
|
49
|
-
node.ancestors.
|
49
|
+
expect(node.ancestors).to be_empty
|
50
50
|
end
|
51
51
|
|
52
52
|
it 'returns a list with one ancestor at level 1' do
|
53
|
-
lvl1.ancestors.
|
53
|
+
expect(lvl1.ancestors.size).to eq(1)
|
54
54
|
end
|
55
55
|
|
56
56
|
it 'the last ancestor is also the root node at levels 1 and deeper' do
|
57
|
-
lvl1.ancestors.last.
|
58
|
-
lvl2.ancestors.last.
|
57
|
+
expect(lvl1.ancestors.last).to be_root
|
58
|
+
expect(lvl2.ancestors.last).to be_root
|
59
59
|
end
|
60
60
|
|
61
61
|
it 'returns a list with two ancestors at level 2' do
|
62
|
-
lvl2.ancestors.
|
62
|
+
expect(lvl2.ancestors.size).to eq(2)
|
63
63
|
end
|
64
64
|
end
|
65
65
|
|
66
66
|
it 'is a root node by default' do
|
67
|
-
node.
|
67
|
+
expect(node).to be_root
|
68
68
|
end
|
69
69
|
|
70
70
|
describe '#root' do
|
71
71
|
it 'returns self at level 0' do
|
72
|
-
node.root.
|
72
|
+
expect(node.root).to equal(node)
|
73
73
|
end
|
74
74
|
|
75
75
|
it 'returns the parent at level 1' do
|
76
|
-
lvl1.root.
|
76
|
+
expect(lvl1.root).to eq(lvl1.parent)
|
77
77
|
end
|
78
78
|
|
79
79
|
it 'returns parent.parent at level 2' do
|
80
|
-
lvl2.root.
|
80
|
+
expect(lvl2.root).to eq(lvl2.parent.parent)
|
81
81
|
end
|
82
82
|
end
|
83
83
|
|
84
84
|
describe '#depth' do
|
85
85
|
it 'returns 0 by default' do
|
86
|
-
node.depth.
|
86
|
+
expect(node.depth).to eq(0)
|
87
87
|
end
|
88
88
|
|
89
89
|
it 'returns 1 at level 1' do
|
90
|
-
lvl1.depth.
|
90
|
+
expect(lvl1.depth).to eq(1)
|
91
91
|
end
|
92
92
|
|
93
93
|
it 'returns 2 at level 2' do
|
94
|
-
lvl2.depth.
|
94
|
+
expect(lvl2.depth).to eq(2)
|
95
95
|
end
|
96
96
|
|
97
97
|
it 'grows when the node is added to another node' do
|
@@ -111,23 +111,23 @@ module CSL
|
|
111
111
|
end
|
112
112
|
|
113
113
|
it 'the class contains a children struct' do
|
114
|
-
TestTree.const?(:Children).
|
114
|
+
expect(TestTree.const?(:Children)).to be true
|
115
115
|
end
|
116
116
|
|
117
117
|
describe '.create_children' do
|
118
118
|
it 'returns the children struct' do
|
119
|
-
TestTree.create_children.
|
119
|
+
expect(TestTree.create_children).to be_a(Struct)
|
120
120
|
end
|
121
121
|
end
|
122
122
|
|
123
123
|
describe '#children' do
|
124
124
|
it 'returns a children struct instance' do
|
125
|
-
TestTree.new.children.
|
125
|
+
expect(TestTree.new.children).to be_a(Struct)
|
126
126
|
end
|
127
127
|
end
|
128
128
|
|
129
129
|
it 'has no children by default' do
|
130
|
-
TestTree.new.
|
130
|
+
expect(TestTree.new).not_to have_children
|
131
131
|
end
|
132
132
|
|
133
133
|
it 'has children when adding child nodes' do
|