citeproc 1.0.0.pre12 → 1.0.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.
Files changed (45) hide show
  1. checksums.yaml +7 -0
  2. data/.simplecov +4 -0
  3. data/AGPL +1 -1
  4. data/BSDL +2 -2
  5. data/Gemfile +39 -19
  6. data/README.md +123 -14
  7. data/Rakefile +22 -8
  8. data/cucumber.yml +1 -1
  9. data/features/step_definitions/processor.rb +59 -0
  10. data/features/support/env.rb +45 -2
  11. data/lib/citeproc.rb +8 -8
  12. data/lib/citeproc/abbreviate.rb +5 -4
  13. data/lib/citeproc/assets.rb +109 -109
  14. data/lib/citeproc/attributes.rb +11 -11
  15. data/lib/citeproc/bibliography.rb +107 -71
  16. data/lib/citeproc/citation_data.rb +175 -150
  17. data/lib/citeproc/compatibility.rb +5 -108
  18. data/lib/citeproc/date.rb +23 -12
  19. data/lib/citeproc/engine.rb +9 -4
  20. data/lib/citeproc/errors.rb +6 -6
  21. data/lib/citeproc/extensions.rb +66 -66
  22. data/lib/citeproc/item.rb +60 -2
  23. data/lib/citeproc/names.rb +103 -24
  24. data/lib/citeproc/number.rb +27 -8
  25. data/lib/citeproc/processor.rb +31 -41
  26. data/lib/citeproc/selector.rb +132 -126
  27. data/lib/citeproc/utilities.rb +6 -6
  28. data/lib/citeproc/variable.rb +5 -4
  29. data/lib/citeproc/version.rb +1 -1
  30. data/spec/citeproc/assets_spec.rb +17 -15
  31. data/spec/citeproc/bibliography_spec.rb +17 -17
  32. data/spec/citeproc/citation_data_spec.rb +90 -90
  33. data/spec/citeproc/engine_spec.rb +3 -4
  34. data/spec/citeproc/item_spec.rb +76 -68
  35. data/spec/citeproc/names_spec.rb +187 -148
  36. data/spec/citeproc/processor_spec.rb +119 -115
  37. data/spec/citeproc/selector_spec.rb +87 -78
  38. data/spec/citeproc/variable_spec.rb +30 -30
  39. data/spec/fixtures/locales/locales-en-US.xml +304 -0
  40. data/spec/spec_helper.rb +32 -1
  41. data/tasks/testsuite.rb +209 -0
  42. metadata +19 -87
  43. data/.gitignore +0 -6
  44. data/.travis.yml +0 -21
  45. data/citeproc.gemspec +0 -40
@@ -1,20 +1,20 @@
1
1
  module CiteProc
2
-
2
+
3
3
  module Utilities
4
4
 
5
5
  # call-seq:
6
6
  # process(mode = :bibliography, items, options = {})
7
7
  def process(*arguments)
8
8
  end
9
-
9
+
10
10
  def cite(items, options = {})
11
11
  process(:citation, items, options)
12
12
  end
13
-
13
+
14
14
  def bibliography(items, options = {})
15
15
  process(:bibliography, items, options)
16
16
  end
17
-
17
+
18
18
  end
19
-
20
- end
19
+
20
+ end
@@ -133,8 +133,9 @@ module CiteProc
133
133
  def_delegators :@value, :to_s,
134
134
  *::String.instance_methods(false).select {|m| m.to_s =~ /!$/ }
135
135
 
136
- def_delegators :to_s, :=~, :===,
137
- *::String.instance_methods(false).reject {|m| m.to_s =~ /^\W|!$|to_s/ }
136
+ def_delegators :to_s, :=~, :===, *String.instance_methods(false).reject { |m|
137
+ m.to_s =~ /^[\W_]|[!=_]$|^(to_s|inspect|replace|first|last|dup|clone|to_f|to_i)$/
138
+ }
138
139
 
139
140
 
140
141
  # Creates new Variable for the passed-in value
@@ -278,7 +279,7 @@ module CiteProc
278
279
 
