petrarca 0.4.13 → 0.5.1
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/README.md +23 -1
- data/data/registrant_ranges.txt +16 -10
- 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: 0ab4ba09871791640cb9f9bffbd19d2f5a6a12f582b5e7d68757bdead9789128
|
|
4
|
+
data.tar.gz: 39db2ae7f09275b01f5b3400b33428389086fea36eaf4743074dfd9ca0af65a9
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: aba9bb0617f5e85d03e60c8e7137c59fb315303e3275adcb98109662a21bc3cc45816f5e315fe7641194a3f3794e8982636040c91f644e885217194919890f1a
|
|
7
|
+
data.tar.gz: 671dfaece75762853fb12109bd8204b2927688dde606273b839d645430790436a751bf6639edb0e523cef0d2c6dabeaaa43b744e389d82c9e5d9d90eb00ff19d
|
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 June 11, 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
|
+
# Sat, 11 Jun 2022 03:56:52 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,11 +58,11 @@
|
|
|
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
|
|
65
|
-
978-624:00-04,200-249,5000-
|
|
65
|
+
978-624:00-04,200-249,5000-6349,94500-99999
|
|
66
66
|
# Turkey
|
|
67
67
|
978-625:00-00,400-442,44300-44499,445-449,7000-7793,77940-77949,7795-8499
|
|
68
68
|
# Taiwan
|
|
@@ -70,7 +70,7 @@
|
|
|
70
70
|
# Pakistan
|
|
71
71
|
978-627:30-31,500-524,7500-7999
|
|
72
72
|
# Colombia
|
|
73
|
-
978-628:00-09,500-549,7500-8499
|
|
73
|
+
978-628:00-09,500-549,7500-8499,95000-99999
|
|
74
74
|
# Malaysia
|
|
75
75
|
978-629:00-02,470-499,7500-7999,96500-99999
|
|
76
76
|
# Romania
|
|
@@ -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,9850-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
|
|
@@ -438,7 +440,7 @@
|
|
|
438
440
|
# Eritrea
|
|
439
441
|
978-99948:0-4,50-79,800-999
|
|
440
442
|
# Mauritius
|
|
441
|
-
978-99949:0-1,20-
|
|
443
|
+
978-99949:0-1,20-79,8-8,900-999
|
|
442
444
|
# Cambodia
|
|
443
445
|
978-99950:0-4,50-79,800-999
|
|
444
446
|
# Reserved Agency
|
|
@@ -478,7 +480,7 @@
|
|
|
478
480
|
# Botswana
|
|
479
481
|
978-99968:0-3,400-599,60-89,900-999
|
|
480
482
|
# Oman
|
|
481
|
-
978-99969:0-4,50-79,800-
|
|
483
|
+
978-99969:0-4,50-79,800-949,95-99
|
|
482
484
|
# Haiti
|
|
483
485
|
978-99970:0-4,50-89,900-999
|
|
484
486
|
# Myanmar
|
|
@@ -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,10 @@
|
|
|
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
|
|
522
|
+
# Ethiopia
|
|
523
|
+
978-99990:0-0,50-54,975-999
|
|
518
524
|
# France
|
|
519
525
|
979-10:00-19,200-699,7000-8999,90000-97599,976000-999999
|
|
520
526
|
# Korea, Republic
|
|
@@ -522,4 +528,4 @@
|
|
|
522
528
|
# Italy
|
|
523
529
|
979-12:200-299,5450-5999,80000-84999
|
|
524
530
|
# United States
|
|
525
|
-
979-8:200-219,4000-
|
|
531
|
+
979-8:200-219,3500-3999,4000-8499,8500-8849,88500-89999,9850000-9869999
|
|
@@ -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
|
+
# Sat, 11 Jun 2022 03:56:52 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.1
|
|
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-06-11 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: bundler
|