cff 0.3.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/CHANGES.md +29 -0
- data/CITATION.cff +21 -0
- data/Gemfile +1 -1
- data/Rakefile +14 -11
- data/bin/console +3 -3
- data/cff.gemspec +23 -21
- data/lib/cff.rb +12 -13
- data/lib/cff/entity.rb +6 -23
- data/lib/cff/file.rb +17 -10
- data/lib/cff/model.rb +101 -98
- data/lib/cff/{model-part.rb → model_part.rb} +14 -4
- data/lib/cff/person.rb +5 -18
- data/lib/cff/reference.rb +213 -273
- data/lib/cff/util.rb +28 -21
- data/lib/cff/version.rb +3 -3
- metadata +31 -20
- data/.gitignore +0 -30
- data/.ruby-gemset +0 -1
- data/.ruby-version +0 -1
- data/.travis.yml +0 -20
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 32661be9e23147731575824f34df12b82dfb6f0560af3fd4d8081958f633cac6
|
4
|
+
data.tar.gz: 5b525849ff1e6ff1829d70e657852377c88bf0b6e83dffff96dd6cd660fc029b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c1df6fd36b30cdd828d9d80ae183795f9eea5a3691684ed0769bbe75b8bca026ed540611f671341bca8880352f396c727931ceb55865086b8613c016af5a7769
|
7
|
+
data.tar.gz: 0f3afd7def478528b073c4a9454c804731fe6c50cde9acbcdafa0fdc0d6bfba577ca812fcc34fe0b36732f5b1dafebde2b90940f81c6ddf882ac22754b01b419
|
data/CHANGES.md
CHANGED
@@ -1,5 +1,34 @@
|
|
1
1
|
# Changes log for the Ruby CFF Library
|
2
2
|
|
3
|
+
## Version 0.4.0
|
4
|
+
|
5
|
+
* Remove unused Util#expand_field method.
|
6
|
+
* Changed Model#keywords to be a field type.
|
7
|
+
* Model is now a subclass of ModelPart.
|
8
|
+
* Document ModelPart and Util just enough.
|
9
|
+
* Add Util::normalize_modelpart_array! method.
|
10
|
+
* Tighten up checking for empty collections in model.
|
11
|
+
* Move the references into the Model fields.
|
12
|
+
* Add an in-place actor collection builder method.
|
13
|
+
* Move authors and contact to Model fields.
|
14
|
+
* Refactor Reference so the actor lists are fields.
|
15
|
+
* Remove unused method: Util::build_actor_collection.
|
16
|
+
* Remove unused method: Util::expand_array_field.
|
17
|
+
* Add rubocop to the development dependencies.
|
18
|
+
* Add rubocop configuration files.
|
19
|
+
* Add rubocop rake tasks.
|
20
|
+
* Many rubocop fixes.
|
21
|
+
* Compact ALLOWED_FIELDS lists for consistency.
|
22
|
+
* Allow creation of a Reference without a type.
|
23
|
+
* Remove unused method: Util.delete_from_hash.
|
24
|
+
* Refactor duplicated code into Util.fields_to_hash.
|
25
|
+
* Add File#write (instance method).
|
26
|
+
* Ensure a model always returns '' for missing fields.
|
27
|
+
* Test reading short and minimal CFF files.
|
28
|
+
* Cleanup duplicated tests.
|
29
|
+
* Don't store dotfiles in the gemfile.
|
30
|
+
* Add a CITATION.cff file!
|
31
|
+
|
3
32
|
## Version 0.3.0
|
4
33
|
|
5
34
|
* Update badges for new repo location.
|
data/CITATION.cff
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
cff-version: 1.0.3
|
2
|
+
message: If you use ruby-cff in your work, please cite it using the following metadata
|
3
|
+
title: Ruby CFF Library
|
4
|
+
abstract: This library provides a Ruby interface to manipulate CITATION.cff files
|
5
|
+
authors:
|
6
|
+
- family-names: Haines
|
7
|
+
given-names: Robert
|
8
|
+
orcid: https://orcid.org/0000-0002-9538-7919
|
9
|
+
affiliation: The University of Manchester, UK
|
10
|
+
keywords:
|
11
|
+
- ruby
|
12
|
+
- credit
|
13
|
+
- citation
|
14
|
+
- metadata
|
15
|
+
- cff
|
16
|
+
version: 0.4.0
|
17
|
+
doi: 10.5281/zenodo.1184077
|
18
|
+
date-released: 2018-07-29
|
19
|
+
license: Apache-2.0
|
20
|
+
repository-artifact: https://rubygems.org/gems/cff
|
21
|
+
repository-code: https://github.com/citation-file-format/ruby-cff
|
data/Gemfile
CHANGED
data/Rakefile
CHANGED
@@ -12,22 +12,25 @@
|
|
12
12
|
# See the License for the specific language governing permissions and
|
13
13
|
# limitations under the License.
|
14
14
|
|
15
|
-
require
|
16
|
-
require
|
17
|
-
require
|
15
|
+
require 'bundler/gem_tasks'
|
16
|
+
require 'rake/testtask'
|
17
|
+
require 'rdoc/task'
|
18
|
+
require 'rubocop/rake_task'
|
18
19
|
|
19
|
-
task :
|
20
|
+
task default: :test
|
20
21
|
|
21
22
|
Rake::TestTask.new(:test) do |t|
|
22
|
-
t.libs <<
|
23
|
-
t.libs <<
|
24
|
-
t.test_files = FileList[
|
23
|
+
t.libs << 'test'
|
24
|
+
t.libs << 'lib'
|
25
|
+
t.test_files = FileList['test/**/*_test.rb']
|
25
26
|
end
|
26
27
|
|
27
28
|
RDoc::Task.new do |r|
|
28
|
-
r.main =
|
29
|
-
r.rdoc_files.include(
|
30
|
-
r.options <<
|
31
|
-
r.options <<
|
29
|
+
r.main = 'README.md'
|
30
|
+
r.rdoc_files.include('README.md', 'LICENCE', 'CHANGES.md', 'lib/**/*.rb')
|
31
|
+
r.options << '--markup=markdown'
|
32
|
+
r.options << '--tab-width=2'
|
32
33
|
r.options << "-t Ruby CFF Library version #{::CFF::VERSION}"
|
33
34
|
end
|
35
|
+
|
36
|
+
RuboCop::RakeTask.new
|
data/bin/console
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
3
|
+
require 'bundler/setup'
|
4
|
+
require 'cff'
|
5
5
|
|
6
6
|
# You can add fixtures and/or initialization code here to make experimenting
|
7
7
|
# with your gem easier. You can also use a different console, if you like.
|
@@ -10,5 +10,5 @@ require "cff"
|
|
10
10
|
# require "pry"
|
11
11
|
# Pry.start
|
12
12
|
|
13
|
-
require
|
13
|
+
require 'irb'
|
14
14
|
IRB.start(__FILE__)
|
data/cff.gemspec
CHANGED
@@ -12,37 +12,39 @@
|
|
12
12
|
# See the License for the specific language governing permissions and
|
13
13
|
# limitations under the License.
|
14
14
|
|
15
|
-
lib = File.expand_path(
|
15
|
+
lib = File.expand_path('lib', __dir__)
|
16
16
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
17
|
-
require
|
17
|
+
require 'cff/version'
|
18
18
|
|
19
19
|
Gem::Specification.new do |spec|
|
20
|
-
spec.name =
|
20
|
+
spec.name = 'cff'
|
21
21
|
spec.version = CFF::VERSION
|
22
|
-
spec.authors = [
|
23
|
-
spec.email = [
|
22
|
+
spec.authors = ['Robert Haines']
|
23
|
+
spec.email = ['robert.haines@manchester.ac.uk']
|
24
24
|
|
25
|
-
spec.summary =
|
26
|
-
spec.description =
|
27
|
-
|
28
|
-
spec.
|
25
|
+
spec.summary = 'A Ruby library for manipulating CITATION.cff files.'
|
26
|
+
spec.description = 'See https://citation-file-format.github.io/ ' \
|
27
|
+
'for more info.'
|
28
|
+
spec.homepage = 'https://github.com/citation-file-format/ruby-cff'
|
29
|
+
spec.license = 'Apache-2.0'
|
29
30
|
|
30
31
|
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
31
|
-
f.match(%r{^(test|spec|features)
|
32
|
+
f.match(%r{^((test|spec|features)/|\.)})
|
32
33
|
end
|
33
|
-
spec.bindir =
|
34
|
+
spec.bindir = 'exe'
|
34
35
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
35
|
-
spec.require_paths = [
|
36
|
+
spec.require_paths = ['lib']
|
36
37
|
|
37
|
-
spec.required_ruby_version =
|
38
|
+
spec.required_ruby_version = '>= 2.2.0'
|
38
39
|
|
39
|
-
spec.add_runtime_dependency
|
40
|
-
spec.add_runtime_dependency
|
40
|
+
spec.add_runtime_dependency 'language_list', '~> 1.2'
|
41
|
+
spec.add_runtime_dependency 'spdx-licenses', '~> 1.1'
|
41
42
|
|
42
|
-
spec.add_development_dependency
|
43
|
-
spec.add_development_dependency
|
44
|
-
spec.add_development_dependency
|
45
|
-
spec.add_development_dependency
|
46
|
-
spec.add_development_dependency
|
47
|
-
spec.add_development_dependency
|
43
|
+
spec.add_development_dependency 'bundler', '~> 1.16'
|
44
|
+
spec.add_development_dependency 'coveralls', '~> 0.8'
|
45
|
+
spec.add_development_dependency 'minitest', '~> 5.0'
|
46
|
+
spec.add_development_dependency 'rake', '~> 10.0'
|
47
|
+
spec.add_development_dependency 'rdoc', '~> 6.0'
|
48
|
+
spec.add_development_dependency 'rubocop', '~> 0.54'
|
49
|
+
spec.add_development_dependency 'test_construct', '~> 2.0'
|
48
50
|
end
|
data/lib/cff.rb
CHANGED
@@ -12,19 +12,19 @@
|
|
12
12
|
# See the License for the specific language governing permissions and
|
13
13
|
# limitations under the License.
|
14
14
|
|
15
|
-
require
|
16
|
-
require
|
17
|
-
require
|
18
|
-
require
|
15
|
+
require 'date'
|
16
|
+
require 'yaml'
|
17
|
+
require 'language_list'
|
18
|
+
require 'spdx-licenses'
|
19
19
|
|
20
|
-
require
|
21
|
-
require
|
22
|
-
require
|
23
|
-
require
|
24
|
-
require
|
25
|
-
require
|
26
|
-
require
|
27
|
-
require
|
20
|
+
require 'cff/version'
|
21
|
+
require 'cff/util'
|
22
|
+
require 'cff/model_part'
|
23
|
+
require 'cff/person'
|
24
|
+
require 'cff/entity'
|
25
|
+
require 'cff/reference'
|
26
|
+
require 'cff/model'
|
27
|
+
require 'cff/file'
|
28
28
|
|
29
29
|
# This library provides a Ruby interface to manipulate CITATION.cff files. The
|
30
30
|
# primary entry points are Model and File.
|
@@ -32,5 +32,4 @@ require "cff/file"
|
|
32
32
|
# See the [CITATION.cff documentation](https://citation-file-format.github.io/)
|
33
33
|
# for more details.
|
34
34
|
module CFF
|
35
|
-
|
36
35
|
end
|
data/lib/cff/entity.rb
CHANGED
@@ -12,7 +12,7 @@
|
|
12
12
|
# See the License for the specific language governing permissions and
|
13
13
|
# limitations under the License.
|
14
14
|
|
15
|
-
|
15
|
+
##
|
16
16
|
module CFF
|
17
17
|
|
18
18
|
# An Entity can represent different types of entities, e.g., a publishing
|
@@ -21,20 +21,8 @@ module CFF
|
|
21
21
|
class Entity < ModelPart
|
22
22
|
|
23
23
|
ALLOWED_FIELDS = [
|
24
|
-
'address',
|
25
|
-
'
|
26
|
-
'country',
|
27
|
-
'email',
|
28
|
-
'date-end',
|
29
|
-
'date-start',
|
30
|
-
'fax',
|
31
|
-
'location',
|
32
|
-
'name',
|
33
|
-
'orcid',
|
34
|
-
'post-code',
|
35
|
-
'region',
|
36
|
-
'tel',
|
37
|
-
'website'
|
24
|
+
'address', 'city', 'country', 'email', 'date-end', 'date-start', 'fax',
|
25
|
+
'location', 'name', 'orcid', 'post-code', 'region', 'tel', 'website'
|
38
26
|
].freeze # :nodoc:
|
39
27
|
|
40
28
|
# :call-seq:
|
@@ -42,7 +30,7 @@ module CFF
|
|
42
30
|
#
|
43
31
|
# Create a new Entity with the supplied name.
|
44
32
|
def initialize(param)
|
45
|
-
if Hash
|
33
|
+
if param.is_a?(Hash)
|
46
34
|
@fields = param
|
47
35
|
else
|
48
36
|
@fields = Hash.new('')
|
@@ -56,9 +44,7 @@ module CFF
|
|
56
44
|
# Set the `date-end` field. If a non-Date object is passed in it will
|
57
45
|
# be parsed into a Date.
|
58
46
|
def date_end=(date)
|
59
|
-
|
60
|
-
date = Date.parse(date)
|
61
|
-
end
|
47
|
+
date = Date.parse(date) unless date.is_a?(Date)
|
62
48
|
|
63
49
|
@fields['date-end'] = date
|
64
50
|
end
|
@@ -69,12 +55,9 @@ module CFF
|
|
69
55
|
# Set the `date-start` field. If a non-Date object is passed in it will
|
70
56
|
# be parsed into a Date.
|
71
57
|
def date_start=(date)
|
72
|
-
|
73
|
-
date = Date.parse(date)
|
74
|
-
end
|
58
|
+
date = Date.parse(date) unless date.is_a?(Date)
|
75
59
|
|
76
60
|
@fields['date-start'] = date
|
77
61
|
end
|
78
|
-
|
79
62
|
end
|
80
63
|
end
|
data/lib/cff/file.rb
CHANGED
@@ -12,14 +12,14 @@
|
|
12
12
|
# See the License for the specific language governing permissions and
|
13
13
|
# limitations under the License.
|
14
14
|
|
15
|
-
|
15
|
+
##
|
16
16
|
module CFF
|
17
17
|
|
18
18
|
# File provides direct access to a CFF Model, with the addition of some
|
19
19
|
# filesystem utilities.
|
20
20
|
class File
|
21
21
|
|
22
|
-
YAML_HEADER = "---\n" # :nodoc:
|
22
|
+
YAML_HEADER = "---\n".freeze # :nodoc:
|
23
23
|
|
24
24
|
# :call-seq:
|
25
25
|
# new(title) -> File
|
@@ -31,9 +31,7 @@ module CFF
|
|
31
31
|
# All methods provided by Model are also available directly on File
|
32
32
|
# objects.
|
33
33
|
def initialize(param)
|
34
|
-
|
35
|
-
param = Model.new(param)
|
36
|
-
end
|
34
|
+
param = Model.new(param) unless param.is_a?(Model)
|
37
35
|
|
38
36
|
@model = param
|
39
37
|
end
|
@@ -43,7 +41,7 @@ module CFF
|
|
43
41
|
#
|
44
42
|
# Read a file and parse it for subsequent manipulation.
|
45
43
|
def self.read(file)
|
46
|
-
new(YAML
|
44
|
+
new(YAML.load_file(file))
|
47
45
|
end
|
48
46
|
|
49
47
|
# :call-seq:
|
@@ -52,16 +50,25 @@ module CFF
|
|
52
50
|
#
|
53
51
|
# Write the supplied model or yaml string to `file`.
|
54
52
|
def self.write(file, cff)
|
55
|
-
|
56
|
-
cff = cff.to_yaml
|
57
|
-
end
|
53
|
+
cff = cff.to_yaml unless cff.is_a?(String)
|
58
54
|
|
59
55
|
::File.write(file, cff[YAML_HEADER.length...-1])
|
60
56
|
end
|
61
57
|
|
58
|
+
# :call-seq:
|
59
|
+
# write(file)
|
60
|
+
#
|
61
|
+
# Write this CFF File to `file`.
|
62
|
+
def write(file)
|
63
|
+
File.write(file, @model)
|
64
|
+
end
|
65
|
+
|
62
66
|
def method_missing(name, *args) # :nodoc:
|
63
|
-
@model.send
|
67
|
+
@model.respond_to?(name) ? @model.send(name, *args) : super
|
64
68
|
end
|
65
69
|
|
70
|
+
def respond_to_missing?(name, *all) # :nodoc:
|
71
|
+
@model.respond_to?(name, *all)
|
72
|
+
end
|
66
73
|
end
|
67
74
|
end
|
data/lib/cff/model.rb
CHANGED
@@ -12,55 +12,94 @@
|
|
12
12
|
# See the License for the specific language governing permissions and
|
13
13
|
# limitations under the License.
|
14
14
|
|
15
|
-
|
15
|
+
##
|
16
16
|
module CFF
|
17
17
|
|
18
18
|
# Model is the core data structure for a CITATION.cff file. It can be
|
19
19
|
# accessed direcly, or via File.
|
20
|
-
class Model
|
21
|
-
|
22
|
-
include Util
|
20
|
+
class Model < ModelPart
|
23
21
|
|
24
22
|
ALLOWED_FIELDS = [
|
25
|
-
'abstract',
|
26
|
-
'
|
27
|
-
'
|
28
|
-
'
|
29
|
-
|
30
|
-
'license',
|
31
|
-
'license-url',
|
32
|
-
'message',
|
33
|
-
'repository',
|
34
|
-
'repository-artifact',
|
35
|
-
'repository-code',
|
36
|
-
'title',
|
37
|
-
'url',
|
38
|
-
'version'
|
39
|
-
].freeze # :nodoc:
|
23
|
+
'abstract', 'authors', 'cff-version', 'contact', 'commit',
|
24
|
+
'date-released', 'doi', 'keywords', 'license', 'license-url', 'message',
|
25
|
+
'references', 'repository', 'repository-artifact', 'repository-code',
|
26
|
+
'title', 'url', 'version'
|
27
|
+
].freeze # :nodoc:
|
40
28
|
|
41
29
|
# The default message to use if none is explicitly set.
|
42
|
-
DEFAULT_MESSAGE =
|
30
|
+
DEFAULT_MESSAGE = 'If you use this software in your work, please cite ' \
|
31
|
+
'it using the following metadata'.freeze
|
43
32
|
|
44
33
|
# :call-seq:
|
45
34
|
# new(title) -> Model
|
46
35
|
#
|
47
36
|
# Initialize a new Model with the supplied title.
|
48
37
|
def initialize(param)
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
@references = []
|
53
|
-
|
54
|
-
if Hash === param
|
55
|
-
build_model(param)
|
38
|
+
if param.is_a?(Hash)
|
39
|
+
@fields = build_model(param)
|
40
|
+
@fields.default = ''
|
56
41
|
else
|
57
42
|
@fields = Hash.new('')
|
58
43
|
@fields['cff-version'] = DEFAULT_SPEC_VERSION
|
59
44
|
@fields['message'] = DEFAULT_MESSAGE
|
60
45
|
@fields['title'] = param
|
61
46
|
end
|
47
|
+
|
48
|
+
%w[authors contact keywords references].each do |field|
|
49
|
+
@fields[field] = [] if @fields[field].empty?
|
50
|
+
end
|
62
51
|
end
|
63
52
|
|
53
|
+
# :call-seq:
|
54
|
+
# date_released = date
|
55
|
+
#
|
56
|
+
# Set the `date-released` field. If a non-Date object is passed in it will
|
57
|
+
# be parsed into a Date.
|
58
|
+
def date_released=(date)
|
59
|
+
date = Date.parse(date) unless date.is_a?(Date)
|
60
|
+
|
61
|
+
@fields['date-released'] = date
|
62
|
+
end
|
63
|
+
|
64
|
+
# :call-seq:
|
65
|
+
# version = version
|
66
|
+
#
|
67
|
+
# Set the `version` field.
|
68
|
+
def version=(version)
|
69
|
+
@fields['version'] = version.to_s
|
70
|
+
end
|
71
|
+
|
72
|
+
def to_yaml # :nodoc:
|
73
|
+
YAML.dump fields, line_width: -1, indentation: 2
|
74
|
+
end
|
75
|
+
|
76
|
+
private
|
77
|
+
|
78
|
+
def fields
|
79
|
+
%w[authors contact references].each do |field|
|
80
|
+
normalize_modelpart_array!(@fields[field])
|
81
|
+
end
|
82
|
+
|
83
|
+
fields_to_hash(@fields)
|
84
|
+
end
|
85
|
+
|
86
|
+
def build_model(fields)
|
87
|
+
build_actor_collection!(fields['authors'] || [])
|
88
|
+
build_actor_collection!(fields['contact'] || [])
|
89
|
+
(fields['references'] || []).map! do |r|
|
90
|
+
Reference.new(r)
|
91
|
+
end
|
92
|
+
|
93
|
+
fields
|
94
|
+
end
|
95
|
+
|
96
|
+
public
|
97
|
+
|
98
|
+
# Some documentation of "hidden" methods is provided here, out of the
|
99
|
+
# way of the main class code.
|
100
|
+
|
101
|
+
##
|
102
|
+
# :method: authors
|
64
103
|
# :call-seq:
|
65
104
|
# authors -> Array
|
66
105
|
#
|
@@ -72,10 +111,18 @@ module CFF
|
|
72
111
|
# ```
|
73
112
|
#
|
74
113
|
# Authors can be a Person or Entity.
|
75
|
-
def authors
|
76
|
-
@authors
|
77
|
-
end
|
78
114
|
|
115
|
+
##
|
116
|
+
# :method: authors=
|
117
|
+
# :call-seq:
|
118
|
+
# authors = array_of_authors -> Array
|
119
|
+
#
|
120
|
+
# Replace the list of authors for this citation.
|
121
|
+
#
|
122
|
+
# Authors can be a Person or Entity.
|
123
|
+
|
124
|
+
##
|
125
|
+
# :method: contact
|
79
126
|
# :call-seq:
|
80
127
|
# contact -> Array
|
81
128
|
#
|
@@ -87,23 +134,18 @@ module CFF
|
|
87
134
|
# ```
|
88
135
|
#
|
89
136
|
# Contacts can be a Person or Entity.
|
90
|
-
def contact
|
91
|
-
@contact
|
92
|
-
end
|
93
137
|
|
138
|
+
##
|
139
|
+
# :method: contact=
|
94
140
|
# :call-seq:
|
95
|
-
#
|
141
|
+
# contact = array_of_contacts -> Array
|
96
142
|
#
|
97
|
-
#
|
98
|
-
#
|
99
|
-
|
100
|
-
unless Date === date
|
101
|
-
date = Date.parse(date)
|
102
|
-
end
|
103
|
-
|
104
|
-
@fields['date-released'] = date
|
105
|
-
end
|
143
|
+
# Replace the list of contacts for this citation.
|
144
|
+
#
|
145
|
+
# Contacts can be a Person or Entity.
|
106
146
|
|
147
|
+
##
|
148
|
+
# :method: keywords
|
107
149
|
# :call-seq:
|
108
150
|
# keywords -> Array
|
109
151
|
#
|
@@ -114,11 +156,19 @@ module CFF
|
|
114
156
|
# model.keywords << keyword
|
115
157
|
# ```
|
116
158
|
#
|
117
|
-
# Keywords will be converted to Strings on output
|
118
|
-
|
119
|
-
|
120
|
-
|
159
|
+
# Keywords will be converted to Strings on output.
|
160
|
+
|
161
|
+
##
|
162
|
+
# :method: keywords=
|
163
|
+
# :call-seq:
|
164
|
+
# keywords = array_of_keywords -> Array
|
165
|
+
#
|
166
|
+
# Replace the list of keywords for this citation.
|
167
|
+
#
|
168
|
+
# Keywords will be converted to Strings on output.
|
121
169
|
|
170
|
+
##
|
171
|
+
# :method: references
|
122
172
|
# :call-seq:
|
123
173
|
# references -> Array
|
124
174
|
#
|
@@ -128,59 +178,12 @@ module CFF
|
|
128
178
|
# ```
|
129
179
|
# model.references << reference
|
130
180
|
# ```
|
131
|
-
def references
|
132
|
-
@references
|
133
|
-
end
|
134
181
|
|
182
|
+
##
|
183
|
+
# :method: references=
|
135
184
|
# :call-seq:
|
136
|
-
#
|
185
|
+
# references = array_of_references -> Array
|
137
186
|
#
|
138
|
-
#
|
139
|
-
def version=(version)
|
140
|
-
@fields['version'] = version.to_s
|
141
|
-
end
|
142
|
-
|
143
|
-
def to_yaml # :nodoc:
|
144
|
-
YAML.dump fields, :line_width => -1, :indentation => 2
|
145
|
-
end
|
146
|
-
|
147
|
-
def method_missing(name, *args) # :nodoc:
|
148
|
-
n = method_to_field(name.id2name)
|
149
|
-
super unless ALLOWED_FIELDS.include?(n.chomp('='))
|
150
|
-
|
151
|
-
if n.end_with?('=')
|
152
|
-
@fields[n.chomp('=')] = args[0] || ''
|
153
|
-
else
|
154
|
-
@fields[n]
|
155
|
-
end
|
156
|
-
end
|
157
|
-
|
158
|
-
private
|
159
|
-
|
160
|
-
def fields
|
161
|
-
model = @fields.dup
|
162
|
-
[
|
163
|
-
['authors', @authors],
|
164
|
-
['contact', @contact],
|
165
|
-
['references', @references]
|
166
|
-
].each do |field, var|
|
167
|
-
model[field] = expand_array_field(var) unless var.empty?
|
168
|
-
end
|
169
|
-
model['keywords'] = @keywords.map { |k| k.to_s } unless @keywords.empty?
|
170
|
-
|
171
|
-
model
|
172
|
-
end
|
173
|
-
|
174
|
-
def build_model(fields)
|
175
|
-
build_actor_collection(@authors, fields['authors'])
|
176
|
-
build_actor_collection(@contact, fields['contact'])
|
177
|
-
@keywords = fields['keywords']
|
178
|
-
fields['references'].each do |r|
|
179
|
-
@references << Reference.new(r)
|
180
|
-
end
|
181
|
-
|
182
|
-
@fields = delete_from_hash(fields, 'authors', 'contact', 'keywords', 'references')
|
183
|
-
end
|
184
|
-
|
187
|
+
# Replace the list of references for this citation.
|
185
188
|
end
|
186
189
|
end
|