petrarca 0.4.14 → 0.5.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +23 -1
- data/data/registrant_ranges.txt +13 -9
- data/data/registration_group_ranges.txt +1 -1
- data/lib/petrarca/helpers.rb +34 -2
- data/lib/petrarca/isbn10.rb +13 -5
- data/lib/petrarca/isbn13.rb +13 -10
- data/lib/petrarca/version.rb +1 -1
- data/lib/petrarca.rb +3 -3
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1c7dd922e92b20bfdb753eabea5ed5ebc5a17047a28a2e9b626196922f5dc1be
|
4
|
+
data.tar.gz: 2459dd81b3d7c31acd1a5e5763e82d870e2e399f9580e445dec0c37b364ac0ab
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5ad250d61d24ab92931600c04e2027370d61c9da1358459fb5ee1aebfdcbb9515b6dd4fe1dda024c46a261e8469d01c33bd7a6d6f0a2d045bf8c10d4e589715b
|
7
|
+
data.tar.gz: 955ad99e4add12f5e4d437f6abae2d1f8fe3be64729b8213e2dd29cb9e20f43b43bb43b9573e77e9a7462b0b818a7217bcc4e07a658a7b7aca501f1e365df4af
|
data/README.md
CHANGED
@@ -12,7 +12,7 @@ All functions support both ISBN-13 and ISBN-10.
|
|
12
12
|
All ranges of registration groups and registrants are supported.
|
13
13
|
Those depends on 'RangeMessage.xml' file, downloaded from [International ISBN Agency](https://www.isbn-international.org/range_file_generation).
|
14
14
|
|
15
|
-
NOTE: Updated range files to latest version on
|
15
|
+
NOTE: Updated range files to latest version on August 12, 2022.
|
16
16
|
|
17
17
|
## Installation
|
18
18
|
|
@@ -45,6 +45,28 @@ Or install it yourself as:
|
|
45
45
|
irb(main):006:0> Petrarca.hyphenate("9784815606442")
|
46
46
|
=> "978-4-8156-0644-2"
|
47
47
|
|
48
|
+
SINCE v0.5.0
|
49
|
+
|
50
|
+
Accept Integer as ISBN, only if no `-` and `X` including.
|
51
|
+
|
52
|
+
irb(main):001:0> require 'petrarca'
|
53
|
+
=> true
|
54
|
+
irb(main):002:0> Petrarca.calc_check_digit(978481560644)
|
55
|
+
=> "2"
|
56
|
+
irb(main):003:0> Petrarca.to_10(9784815606442)
|
57
|
+
=> "4-8156-0644-7"
|
58
|
+
irb(main):004:0> Petrarca.to_13(4815606447)
|
59
|
+
=> "978-4-8156-0644-2"
|
60
|
+
irb(main):005:0> Petrarca.hyphenate(9784815606442)
|
61
|
+
=> "978-4-8156-0644-2"
|
62
|
+
|
63
|
+
If the ISBN is hyphenated, consider registration group and registrant in `Petrarca.valid?`. The second example below has the invalid registrant.
|
64
|
+
|
65
|
+
irb(main):006:0> Petrarca.valid?("978-4-8156-0644-2")
|
66
|
+
=> true
|
67
|
+
irb(main):007:0> Petrarca.valid?("978-4-815-60644-2")
|
68
|
+
=> false
|
69
|
+
|
48
70
|
## License
|
49
71
|
|
50
72
|
MIT License
|
data/data/registrant_ranges.txt
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# Generated from RangeMessage.xml file, downloaded from https://www.isbn-international.org/range_file_generation.
|
2
2
|
#
|
3
3
|
# International ISBN Agency
|
4
|
-
#
|
4
|
+
# Fri, 12 Aug 2022 04:58:16 BST
|
5
5
|
#
|
6
6
|
# English language
|
7
7
|
978-0:00-19,200-227,2280-2289,229-368,3690-3699,370-638,6390-6397,6398000-6399999,640-644,6450000-6459999,646-647,6480000-6489999,649-654,6550-6559,656-699,7000-8499,85000-89999,900000-949999,9500000-9999999
|
@@ -58,7 +58,7 @@
|
|
58
58
|
# Philippines
|
59
59
|
978-621:00-29,400-599,8000-8999,95000-99999
|
60
60
|
# Iran
|
61
|
-
978-622:00-10,200-
|
61
|
+
978-622:00-10,200-374,5200-7999,92500-99999
|
62
62
|
# Indonesia
|
63
63
|
978-623:00-09,200-499,5250-7999,88000-99999
|
64
64
|
# Sri Lanka
|
@@ -166,7 +166,7 @@
|
|
166
166
|
# Egypt
|
167
167
|
978-977:00-19,200-499,5000-6999,700-849,85000-89999,90-98,990-999
|
168
168
|
# Nigeria
|
169
|
-
978-978:000-199,2000-2999,30000-
|
169
|
+
978-978:000-199,2000-2999,30000-78999,790-799,8000-8999,900-999
|
170
170
|
# Indonesia
|
171
171
|
978-979:000-099,1000-1499,15000-19999,20-29,3000-3999,400-799,8000-9499,95000-99999
|
172
172
|
# Venezuela
|
@@ -189,16 +189,18 @@
|
|
189
189
|
978-988:00-11,12000-19999,200-739,74000-76999,77000-79999,8000-9699,97000-99999
|
190
190
|
# Portugal
|
191
191
|
978-989:0-1,20-34,35000-36999,37-52,53000-54999,550-799,8000-9499,95000-99999
|
192
|
+
# Montenegro
|
193
|
+
978-9911:20-24,550-749
|
192
194
|
# Tanzania
|
193
195
|
978-9912:40-44,750-799,9850-9999
|
194
196
|
# Uganda
|
195
197
|
978-9913:00-04,600-649,9800-9999
|
196
198
|
# Kenya
|
197
|
-
978-9914:40-
|
199
|
+
978-9914:40-49,700-749,9600-9999
|
198
200
|
# Uruguay
|
199
201
|
978-9915:40-59,650-799,9300-9999
|
200
202
|
# Estonia
|
201
|
-
978-9916:0-0,10-39,4-
|
203
|
+
978-9916:0-0,10-39,4-5,600-749,9500-9999
|
202
204
|
# Bolivia
|
203
205
|
978-9917:0-0,30-34,600-699,9800-9999
|
204
206
|
# Malta
|
@@ -206,7 +208,7 @@
|
|
206
208
|
# Mongolia
|
207
209
|
978-9919:20-27,500-599,9500-9999
|
208
210
|
# Morocco
|
209
|
-
978-9920:30-
|
211
|
+
978-9920:30-41,500-799,8750-9999
|
210
212
|
# Kuwait
|
211
213
|
978-9921:0-0,30-39,700-899,9700-9999
|
212
214
|
# Iraq
|
@@ -228,7 +230,7 @@
|
|
228
230
|
# Costa Rica
|
229
231
|
978-9930:00-49,500-939,9400-9999
|
230
232
|
# Algeria
|
231
|
-
978-9931:00-
|
233
|
+
978-9931:00-23,240-249,2500-2599,260-899,9000-9999
|
232
234
|
# Lao People's Democratic Republic
|
233
235
|
978-9932:00-39,400-849,8500-9999
|
234
236
|
# Syria
|
@@ -492,7 +494,7 @@
|
|
492
494
|
# Tajikistan
|
493
495
|
978-99975:0-2,300-399,40-79,800-999
|
494
496
|
# Srpska, Republic of
|
495
|
-
978-99976:0-
|
497
|
+
978-99976:0-0,10-15,160-199,20-59,600-799,85-89,900-999
|
496
498
|
# Rwanda
|
497
499
|
978-99977:0-1,40-69,700-799,995-999
|
498
500
|
# Mongolia
|
@@ -515,6 +517,8 @@
|
|
515
517
|
978-99987:850-999
|
516
518
|
# Sudan
|
517
519
|
978-99988:0-0,50-54,800-824
|
520
|
+
# Paraguay
|
521
|
+
978-99989:0-0,50-64,900-999
|
518
522
|
# Ethiopia
|
519
523
|
978-99990:0-0,50-54,975-999
|
520
524
|
# France
|
@@ -524,4 +528,4 @@
|
|
524
528
|
# Italy
|
525
529
|
979-12:200-299,5450-5999,80000-84999
|
526
530
|
# United States
|
527
|
-
979-8:200-
|
531
|
+
979-8:200-229,3500-3999,4000-8499,8500-8849,88500-89999,9850000-9899999
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# Generated from RangeMessage.xml file, downloaded from https://www.isbn-international.org/range_file_generation.
|
2
2
|
#
|
3
3
|
# International ISBN Agency
|
4
|
-
#
|
4
|
+
# Fri, 12 Aug 2022 04:58:16 BST
|
5
5
|
#
|
6
6
|
# International ISBN Agency
|
7
7
|
978:0-5,600-649,65-65,7-7,80-94,950-989,9900-9989,99900-99999
|
data/lib/petrarca/helpers.rb
CHANGED
@@ -1,10 +1,37 @@
|
|
1
1
|
module Petrarca
|
2
|
+
|
3
|
+
class InvalidEANPrefixError < StandardError; end
|
4
|
+
class InvalidRangeError < StandardError; end
|
5
|
+
|
2
6
|
module Helpers
|
3
7
|
|
4
8
|
extend self
|
5
9
|
|
10
|
+
def split(isbn)
|
11
|
+
isbn = isbn.to_s.delete("-")
|
12
|
+
ean_prefix = isbn[0, 3]
|
13
|
+
unless ean_prefix == "978" || ean_prefix == "979"
|
14
|
+
raise InvalidEANPrefixError.new("Invalid EAN prefix: #{ean_prefix}")
|
15
|
+
end
|
16
|
+
body = isbn[3, 9]
|
17
|
+
check_digit = isbn[12, 1]
|
18
|
+
begin
|
19
|
+
registration_group, body = Helpers.split_to_parts(body, REGISTRATION_GROUP_RANGES[ean_prefix])
|
20
|
+
rescue InvalidRangeError
|
21
|
+
raise InvalidRangeError.new("Registration group is not defined: #{body} (under #{ean_prefix})")
|
22
|
+
end
|
23
|
+
prefix = "#{ean_prefix}-#{registration_group}"
|
24
|
+
begin
|
25
|
+
registrant, publication = Helpers.split_to_parts(body, REGISTRANT_RANGES[prefix])
|
26
|
+
rescue InvalidRangeError
|
27
|
+
raise InvalidRangeError.new("Registrant is not defined: #{body} (under #{prefix})")
|
28
|
+
end
|
29
|
+
[ean_prefix, registration_group, registrant, publication, check_digit]
|
30
|
+
end
|
31
|
+
|
32
|
+
|
6
33
|
def split_to_parts(body, ranges)
|
7
|
-
ranges.map do |range_str|
|
34
|
+
parts = ranges.map do |range_str|
|
8
35
|
s, e = range_str.split("-")
|
9
36
|
prefix = body[0, s.size]
|
10
37
|
if Range.new(s.to_i, e.to_i).cover?(prefix.to_i)
|
@@ -12,7 +39,12 @@ module Petrarca
|
|
12
39
|
else
|
13
40
|
nil
|
14
41
|
end
|
15
|
-
end.compact
|
42
|
+
end.compact
|
43
|
+
unless parts.empty?
|
44
|
+
parts.first
|
45
|
+
else
|
46
|
+
raise InvalidRangeError.new(body)
|
47
|
+
end
|
16
48
|
end
|
17
49
|
|
18
50
|
|
data/lib/petrarca/isbn10.rb
CHANGED
@@ -7,16 +7,25 @@ module Petrarca
|
|
7
7
|
extend self
|
8
8
|
|
9
9
|
def valid?(isbn)
|
10
|
-
|
10
|
+
isbn = isbn.to_s
|
11
|
+
if correct_format?(isbn) && isbn[-1] == calc_check_digit(isbn)
|
12
|
+
if isbn.include?("-")
|
13
|
+
Helpers.split("978" + isbn).drop(1) == isbn.split("-")
|
14
|
+
else
|
15
|
+
true
|
16
|
+
end
|
17
|
+
else
|
18
|
+
false
|
19
|
+
end
|
11
20
|
end
|
12
21
|
|
13
22
|
def correct_format?(isbn)
|
14
|
-
isbn = isbn.delete("-")
|
23
|
+
isbn = isbn.to_s.delete("-")
|
15
24
|
!!(/\A\d{9}[0-9X]\z/ =~ isbn)
|
16
25
|
end
|
17
26
|
|
18
27
|
def calc_check_digit(isbn)
|
19
|
-
nums = isbn.delete("-").split("")[0, 9].map{|x| x.to_i }
|
28
|
+
nums = isbn.to_s.delete("-").split("")[0, 9].map{|x| x.to_i }
|
20
29
|
sum = nums.zip((2..10).to_a.reverse).map{|x, y| x * y }.inject(:+)
|
21
30
|
check_digit = 11 - (sum % 11)
|
22
31
|
case check_digit
|
@@ -30,8 +39,7 @@ module Petrarca
|
|
30
39
|
end
|
31
40
|
|
32
41
|
def hyphenate(isbn)
|
33
|
-
|
34
|
-
s.sub(/^978-/, "")
|
42
|
+
Helpers.split("978" + isbn.to_s).drop(1).join("-")
|
35
43
|
end
|
36
44
|
|
37
45
|
end
|
data/lib/petrarca/isbn13.rb
CHANGED
@@ -7,29 +7,32 @@ module Petrarca
|
|
7
7
|
extend self
|
8
8
|
|
9
9
|
def valid?(isbn)
|
10
|
-
|
10
|
+
isbn = isbn.to_s
|
11
|
+
if correct_format?(isbn) && isbn[-1] == calc_check_digit(isbn)
|
12
|
+
if isbn.include?("-")
|
13
|
+
Helpers.split(isbn) == isbn.split("-")
|
14
|
+
else
|
15
|
+
true
|
16
|
+
end
|
17
|
+
else
|
18
|
+
false
|
19
|
+
end
|
11
20
|
end
|
12
21
|
|
13
22
|
def correct_format?(isbn)
|
14
|
-
isbn = isbn.delete("-")
|
23
|
+
isbn = isbn.to_s.delete("-")
|
15
24
|
!!(/\A97[89]\d{9}\d\z/ =~ isbn)
|
16
25
|
end
|
17
26
|
|
18
27
|
def calc_check_digit(isbn)
|
19
|
-
nums = isbn.delete("-").split("")[0, 12].map{|x| x.to_i }
|
28
|
+
nums = isbn.to_s.delete("-").split("")[0, 12].map{|x| x.to_i }
|
20
29
|
sum = nums.zip([1, 3] * 6).map{|x, y| x * y }.inject(:+)
|
21
30
|
check_digit = 10 - (sum % 10)
|
22
31
|
check_digit == 10 ? "0" : check_digit.to_s
|
23
32
|
end
|
24
33
|
|
25
34
|
def hyphenate(isbn)
|
26
|
-
|
27
|
-
body = isbn[3, 9]
|
28
|
-
check_digit = isbn[12, 1]
|
29
|
-
registration_group, body = Helpers.split_to_parts(body, REGISTRATION_GROUP_RANGES[ean_prefix])
|
30
|
-
prefix = "#{ean_prefix}-#{registration_group}"
|
31
|
-
registrant, publication = Helpers.split_to_parts(body, REGISTRANT_RANGES[prefix])
|
32
|
-
[ean_prefix, registration_group, registrant, publication, check_digit].join("-")
|
35
|
+
Helpers.split(isbn).join("-")
|
33
36
|
end
|
34
37
|
|
35
38
|
end
|
data/lib/petrarca/version.rb
CHANGED
data/lib/petrarca.rb
CHANGED
@@ -15,7 +15,7 @@ module Petrarca
|
|
15
15
|
extend self
|
16
16
|
|
17
17
|
def valid?(isbn)
|
18
|
-
case isbn.delete("-").size
|
18
|
+
case isbn.to_s.delete("-").size
|
19
19
|
when 13
|
20
20
|
ISBN13.valid?(isbn)
|
21
21
|
when 10
|
@@ -26,7 +26,7 @@ module Petrarca
|
|
26
26
|
end
|
27
27
|
|
28
28
|
def correct_format?(isbn)
|
29
|
-
case isbn.delete("-").size
|
29
|
+
case isbn.to_s.delete("-").size
|
30
30
|
when 13
|
31
31
|
ISBN13.correct_format?(isbn)
|
32
32
|
when 10
|
@@ -37,7 +37,7 @@ module Petrarca
|
|
37
37
|
end
|
38
38
|
|
39
39
|
def calc_check_digit(isbn)
|
40
|
-
isbn = isbn.delete("-")
|
40
|
+
isbn = isbn.to_s.delete("-")
|
41
41
|
case isbn.size
|
42
42
|
when 12, 13
|
43
43
|
ISBN13.calc_check_digit(isbn)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: petrarca
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- takatoh
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-08-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|