279
280
  # @return [String] a JSON string representation of the variable
280
281
  def to_json
281
- MultiJson.encode(to_citeproc)
282
+ ::JSON.dump(to_citeproc)
282
283
  end
283
284
 
284
285
  # @return [String] a human-readable representation of the variable
@@ -291,4 +292,4 @@ module CiteProc
291
292
  # A CiteProc Variable used for string values.
292
293
  class Text < Variable
293
294
  end
294
- end
295
+ end
@@ -1,3 +1,3 @@
1
1
  module CiteProc
2
- VERSION = '1.0.0.pre12'.freeze
2
+ VERSION = '1.0.0'.freeze
3
3
  end
@@ -1,25 +1,27 @@
1
1
  module CiteProc
2
2
 
3
3
  describe 'Assets' do
4
- let(:file) { Tempfile.new('asset') }
5
- let(:root) { File.dirname(file.path) }
6
- let(:name) { File.basename(file.path) }
7
- let(:extension) { File.extname(name) }
8
4
 
9
5
  before(:all) do
10
- file.write("asset content\n")
11
- file.close
6
+ @file = Tempfile.new('asset')
7
+ @file.write("asset content\n")
8
+ @file.close
9
+
10
+ @root = File.dirname(@file.path)
11
+ @name = File.basename(@file.path)
12
+
13
+ @extension = File.extname(@name)
12
14
  end
13
15
 
14
- after(:all) { file.unlink }
16
+ after(:all) { @file.unlink }
15
17
 
16
18
  describe 'Style' do
17
19
 
18
20
  before(:all) do
19
21
  @default_root = Style.root
20
22
  @default_extension = Style.extension
21
- Style.root = root
22
- Style.extension = extension
23
+ Style.root = @root
24
+ Style.extension = @extension
23
25
  end
24
26
 
25
27
  after(:all) do
@@ -34,20 +36,20 @@ module CiteProc
34
36
  describe '.open' do
35
37
 
36
38
  it 'accepts an absolute file name' do
37
- Style.open(file.path).to_s.should == "asset content\n"
39
+ Style.open(@file.path).to_s.should == "asset content\n"
38
40
  end
39
41
 
40
42
  it 'accepts a file name' do
41
- Style.open(name).to_s.should == "asset content\n"
43
+ Style.open(@name).to_s.should == "asset content\n"
42
44
  end
43
45
 
44
46
  it 'accepts a file name without extension' do
