cff 0.9.0 → 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.
- checksums.yaml +4 -4
- data/CHANGES.md +73 -0
- data/CITATION.cff +3 -3
- data/CONTRIBUTING.md +71 -0
- data/LICENCE +1 -1
- data/README.md +27 -21
- data/Rakefile +9 -8
- data/cff.gemspec +12 -11
- data/lib/cff/citable.rb +72 -0
- data/lib/cff/entity.rb +11 -31
- data/lib/cff/errors.rb +2 -5
- data/lib/cff/file.rb +23 -18
- data/lib/cff/formatters/all.rb +26 -0
- data/lib/cff/formatters/apalike.rb +145 -0
- data/lib/cff/formatters/bibtex.rb +205 -0
- data/lib/cff/formatters/formatter.rb +98 -0
- data/lib/cff/formatters.rb +61 -0
- data/lib/cff/identifier.rb +13 -8
- data/lib/cff/{model.rb → index.rb} +65 -81
- data/lib/cff/licensable.rb +3 -3
- data/lib/cff/model_part.rb +46 -10
- data/lib/cff/person.rb +8 -10
- data/lib/cff/reference.rb +55 -114
- data/lib/cff/schema.rb +23 -0
- data/lib/{schema → cff/schemas}/1.2.0.json +0 -0
- data/lib/cff/util.rb +63 -6
- data/lib/cff/validatable.rb +12 -11
- data/lib/cff/version.rb +2 -2
- data/lib/cff.rb +4 -27
- metadata +37 -31
- data/lib/cff/formatter/apa_formatter.rb +0 -77
- data/lib/cff/formatter/bibtex_formatter.rb +0 -122
- data/lib/cff/formatter/formatter.rb +0 -63
data/lib/cff/reference.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# Copyright (c) 2018-
|
3
|
+
# Copyright (c) 2018-2022 The Ruby Citation File Format Developers.
|
4
4
|
#
|
5
5
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
6
|
# you may not use this file except in compliance with the License.
|
@@ -14,9 +14,13 @@
|
|
14
14
|
# See the License for the specific language governing permissions and
|
15
15
|
# limitations under the License.
|
16
16
|
|
17
|
+
require_relative 'licensable'
|
18
|
+
require_relative 'model_part'
|
19
|
+
require_relative 'schema'
|
20
|
+
require_relative 'util'
|
21
|
+
|
17
22
|
##
|
18
23
|
module CFF
|
19
|
-
|
20
24
|
# Reference provides a reference pertaining to the software version or the
|
21
25
|
# software itself, e.g., a software paper describing the abstract concepts of
|
22
26
|
# the software, a paper describing an algorithm that has been implemented in
|
@@ -74,12 +78,13 @@ module CFF
|
|
74
78
|
# * `pmcid`
|
75
79
|
# * `publisher`
|
76
80
|
# * `repository`
|
77
|
-
# * `repository_code`
|
78
81
|
# * `repository_artifact`
|
82
|
+
# * `repository_code`
|
79
83
|
# * `scope`
|
80
84
|
# * `section`
|
81
85
|
# * `start`
|
82
86
|
# * `status` - *Note:* see documentation for `status =` below
|
87
|
+
# * `term`
|
83
88
|
# * `thesis_type`
|
84
89
|
# * `title`
|
85
90
|
# * `type` - *Note:* see documentation for `type =` below
|
@@ -90,44 +95,24 @@ module CFF
|
|
90
95
|
# * `year`
|
91
96
|
# * `year_original`
|
92
97
|
class Reference < ModelPart
|
93
|
-
|
94
98
|
include Licensable
|
95
99
|
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
'
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
'
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
'
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
# The [defined set of reference types](https://github.com/citation-file-format/citation-file-format#reference-types).
|
113
|
-
REFERENCE_TYPES = [
|
114
|
-
'art', 'article', 'audiovisual', 'bill', 'blog', 'book', 'catalogue',
|
115
|
-
'conference', 'conference-paper', 'data', 'database', 'dictionary',
|
116
|
-
'edited-work', 'encyclopedia', 'film-broadcast', 'generic',
|
117
|
-
'government-document', 'grant', 'hearing', 'historical-work',
|
118
|
-
'legal-case', 'legal-rule', 'magazine-article', 'manual', 'map',
|
119
|
-
'multimedia', 'music', 'newspaper-article', 'pamphlet', 'patent',
|
120
|
-
'personal-communication', 'proceedings', 'report', 'serial', 'slides',
|
121
|
-
'software', 'software-code', 'software-container', 'software-executable',
|
122
|
-
'software-virtual-machine', 'sound-recording', 'standard', 'statute',
|
123
|
-
'thesis', 'unpublished', 'video', 'website'
|
124
|
-
].freeze
|
125
|
-
|
126
|
-
# The [defined set of reference status types](https://github.com/citation-file-format/citation-file-format#status-strings).
|
127
|
-
REFERENCE_STATUS_TYPES = [
|
128
|
-
'abstract', 'advance-online', 'in-preparation', 'in-press',
|
129
|
-
'pre-print', 'submitted'
|
130
|
-
].freeze
|
100
|
+
# This list does not include `format` for reasons explained below, where
|
101
|
+
# the `format` method is defined!
|
102
|
+
ALLOWED_FIELDS = (
|
103
|
+
SCHEMA_FILE['definitions']['reference']['properties'].keys - %w[format languages]
|
104
|
+
).freeze # :nodoc:
|
105
|
+
|
106
|
+
# The [defined set of reference types](https://github.com/citation-file-format/citation-file-format/blob/main/schema-guide.md#definitionsreferencetype).
|
107
|
+
REFERENCE_TYPES =
|
108
|
+
SCHEMA_FILE['definitions']['reference']['properties']['type']['enum'].dup.freeze
|
109
|
+
|
110
|
+
# The [defined set of reference status types](https://github.com/citation-file-format/citation-file-format/blob/main/schema-guide.md#definitionsreferencestatus).
|
111
|
+
REFERENCE_STATUS_TYPES =
|
112
|
+
SCHEMA_FILE['definitions']['reference']['properties']['status']['enum'].dup.freeze
|
113
|
+
|
114
|
+
attr_date :date_accessed, :date_downloaded, :date_published,
|
115
|
+
:date_released, :issue_date
|
131
116
|
|
132
117
|
# :call-seq:
|
133
118
|
# new(title) -> Reference
|
@@ -137,24 +122,25 @@ module CFF
|
|
137
122
|
#
|
138
123
|
# Create a new Reference with the supplied title and, optionally, type.
|
139
124
|
# If type is not given, or is not one of the
|
140
|
-
# [defined set of reference types](https://github.com/citation-file-format/citation-file-format#
|
125
|
+
# [defined set of reference types](https://github.com/citation-file-format/citation-file-format/blob/main/schema-guide.md#definitionsreferencetype),
|
141
126
|
# 'generic' will be used by default.
|
142
|
-
def initialize(param, *more) # rubocop:disable Metrics
|
127
|
+
def initialize(param, *more) # rubocop:disable Metrics
|
128
|
+
super()
|
129
|
+
|
143
130
|
if param.is_a?(Hash)
|
144
131
|
@fields = build_model(param)
|
145
|
-
@fields.default = ''
|
146
132
|
else
|
147
|
-
@fields =
|
133
|
+
@fields = {}
|
148
134
|
type = more[0] &&= more[0].downcase
|
149
135
|
@fields['type'] = REFERENCE_TYPES.include?(type) ? type : 'generic'
|
150
136
|
@fields['title'] = param
|
151
137
|
end
|
152
138
|
|
153
|
-
[
|
154
|
-
|
155
|
-
|
139
|
+
%w[
|
140
|
+
authors contact editors editors-series identifiers
|
141
|
+
keywords patent-states recipients senders translators
|
156
142
|
].each do |field|
|
157
|
-
@fields[field] = [] if @fields[field].empty?
|
143
|
+
@fields[field] = [] if @fields[field].nil? || @fields[field].empty?
|
158
144
|
end
|
159
145
|
|
160
146
|
yield self if block_given?
|
@@ -162,9 +148,9 @@ module CFF
|
|
162
148
|
|
163
149
|
# :call-seq:
|
164
150
|
# from_cff(File, type: 'software') -> Reference
|
165
|
-
# from_cff(
|
151
|
+
# from_cff(Index, type: 'software') -> Reference
|
166
152
|
#
|
167
|
-
# Create a Reference from another CFF File or
|
153
|
+
# Create a Reference from another CFF File or Index. This is useful for
|
168
154
|
# easily adding a reference to something with its own CITATION.cff file
|
169
155
|
# already.
|
170
156
|
#
|
@@ -190,12 +176,13 @@ module CFF
|
|
190
176
|
# three letter language code, so `GER` becomes `deu`, `french` becomes
|
191
177
|
# `fra` and `en` becomes `eng`.
|
192
178
|
def add_language(lang)
|
193
|
-
|
179
|
+
require 'language_list'
|
180
|
+
@fields['languages'] = [] if @fields['languages'].nil? || @fields['languages'].empty?
|
194
181
|
lang = LanguageList::LanguageInfo.find(lang)
|
195
182
|
return if lang.nil?
|
196
183
|
|
197
184
|
lang = lang.iso_639_3
|
198
|
-
@fields['languages'] << lang unless @fields['languages'].include?
|
185
|
+
@fields['languages'] << lang unless @fields['languages'].include?(lang)
|
199
186
|
end
|
200
187
|
|
201
188
|
# :call-seq:
|
@@ -211,51 +198,7 @@ module CFF
|
|
211
198
|
#
|
212
199
|
# Return the list of languages associated with this Reference.
|
213
200
|
def languages
|
214
|
-
@fields['languages'].empty? ? [] : @fields['languages'].dup
|
215
|
-
end
|
216
|
-
|
217
|
-
# :call-seq:
|
218
|
-
# date_accessed = date
|
219
|
-
#
|
220
|
-
# Set the `date-accessed` field. If a non-Date object is passed in it will
|
221
|
-
# be parsed into a Date.
|
222
|
-
def date_accessed=(date)
|
223
|
-
date = Date.parse(date) unless date.is_a?(Date)
|
224
|
-
|
225
|
-
@fields['date-accessed'] = date
|
226
|
-
end
|
227
|
-
|
228
|
-
# :call-seq:
|
229
|
-
# date_downloaded = date
|
230
|
-
#
|
231
|
-
# Set the `date-downloaded` field. If a non-Date object is passed in it will
|
232
|
-
# be parsed into a Date.
|
233
|
-
def date_downloaded=(date)
|
234
|
-
date = Date.parse(date) unless date.is_a?(Date)
|
235
|
-
|
236
|
-
@fields['date-downloaded'] = date
|
237
|
-
end
|
238
|
-
|
239
|
-
# :call-seq:
|
240
|
-
# date_published = date
|
241
|
-
#
|
242
|
-
# Set the `date-published` field. If a non-Date object is passed in it will
|
243
|
-
# be parsed into a Date.
|
244
|
-
def date_published=(date)
|
245
|
-
date = Date.parse(date) unless date.is_a?(Date)
|
246
|
-
|
247
|
-
@fields['date-published'] = date
|
248
|
-
end
|
249
|
-
|
250
|
-
# :call-seq:
|
251
|
-
# date_released = date
|
252
|
-
#
|
253
|
-
# Set the `date-released` field. If a non-Date object is passed in it will
|
254
|
-
# be parsed into a Date.
|
255
|
-
def date_released=(date)
|
256
|
-
date = Date.parse(date) unless date.is_a?(Date)
|
257
|
-
|
258
|
-
@fields['date-released'] = date
|
201
|
+
@fields['languages'].nil? || @fields['languages'].empty? ? [] : @fields['languages'].dup
|
259
202
|
end
|
260
203
|
|
261
204
|
# Returns the format of this Reference.
|
@@ -263,7 +206,7 @@ module CFF
|
|
263
206
|
# This method is explicitly defined to override the private format method
|
264
207
|
# that all objects seem to have.
|
265
208
|
def format # :nodoc:
|
266
|
-
@fields['format']
|
209
|
+
@fields['format'].nil? ? '' : @fields['format']
|
267
210
|
end
|
268
211
|
|
269
212
|
# Sets the format of this Reference.
|
@@ -278,7 +221,7 @@ module CFF
|
|
278
221
|
# status = status
|
279
222
|
#
|
280
223
|
# Sets the status of this Reference. The status is restricted to a
|
281
|
-
# [defined set of status types](https://github.com/citation-file-format/citation-file-format#
|
224
|
+
# [defined set of status types](https://github.com/citation-file-format/citation-file-format/blob/main/schema-guide.md#definitionsreferencestatus).
|
282
225
|
def status=(status)
|
283
226
|
status = status.downcase
|
284
227
|
@fields['status'] = status if REFERENCE_STATUS_TYPES.include?(status)
|
@@ -288,7 +231,7 @@ module CFF
|
|
288
231
|
# type = type
|
289
232
|
#
|
290
233
|
# Sets the type of this Reference. The type is restricted to a
|
291
|
-
# [defined set of reference types](https://github.com/citation-file-format/citation-file-format#
|
234
|
+
# [defined set of reference types](https://github.com/citation-file-format/citation-file-format/blob/main/schema-guide.md#definitionsreferencetype).
|
292
235
|
def type=(type)
|
293
236
|
type = type.downcase
|
294
237
|
@fields['type'] = type if REFERENCE_TYPES.include?(type)
|
@@ -296,29 +239,27 @@ module CFF
|
|
296
239
|
|
297
240
|
# Override superclass #fields as References contain model parts too.
|
298
241
|
def fields # :nodoc:
|
299
|
-
[
|
300
|
-
|
301
|
-
|
242
|
+
%w[
|
243
|
+
authors contact editors editors-series identifiers
|
244
|
+
recipients senders translators
|
302
245
|
].each do |field|
|
303
|
-
normalize_modelpart_array!(@fields[field])
|
246
|
+
Util.normalize_modelpart_array!(@fields[field])
|
304
247
|
end
|
305
248
|
|
306
|
-
fields_to_hash(@fields)
|
249
|
+
Util.fields_to_hash(@fields)
|
307
250
|
end
|
308
251
|
|
309
252
|
private
|
310
253
|
|
311
254
|
def build_model(fields) # :nodoc:
|
312
|
-
[
|
313
|
-
|
314
|
-
'senders', 'translators'
|
255
|
+
%w[
|
256
|
+
authors contact editors editors-series recipients senders translators
|
315
257
|
].each do |field|
|
316
|
-
build_actor_collection!(fields[field]) if fields.include?(field)
|
258
|
+
Util.build_actor_collection!(fields[field]) if fields.include?(field)
|
317
259
|
end
|
318
260
|
|
319
|
-
[
|
320
|
-
|
321
|
-
'publisher'
|
261
|
+
%w[
|
262
|
+
conference database-provider institution location publisher
|
322
263
|
].each do |field|
|
323
264
|
fields[field] &&= Entity.new(fields[field])
|
324
265
|
end
|
@@ -436,7 +377,7 @@ module CFF
|
|
436
377
|
# the list, use:
|
437
378
|
#
|
438
379
|
# ```
|
439
|
-
#
|
380
|
+
# reference.identifiers << identifier
|
440
381
|
# ```
|
441
382
|
|
442
383
|
##
|
@@ -455,7 +396,7 @@ module CFF
|
|
455
396
|
# list, use:
|
456
397
|
#
|
457
398
|
# ```
|
458
|
-
#
|
399
|
+
# reference.keywords << keyword
|
459
400
|
# ```
|
460
401
|
#
|
461
402
|
# Keywords will be converted to Strings on output.
|
@@ -478,7 +419,7 @@ module CFF
|
|
478
419
|
# state to the list, use:
|
479
420
|
#
|
480
421
|
# ```
|
481
|
-
#
|
422
|
+
# reference.patent_states << patent_state
|
482
423
|
# ```
|
483
424
|
#
|
484
425
|
# Patent states will be converted to Strings on output.
|
data/lib/cff/schema.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Copyright (c) 2018-2022 The Ruby Citation File Format Developers.
|
4
|
+
#
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
# you may not use this file except in compliance with the License.
|
7
|
+
# You may obtain a copy of the License at
|
8
|
+
#
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
#
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
# See the License for the specific language governing permissions and
|
15
|
+
# limitations under the License.
|
16
|
+
|
17
|
+
require 'json'
|
18
|
+
|
19
|
+
##
|
20
|
+
module CFF
|
21
|
+
SCHEMA_PATH = ::File.join(__dir__, 'schemas', '1.2.0.json') # :nodoc:
|
22
|
+
SCHEMA_FILE = JSON.parse(::File.read(SCHEMA_PATH)) # :nodoc:
|
23
|
+
end
|
File without changes
|
data/lib/cff/util.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# Copyright (c) 2018-
|
3
|
+
# Copyright (c) 2018-2022 The Ruby Citation File Format Developers.
|
4
4
|
#
|
5
5
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
6
|
# you may not use this file except in compliance with the License.
|
@@ -14,17 +14,22 @@
|
|
14
14
|
# See the License for the specific language governing permissions and
|
15
15
|
# limitations under the License.
|
16
16
|
|
17
|
+
require_relative 'entity'
|
18
|
+
require_relative 'person'
|
19
|
+
require_relative 'version'
|
20
|
+
|
17
21
|
require 'rubygems'
|
18
22
|
|
19
23
|
##
|
20
24
|
module CFF
|
21
|
-
|
22
25
|
# Util provides utility methods useful throughout the rest of the CFF library.
|
23
26
|
#
|
24
27
|
# Util does not provide any methods or fields for the public API.
|
25
28
|
module Util
|
26
29
|
# :stopdoc:
|
27
30
|
|
31
|
+
module_function
|
32
|
+
|
28
33
|
def update_cff_version(version)
|
29
34
|
return '' if version.nil? || version.empty?
|
30
35
|
|
@@ -35,10 +40,6 @@ module CFF
|
|
35
40
|
end
|
36
41
|
end
|
37
42
|
|
38
|
-
def method_to_field(name)
|
39
|
-
name.tr('_', '-')
|
40
|
-
end
|
41
|
-
|
42
43
|
def build_actor_collection!(source)
|
43
44
|
source.map! do |s|
|
44
45
|
s.has_key?('given-names') ? Person.new(s) : Entity.new(s)
|
@@ -67,6 +68,62 @@ module CFF
|
|
67
68
|
hash
|
68
69
|
end
|
69
70
|
|
71
|
+
DEFAULT_CHAR_APPROXIMATIONS = {
|
72
|
+
'À' => 'A', 'Á' => 'A', 'Â' => 'A', 'Ã' => 'A', 'Ä' => 'A', 'Å' => 'A',
|
73
|
+
'Æ' => 'AE', 'Ç' => 'C', 'È' => 'E', 'É' => 'E', 'Ê' => 'E', 'Ë' => 'E',
|
74
|
+
'Ì' => 'I', 'Í' => 'I', 'Î' => 'I', 'Ï' => 'I', 'Ð' => 'D', 'Ñ' => 'N',
|
75
|
+
'Ò' => 'O', 'Ó' => 'O', 'Ô' => 'O', 'Õ' => 'O', 'Ö' => 'O', '×' => 'x',
|
76
|
+
'Ø' => 'O', 'Ù' => 'U', 'Ú' => 'U', 'Û' => 'U', 'Ü' => 'U', 'Ý' => 'Y',
|
77
|
+
'Þ' => 'Th', 'ß' => 'ss', 'à' => 'a', 'á' => 'a', 'â' => 'a',
|
78
|
+
'ã' => 'a', 'ä' => 'a', 'å' => 'a', 'æ' => 'ae', 'ç' => 'c', 'è' => 'e',
|
79
|
+
'é' => 'e', 'ê' => 'e', 'ë' => 'e', 'ì' => 'i', 'í' => 'i', 'î' => 'i',
|
80
|
+
'ï' => 'i', 'ð' => 'd', 'ñ' => 'n', 'ò' => 'o', 'ó' => 'o', 'ô' => 'o',
|
81
|
+
'õ' => 'o', 'ö' => 'o', 'ø' => 'o', 'ù' => 'u', 'ú' => 'u', 'û' => 'u',
|
82
|
+
'ü' => 'u', 'ý' => 'y', 'þ' => 'th', 'ÿ' => 'y', 'Ā' => 'A', 'ā' => 'a',
|
83
|
+
'Ă' => 'A', 'ă' => 'a', 'Ą' => 'A', 'ą' => 'a', 'Ć' => 'C', 'ć' => 'c',
|
84
|
+
'Ĉ' => 'C', 'ĉ' => 'c', 'Ċ' => 'C', 'ċ' => 'c', 'Č' => 'C', 'č' => 'c',
|
85
|
+
'Ď' => 'D', 'ď' => 'd', 'Đ' => 'D', 'đ' => 'd', 'Ē' => 'E', 'ē' => 'e',
|
86
|
+
'Ĕ' => 'E', 'ĕ' => 'e', 'Ė' => 'E', 'ė' => 'e', 'Ę' => 'E', 'ę' => 'e',
|
87
|
+
'Ě' => 'E', 'ě' => 'e', 'ệ' => 'e', 'Ĝ' => 'G', 'ĝ' => 'g', 'Ğ' => 'G',
|
88
|
+
'ğ' => 'g', 'Ġ' => 'G', 'ġ' => 'g', 'Ģ' => 'G', 'ģ' => 'g', 'Ĥ' => 'H',
|
89
|
+
'ĥ' => 'h', 'Ħ' => 'H', 'ħ' => 'h', 'Ĩ' => 'I', 'ĩ' => 'i', 'Ī' => 'I',
|
90
|
+
'ī' => 'i', 'Ĭ' => 'I', 'ĭ' => 'i', 'Į' => 'I', 'į' => 'i', 'İ' => 'I',
|
91
|
+
'ı' => 'i', 'IJ' => 'IJ', 'ij' => 'ij', 'Ĵ' => 'J', 'ĵ' => 'j',
|
92
|
+
'Ķ' => 'K', 'ķ' => 'k', 'ĸ' => 'k', 'Ĺ' => 'L', 'ĺ' => 'l', 'Ļ' => 'L',
|
93
|
+
'ļ' => 'l', 'Ľ' => 'L', 'ľ' => 'l', 'Ŀ' => 'L', 'ŀ' => 'l', 'Ł' => 'L',
|
94
|
+
'ł' => 'l', 'Ń' => 'N', 'ń' => 'n', 'Ņ' => 'N', 'ņ' => 'n', 'Ň' => 'N',
|
95
|
+
'ň' => 'n', 'ʼn' => "'n", 'Ŋ' => 'NG', 'ŋ' => 'ng', 'Ō' => 'O',
|
96
|
+
'ō' => 'o', 'Ŏ' => 'O', 'ŏ' => 'o', 'Ő' => 'O', 'ő' => 'o', 'Œ' => 'OE',
|
97
|
+
'œ' => 'oe', 'Ŕ' => 'R', 'ŕ' => 'r', 'Ŗ' => 'R', 'ŗ' => 'r', 'Ř' => 'R',
|
98
|
+
'ř' => 'r', 'Ś' => 'S', 'ś' => 's', 'Ŝ' => 'S', 'ŝ' => 's', 'Ş' => 'S',
|
99
|
+
'ş' => 's', 'Š' => 'S', 'š' => 's', 'Ţ' => 'T', 'ţ' => 't', 'Ť' => 'T',
|
100
|
+
'ť' => 't', 'Ŧ' => 'T', 'ŧ' => 't', 'Ũ' => 'U', 'ũ' => 'u', 'Ū' => 'U',
|
101
|
+
'ū' => 'u', 'Ŭ' => 'U', 'ŭ' => 'u', 'Ů' => 'U', 'ů' => 'u', 'Ű' => 'U',
|
102
|
+
'ű' => 'u', 'Ų' => 'U', 'ų' => 'u', 'Ŵ' => 'W', 'ŵ' => 'w', 'Ŷ' => 'Y',
|
103
|
+
'ŷ' => 'y', 'Ÿ' => 'Y', 'Ź' => 'Z', 'ź' => 'z', 'Ż' => 'Z', 'ż' => 'z',
|
104
|
+
'Ž' => 'Z', 'ž' => 'z'
|
105
|
+
}.freeze
|
106
|
+
|
107
|
+
def transliterate(string, fallback: '')
|
108
|
+
string.gsub(/[^\x00-\x7f]/u) do |char|
|
109
|
+
DEFAULT_CHAR_APPROXIMATIONS[char] || fallback
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
def parameterize(string, separator: '_')
|
114
|
+
# Normalize into ASCII.
|
115
|
+
param = transliterate(string)
|
116
|
+
|
117
|
+
# Remove unwanted chars by turning them into the separator.
|
118
|
+
param.gsub!(/[^a-z0-9\-_]+/i, separator)
|
119
|
+
|
120
|
+
# Only one separator at a time.
|
121
|
+
param.gsub!(/#{separator}{2,}/, separator)
|
122
|
+
|
123
|
+
# No leading/trailing separators.
|
124
|
+
param.gsub(/^#{separator}|#{separator}$/i, '')
|
125
|
+
end
|
126
|
+
|
70
127
|
# :startdoc:
|
71
128
|
end
|
72
129
|
end
|
data/lib/cff/validatable.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# Copyright (c) 2018-
|
3
|
+
# Copyright (c) 2018-2022 The Ruby Citation File Format Developers.
|
4
4
|
#
|
5
5
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
6
|
# you may not use this file except in compliance with the License.
|
@@ -14,24 +14,25 @@
|
|
14
14
|
# See the License for the specific language governing permissions and
|
15
15
|
# limitations under the License.
|
16
16
|
|
17
|
+
require_relative 'errors'
|
18
|
+
require_relative 'schema'
|
19
|
+
|
17
20
|
require 'json_schema'
|
18
21
|
|
19
22
|
##
|
20
23
|
module CFF
|
21
|
-
|
22
24
|
# Methods to validate CFF files/models against a formal schema.
|
23
25
|
module Validatable
|
24
|
-
|
25
26
|
SCHEMA = JsonSchema.parse!(SCHEMA_FILE) # :nodoc:
|
26
27
|
|
27
28
|
# :call-seq:
|
28
29
|
# validate!(fail_fast: false)
|
29
30
|
#
|
30
|
-
# Validate a CFF file or model and raise a ValidationError upon
|
31
|
-
# If an error is raised it will contain the detected validation
|
32
|
-
# for further inspection. Setting `fail_fast` to true will fail
|
33
|
-
# at the first detected failure, rather than gathering and
|
34
|
-
# failures.
|
31
|
+
# Validate a CFF file or model (Index) and raise a ValidationError upon
|
32
|
+
# failure. If an error is raised it will contain the detected validation
|
33
|
+
# failures for further inspection. Setting `fail_fast` to true will fail
|
34
|
+
# validation at the first detected failure, rather than gathering and
|
35
|
+
# returning all failures.
|
35
36
|
def validate!(fail_fast: false)
|
36
37
|
result = validate(fail_fast: fail_fast)
|
37
38
|
return if result[0]
|
@@ -42,9 +43,9 @@ module CFF
|
|
42
43
|
# :call-seq:
|
43
44
|
# validate(fail_fast: false) -> Array
|
44
45
|
#
|
45
|
-
# Validate a CFF file or model and return an array with the result.
|
46
|
-
# result array is a two-element array, with `true`/`false` at index 0
|
47
|
-
# indicate pass/fail, and an array of errors at index 1 (if any).
|
46
|
+
# Validate a CFF file or model (Index) and return an array with the result.
|
47
|
+
# The result array is a two-element array, with `true`/`false` at index 0
|
48
|
+
# to indicate pass/fail, and an array of errors at index 1 (if any).
|
48
49
|
# Setting `fail_fast` to true will fail validation at the first detected
|
49
50
|
# failure, rather than gathering and returning all failures.
|
50
51
|
def validate(fail_fast: false)
|
data/lib/cff/version.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# Copyright (c) 2018-
|
3
|
+
# Copyright (c) 2018-2022 The Ruby Citation File Format Developers.
|
4
4
|
#
|
5
5
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
6
|
# you may not use this file except in compliance with the License.
|
@@ -17,7 +17,7 @@
|
|
17
17
|
##
|
18
18
|
module CFF
|
19
19
|
# :nodoc:
|
20
|
-
VERSION = '0.
|
20
|
+
VERSION = '1.0.0'
|
21
21
|
DEFAULT_SPEC_VERSION = '1.2.0'
|
22
22
|
MIN_VALIDATABLE_VERSION = '1.2.0'
|
23
23
|
end
|
data/lib/cff.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# Copyright (c) 2018-
|
3
|
+
# Copyright (c) 2018-2022 The Ruby Citation File Format Developers.
|
4
4
|
#
|
5
5
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
6
|
# you may not use this file except in compliance with the License.
|
@@ -14,34 +14,11 @@
|
|
14
14
|
# See the License for the specific language governing permissions and
|
15
15
|
# limitations under the License.
|
16
16
|
|
17
|
-
require 'date'
|
18
|
-
require 'json'
|
19
|
-
require 'yaml'
|
20
|
-
|
21
|
-
require 'language_list'
|
22
|
-
|
23
17
|
# This library provides a Ruby interface to manipulate CITATION.cff files. The
|
24
|
-
# primary entry points are
|
18
|
+
# primary entry points are Index and File.
|
25
19
|
#
|
26
20
|
# See the [CITATION.cff documentation](https://citation-file-format.github.io/)
|
27
21
|
# for more details.
|
28
|
-
module CFF
|
29
|
-
SCHEMA_PATH = ::File.join(__dir__, 'schema', '1.2.0.json') # :nodoc:
|
30
|
-
SCHEMA_FILE = JSON.parse(::File.read(SCHEMA_PATH)) # :nodoc:
|
31
|
-
end
|
22
|
+
module CFF; end
|
32
23
|
|
33
|
-
|
34
|
-
require 'cff/errors'
|
35
|
-
require 'cff/util'
|
36
|
-
require 'cff/licensable'
|
37
|
-
require 'cff/validatable'
|
38
|
-
require 'cff/model_part'
|
39
|
-
require 'cff/person'
|
40
|
-
require 'cff/entity'
|
41
|
-
require 'cff/identifier'
|
42
|
-
require 'cff/reference'
|
43
|
-
require 'cff/model'
|
44
|
-
require 'cff/file'
|
45
|
-
require 'cff/formatter/formatter'
|
46
|
-
require 'cff/formatter/apa_formatter'
|
47
|
-
require 'cff/formatter/bibtex_formatter'
|
24
|
+
require_relative 'cff/file'
|