cff 0.9.0 → 1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGES.md +80 -0
- data/CITATION.cff +3 -3
- data/CONTRIBUTING.md +71 -0
- data/LICENCE +1 -1
- data/README.md +47 -22
- 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 +161 -0
- data/lib/cff/formatters/bibtex.rb +206 -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 +66 -7
- 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,13 +40,11 @@ module CFF
|
|
35
40
|
end
|
36
41
|
end
|
37
42
|
|
38
|
-
|
39
|
-
|
40
|
-
end
|
41
|
-
|
43
|
+
# Currently need to make some sort of guess as to whether an actor
|
44
|
+
# is a Person or Entity. This isn't perfect, but works 99.99% I think.
|
42
45
|
def build_actor_collection!(source)
|
43
46
|
source.map! do |s|
|
44
|
-
s.has_key?('
|
47
|
+
s.has_key?('name') ? Entity.new(s) : Person.new(s)
|
45
48
|
end
|
46
49
|
end
|
47
50
|
|
@@ -67,6 +70,62 @@ module CFF
|
|
67
70
|
hash
|
68
71
|
end
|
69
72
|
|
73
|
+
DEFAULT_CHAR_APPROXIMATIONS = {
|
74
|
+
'À' => 'A', 'Á' => 'A', 'Â' => 'A', 'Ã' => 'A', 'Ä' => 'A', 'Å' => 'A',
|
75
|
+
'Æ' => 'AE', 'Ç' => 'C', 'È' => 'E', 'É' => 'E', 'Ê' => 'E', 'Ë' => 'E',
|
76
|
+
'Ì' => 'I', 'Í' => 'I', 'Î' => 'I', 'Ï' => 'I', 'Ð' => 'D', 'Ñ' => 'N',
|
77
|
+
'Ò' => 'O', 'Ó' => 'O', 'Ô' => 'O', 'Õ' => 'O', 'Ö' => 'O', '×' => 'x',
|
78
|
+
'Ø' => 'O', 'Ù' => 'U', 'Ú' => 'U', 'Û' => 'U', 'Ü' => 'U', 'Ý' => 'Y',
|
79
|
+
'Þ' => 'Th', 'ß' => 'ss', 'à' => 'a', 'á' => 'a', 'â' => 'a',
|
80
|
+
'ã' => 'a', 'ä' => 'a', 'å' => 'a', 'æ' => 'ae', 'ç' => 'c', 'è' => 'e',
|
81
|
+
'é' => 'e', 'ê' => 'e', 'ë' => 'e', 'ì' => 'i', 'í' => 'i', 'î' => 'i',
|
82
|
+
'ï' => 'i', 'ð' => 'd', 'ñ' => 'n', 'ò' => 'o', 'ó' => 'o', 'ô' => 'o',
|
83
|
+
'õ' => 'o', 'ö' => 'o', 'ø' => 'o', 'ù' => 'u', 'ú' => 'u', 'û' => 'u',
|
84
|
+
'ü' => 'u', 'ý' => 'y', 'þ' => 'th', 'ÿ' => 'y', 'Ā' => 'A', 'ā' => 'a',
|
85
|
+
'Ă' => 'A', 'ă' => 'a', 'Ą' => 'A', 'ą' => 'a', 'Ć' => 'C', 'ć' => 'c',
|
86
|
+
'Ĉ' => 'C', 'ĉ' => 'c', 'Ċ' => 'C', 'ċ' => 'c', 'Č' => 'C', 'č' => 'c',
|
87
|
+
'Ď' => 'D', 'ď' => 'd', 'Đ' => 'D', 'đ' => 'd', 'Ē' => 'E', 'ē' => 'e',
|
88
|
+
'Ĕ' => 'E', 'ĕ' => 'e', 'Ė' => 'E', 'ė' => 'e', 'Ę' => 'E', 'ę' => 'e',
|
89
|
+
'Ě' => 'E', 'ě' => 'e', 'ệ' => 'e', 'Ĝ' => 'G', 'ĝ' => 'g', 'Ğ' => 'G',
|
90
|
+
'ğ' => 'g', 'Ġ' => 'G', 'ġ' => 'g', 'Ģ' => 'G', 'ģ' => 'g', 'Ĥ' => 'H',
|
91
|
+
'ĥ' => 'h', 'Ħ' => 'H', 'ħ' => 'h', 'Ĩ' => 'I', 'ĩ' => 'i', 'Ī' => 'I',
|
92
|
+
'ī' => 'i', 'Ĭ' => 'I', 'ĭ' => 'i', 'Į' => 'I', 'į' => 'i', 'İ' => 'I',
|
93
|
+
'ı' => 'i', 'IJ' => 'IJ', 'ij' => 'ij', 'Ĵ' => 'J', 'ĵ' => 'j',
|
94
|
+
'Ķ' => 'K', 'ķ' => 'k', 'ĸ' => 'k', 'Ĺ' => 'L', 'ĺ' => 'l', 'Ļ' => 'L',
|
95
|
+
'ļ' => 'l', 'Ľ' => 'L', 'ľ' => 'l', 'Ŀ' => 'L', 'ŀ' => 'l', 'Ł' => 'L',
|
96
|
+
'ł' => 'l', 'Ń' => 'N', 'ń' => 'n', 'Ņ' => 'N', 'ņ' => 'n', 'Ň' => 'N',
|
97
|
+
'ň' => 'n', 'ʼn' => "'n", 'Ŋ' => 'NG', 'ŋ' => 'ng', 'Ō' => 'O',
|
98
|
+
'ō' => 'o', 'Ŏ' => 'O', 'ŏ' => 'o', 'Ő' => 'O', 'ő' => 'o', 'Œ' => 'OE',
|
99
|
+
'œ' => 'oe', 'Ŕ' => 'R', 'ŕ' => 'r', 'Ŗ' => 'R', 'ŗ' => 'r', 'Ř' => 'R',
|
100
|
+
'ř' => 'r', 'Ś' => 'S', 'ś' => 's', 'Ŝ' => 'S', 'ŝ' => 's', 'Ş' => 'S',
|
101
|
+
'ş' => 's', 'Š' => 'S', 'š' => 's', 'Ţ' => 'T', 'ţ' => 't', 'Ť' => 'T',
|
102
|
+
'ť' => 't', 'Ŧ' => 'T', 'ŧ' => 't', 'Ũ' => 'U', 'ũ' => 'u', 'Ū' => 'U',
|
103
|
+
'ū' => 'u', 'Ŭ' => 'U', 'ŭ' => 'u', 'Ů' => 'U', 'ů' => 'u', 'Ű' => 'U',
|
104
|
+
'ű' => 'u', 'Ų' => 'U', 'ų' => 'u', 'Ŵ' => 'W', 'ŵ' => 'w', 'Ŷ' => 'Y',
|
105
|
+
'ŷ' => 'y', 'Ÿ' => 'Y', 'Ź' => 'Z', 'ź' => 'z', 'Ż' => 'Z', 'ż' => 'z',
|
106
|
+
'Ž' => 'Z', 'ž' => 'z'
|
107
|
+
}.freeze
|
108
|
+
|
109
|
+
def transliterate(string, fallback: '')
|
110
|
+
string.gsub(/[^\x00-\x7f]/u) do |char|
|
111
|
+
DEFAULT_CHAR_APPROXIMATIONS[char] || fallback
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
def parameterize(string, separator: '_')
|
116
|
+
# Normalize into ASCII.
|
117
|
+
param = transliterate(string)
|
118
|
+
|
119
|
+
# Remove unwanted chars by turning them into the separator.
|
120
|
+
param.gsub!(/[^a-z0-9\-_]+/i, separator)
|
121
|
+
|
122
|
+
# Only one separator at a time.
|
123
|
+
param.gsub!(/#{separator}{2,}/, separator)
|
124
|
+
|
125
|
+
# No leading/trailing separators.
|
126
|
+
param.gsub(/^#{separator}|#{separator}$/i, '')
|
127
|
+
end
|
128
|
+
|
70
129
|
# :startdoc:
|
71
130
|
end
|
72
131
|
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.1'
|
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'
|