45
- Style.open(name.sub(/#{extension}$/,'')).to_s.should == "asset content\n"
47
+ Style.open(@name.sub(/#{@extension}$/,'')).to_s.should == "asset content\n"
46
48
  end
47
49
 
48
50
 
49
51
  it 'accepts an io object' do
50
- Style.open(file.open).to_s.should == "asset content\n"
52
+ Style.open(@file.open).to_s.should == "asset content\n"
51
53
  end
52
54
 
53
55
  it 'returns the given string if it looks like XML' do
@@ -57,11 +59,11 @@ module CiteProc
57
59
 
58
60
  describe '.extend_name' do
59
61
  it 'adds the default extension if the file does not already end with it' do
60
- Style.extend_name(name.sub(/#{extension}$/,'')).should == name
62
+ Style.extend_name(@name.sub(/#{@extension}$/,'')).should == @name
61
63
  end
62
64
 
63
65
  it 'does not add the default extension if the file already ends with it' do
64
- Style.extend_name(name).should == name
66
+ Style.extend_name(@name).should == @name
65
67
  end
66
68
  end
67
69
 
@@ -1,42 +1,42 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  module CiteProc
4
-
4
+
5
5
  describe Bibliography do
6
-
6
+
7
7
  it { should be_empty }
8
8
  it { should_not have_errors }
9
-
9
+
10
10
  describe '#to_citeproc conversion' do
11
-
11
+
12
12
  it 'returns an array' do
13
13
  subject.to_citeproc.should be_a(Array)
14
14
  end
15
-
15
+
16
16
  it 'returns exactly two elements' do
17
17
  subject.to_citeproc.should have(2).elements
18
18
  end
19
-
19
+
20
20
  it 'returns formatting options as the first element' do
21
21
  subject.to_citeproc.first.should be_a(Hash)
22
22
  end
23
23
 
24
24
  describe 'the formatting options' do
25
25
  let(:options) { subject.to_citeproc[0] }
26
-
26
+
27
27
  it 'contains a the error list' do
28
28
  options.should have_key('bibliography_errors')
29
29
  options['bibliography_errors'].should be_empty
30
30
  end
31
-
31
+
32
32
  end
33
-
33
+
34
34
  it 'returns the list of references as the second element' do
35
35
  subject.to_citeproc.last.should be_a(Array)
36
36
  end
37
-
37
+
38
38
  end
39
-
39
+
40
40
  describe '.create (citeproc parser)' do
41
41
  let(:js) { <<-JS_END }
42
42
  [
@@ -56,17 +56,17 @@ module CiteProc
56
56
  ]
57
57
  ]
58
58
  JS_END
59
-
59
+
60
60
  it 'parses citeproc/json strings' do
61
- b = Bibliography.create(js)
61
+ b = Bibliography.create!(js)
62
62
  b.should be_a(Bibliography)
63
63
  b.should have(2).references
64
64
  b.should_not have_errors
65
- b.options[:align].should be true
65
+ b.options[:'second-field-align'].should be true
66
66
  end
67
-
67
+
68
68
  end
69
-
69
+
70
70
  end
71
-
71
+
72
72
  end
@@ -2,93 +2,93 @@ require 'spec_helper'
2
2
 
3
3
  module CiteProc
4
4
 
5
- describe 'citation input' do
6
-
7
- let(:hash) {{
8
- "citationItems" => [
9
- {
10
- "id" => "ITEM-1"
11
- }
12
- ],
13
- "properties" => {
14
- "noteIndex" => 1
15
- }
16
- }}
17
-
18
- let(:json) { MultiJson.encode(hash) }
19
-
20
-
21
-
22
- describe CitationData do
23
-
24
- it { should_not be nil }
25
- it { should be_empty }
26
-
27
- it 'has not been processed by default' do
28
- CitationData.new.should_not be_processed
29
- end
30
-
31
- describe '.new' do
32
-
33
- it 'accepts a citeproc hash' do
34
- d = CitationData.new(hash)
35
- d.should be_footnote
36
- d.should_not be_empty
37
- d[0].should be_a(CitationItem)
38
- d.index.should == 1
39
- end
40
-
41
- it 'accepts an array of items' do
42
- CitationData.new([CitationItem.new(:id => 'id')]).should have(1).items
43
- end
44
-
45
- it 'accepts an array of hashes' do
46
- CitationData.new([{:id => 'id'}])[0].should be_a(CitationItem)
47
- end
48
-
49
- end
50
-
51
- describe '#to_citeproc' do
52
-
53
- it 'returns empty an empty/default citation data element by default' do
54
- CitationData.new.to_citeproc.should == { 'citationItems' => [], 'properties' => { 'noteIndex' => 0}}
55
- end
56
-
57
-
58
- end
59
-
60
- end
61
-
62
- describe CitationItem do
63
-
64
- it { should_not be nil }
65
- it { should be_empty }
66
-
67
- describe '.new' do
68
-
69
- it 'accepts a hash as input' do
70
- CitationItem.new(:label => 'chapter').should have_label
71
- end
72
-
73
- end
74
-
75
- describe '#to_citeproc' do
76
-
77
- it 'returns empty citation data by default' do
78
- CitationItem.new.to_citeproc.should == {}
79
- end
80
-
81
- it 'returns a hash with stringified keys' do
82
- CitationItem.new(:type => :article).to_citeproc.should have_key('type')
83
- end
84
-
85
- it 'returns a hash with stringified values' do
86
- CitationItem.new(:type => :article).to_citeproc.should have_value('article')
87
- end
88
-
89
- end
90
-
91
- end
92
-
93
- end
94
- end
5
+ describe 'citation input' do
6
+
7
+ let(:hash) {{
8
+ "citationItems" => [
9
+ {
10
+ "id" => "ITEM-1"
11
+ }
12
+ ],
13
+ "properties" => {
14
+ "noteIndex" => 1
15
+ }
16
+ }}
17
+
18
+ let(:json) { ::JSON.dump(hash) }
19
+
20
+
21
+
22
+ describe CitationData do
23
+
24
+ it { should_not be nil }
25
+ it { should be_empty }
26
+
27
+ it 'has not been processed by default' do
28
+ CitationData.new.should_not be_processed
29
+ end
30
+
31
+ describe '.new' do
32
+
33
+ it 'accepts a citeproc hash' do
34
+ d = CitationData.new(hash)
35
+ d.should be_footnote
36
+ d.should_not be_empty
37
+ d[0].should be_a(CitationItem)
38
+ d.index.should == 1
39
+ end
40
+
41
+ it 'accepts an array of items' do
42
+ CitationData.new([CitationItem.new(:id => 'id')]).should have(1).items
43
+ end
44
+
45
+ it 'accepts an array of hashes' do
46
+ CitationData.new([{:id => 'id'}])[0].should be_a(CitationItem)
47
+ end
48
+
49
+ end
50
+
51
+ describe '#to_citeproc' do
52
+
53
+ it 'returns empty an empty/default citation data element by default' do
54
+ CitationData.new.to_citeproc.should == { 'citationItems' => [], 'properties' => { 'noteIndex' => 0}}
55
+ end
56
+
57
+
58
+ end
59
+
60
+ end
61
+
62
+ describe CitationItem do
63
+
64
+ it { should_not be nil }
65
+ it { should be_empty }
66
+
67
+ describe '.new' do
68
+
69
+ it 'accepts a hash as input' do
70
+ CitationItem.new(:label => 'chapter').should have_label
71
+ end
72
+
73
+ end
74
+
75
+ describe '#to_citeproc' do
76
+
77
+ it 'returns empty citation data by default' do
78
+ CitationItem.new.to_citeproc.should == {}
79
+ end
80
+
81
+ it 'returns a hash with stringified keys' do
82
+ CitationItem.new(:type => :article).to_citeproc.should have_key('type')
83
+ end
84
+
85
+ it 'returns a hash with stringified values' do
86
+ CitationItem.new(:type => :article).to_citeproc.should have_value('article')
87
+ end
88
+
89
+ end
90
+
91
+ end
92
+
93
+ end
94
+ end
@@ -6,15 +6,14 @@ module CiteProc
6
6
  it 'cannot be instantiated' do
7
7
  lambda { Engine.new }.should raise_error(NoMethodError)
8
8
  end
9
-
9
+
10
10
  describe 'subclasses' do
11
11
  let(:subject) { Class.new(Engine).new }
12
12
 
13
13
  it 'can be instantiated' do
14
14
  subject.should_not be nil
15
15
  end
16
-
17
16
  end
18
-
17
+
19
18
  end
20
- end
19
+ end
@@ -1,71 +1,79 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  module CiteProc
4
- describe Item do
5
-
6
-
7
- describe '.new' do
8
- it { should_not be nil }
9
-
10
- it 'creates number variables for number fields' do
11
- Item.new(:edition => 23).edition.should be_a(Number)
12
- end
13
-
14
- it 'creates text variable for text fields' do
15
- Item.new(:ISBN => 23).isbn.should be_a(Text)
16
- end
17
-
18
- it 'creates date variables for date fields' do
19
- Item.new(:accessed => Time.now).accessed.should be_a(CiteProc::Date)
20
- end
21
-
22
- it 'creates names variables for name fields' do
23
- Item.new(:editor => { :given => 'Jane' }).editor.should be_a(Names)
24
- Item.new(:editor => 'Plato and Socrates').editor.should have(2).names
25
- end
26
-
27
- it 'creates text variables for unknown fields' do
28
- v = Item.new(:unknown => 42)[:unknown]
29
- v.should be_a(Variable)
30
- v.should == '42'
31
- end
32
- end
33
-
34
- describe '#empty' do
35
- it { should be_empty }
36
-
37
- it 'returns false when there is at least one variable in the item' do
38
- Item.new(:title => 'foo').should_not be_empty
39
- end
40
- end
41
-
42
- describe '#each' do
43
- it 'yields each variable to the given block' do
44
- Item.new(:title => 'foo', :edition => 2).each.map {|kv| kv.join('-') }.sort.should == %w{edition-2 title-foo}
45
- end
46
- end
47
-
48
- describe '#each_value' do
49
- it "yields each variable's value to the given block" do
50
- Item.new(:title => 'foo', :edition => 2).each_value.map(&:to_s).sort.should == %w{2 foo}
51
- end
52
- end
53
-
54
- describe '#to_citeproc' do
55
-
56
- it 'returns an empty hash by default' do
57
- Item.new.to_citeproc.should == {}
58
- end
59
-
60
- it 'returns a hash with stringified keys' do
61
- Item.new(:issue => 42).to_citeproc.should have_key('issue')
62
- end
63
-
64
- it 'returns a hash with stringified values' do
65
- Item.new(:issue => 42).to_citeproc.values[0].should == '42'
66
- end
67
-
68
-
69
- end
70
- end
71
- end
4
+ describe Item do
5
+
6
+
7
+ describe '.new' do
8
+ it { should_not be nil }
9
+
10
+ it 'creates number variables for number fields' do
11
+ Item.new(:edition => 23).edition.should be_a(Number)
12
+ end
13
+
14
+ it 'creates text variable for text fields' do
15
+ Item.new(:ISBN => 23).isbn.should be_a(Text)
16
+ end
17
+
18
+ it 'creates date variables for date fields' do
19
+ Item.new(:accessed => Time.now).accessed.should be_a(CiteProc::Date)
20
+ end
21
+
22
+ it 'creates names variables for name fields' do
23
+ Item.new(:editor => { :given => 'Jane' }).editor.should be_a(Names)
24
+ Item.new(:editor => 'Plato and Socrates').editor.should have(2).names
25
+ end
26
+
27
+ it 'creates text variables for unknown fields' do
28
+ v = Item.new(:unknown => 42)[:unknown]
29
+ v.should be_a(Variable)
30
+ v.should == '42'
31
+ end
32
+ end
33
+
34
+ describe '#empty' do
35
+ it { should be_empty }
36
+
37
+ it 'returns false when there is at least one variable in the item' do
38
+ Item.new(:title => 'foo').should_not be_empty
39
+ end
40
+ end
41
+
42
+ describe '#each' do
43
+ it 'yields each variable to the given block' do
44
+ Item.new(:title => 'foo', :edition => 2).each.map {|kv| kv.join('-') }.sort.should == %w{edition-2 title-foo}
45
+ end
46
+ end
47
+
48
+ describe '#each_value' do
49
+ it "yields each variable's value to the given block" do
50
+ Item.new(:title => 'foo', :edition => 2).each_value.map(&:to_s).sort.should == %w{2 foo}
51
+ end
52
+ end
53
+
54
+ describe '#to_citeproc' do
55
+ it 'returns an empty hash by default' do
56
+ Item.new.to_citeproc.should == {}
57
+ end
58
+
59
+ it 'returns a hash with stringified keys' do
60
+ Item.new(:issue => 42).to_citeproc.should have_key('issue')
61
+ end
62
+
63
+ it 'returns a hash with stringified values' do
64
+ Item.new(:issue => 42).to_citeproc.values[0].should == '42'
65
+ end
66
+ end
67
+
68
+ describe '#dup' do
69
+ it 'returns a copy' do
70
+ item = Item.new
71
+ item.dup.should_not equal(item)
72
+ end
73
+
74
+ it 'copies all variables' do
75
+ Item.new(:issued => 1976).dup[:issued].year.should == 1976
76
+ end
77
+ end
78
+ end
79
+ end