petrarca 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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e588fc804e558ead549eeb33f9eeecf157c2d0652927a8ec8057f0057400f932
4
- data.tar.gz: e25faf3cf900c1ced7f34884e347c21b3094db97e3ad49640ed8a721c07dc376
3
+ metadata.gz: cf5f21fb7dd10bb65123ae526db409663c9ef3c2967268fb4f4839996aa97cc9
4
+ data.tar.gz: 9e0abbe048c5b96d02bfa407981738cf3e9fe74704e8713263120725a97b86d3
5
5
  SHA512:
6
- metadata.gz: 4c0add5276c9ab9f1c1babae1d7838771eaf693eda6acf6840fb5c94e78fc85ac70b2e659db2c37e1afa8757f4cba205120f7687385e3406c8b44127dfbd8ce7
7
- data.tar.gz: 0efc1a6cdda198cec9799242a976fc5403d9374ec54237027133d181507e79c933606fcba37d11214d712c7fc79748fd664d54bc385f5a44a0868cbc2fa7d136
6
+ metadata.gz: 1df099128e166619d892ed2700267f3255bb555ef0aaab62ae652d9f6e42258b79b80d9d81b9e8e6b1a8c8b09a4c6b83e6464e20022e231bbbf4b0e19f369f50
7
+ data.tar.gz: d3e276b38b978639f91be5bbd766279ca305e7d4fc822a96ae1559046c476c4efcee9636a8ce0038048f604bb62b05c5e65794f2c67262feb414140f9a227875
data/.gitignore CHANGED
@@ -9,3 +9,4 @@
9
9
  /vendor/
10
10
  /Gemfile.lock
11
11
  *.txt
12
+ *.xml
data/README.md CHANGED
@@ -9,7 +9,8 @@ This library Petrarca provides some utility functions to manipulate ISBN numbers
9
9
 
10
10
  All functions support both ISBN-13 and ISBN-10.
11
11
 
12
- Note: Only registrant ranges for Japan are currently supported.
12
+ All ranges of registration groups and registrants are supported.
13
+ Those depends on 'RangeMessage.xml' file, downloaded from [International ISBN Agency](https://www.isbn-international.org/range_file_generation).
13
14
 
14
15
  ## Installation
15
16
 
data/Rakefile CHANGED
@@ -1,2 +1,9 @@
1
1
  require "bundler/gem_tasks"
2
2
  task :default => :spec
3
+
4
+ namespace :range do
5
+ desc "Generate registrant range files"
6
+ task :generate do
7
+ ruby "scripts/generate_range_files.rb --dir data"
8
+ end
9
+ end
@@ -22,7 +22,7 @@ module Petrarca
22
22
  f.each_line do |line|
23
23
  next if line.start_with?("#")
24
24
  g, r = line.chomp.split(":")
25
- ranges[g] = r.split(",")
25
+ ranges[g] = r.split(",") unless r.nil?
26
26
  end
27
27
  end
28
28
  ranges
@@ -1,3 +1,3 @@
1
1
  module Petrarca
2
- VERSION = "0.3.0"
2
+ VERSION = "0.4.0"
3
3
  end
@@ -40,4 +40,5 @@ Gem::Specification.new do |spec|
40
40
  spec.add_development_dependency "bundler", "~> 2.0"
41
41
  spec.add_development_dependency "rake", "~> 10.0"
42
42
  spec.add_development_dependency "rspec", ">= 3.0.0"
43
+ spec.add_development_dependency "nokogiri"
43
44
  end
@@ -0,0 +1,82 @@
1
+ # encoding: utf-8
2
+
3
+ require "nokogiri"
4
+ require "optparse"
5
+
6
+
7
+ RANGE_MESSAGE_FILE = "RangeMessage.xml"
8
+ REGISTRATION_GROUP_RANGES_FILE = "registration_group_ranges.txt"
9
+ REGISTRANT_RANGES_FILE = "registrant_ranges.txt"
10
+
11
+
12
+ def main
13
+ options = {
14
+ dir: "."
15
+ }
16
+ opts = OptionParser.new
17
+ opts.on("-d", "--dir=DIR", String, "Set directory, output range fiels into."){|v|
18
+ options[:dir] = v
19
+ }
20
+ opts.parse!
21
+
22
+ doc = File.open(RANGE_MESSAGE_FILE, "r"){|f| Nokogiri::XML(f) }
23
+
24
+ metadata = {
25
+ source: doc.xpath("//MessageSource").text,
26
+ date: doc.xpath("//MessageDate").text
27
+ }
28
+
29
+ registration_groups = extract_ranges(doc.xpath("//EAN.UCC"))
30
+ registrants = extract_ranges(doc.xpath("//Group"))
31
+
32
+ output_range_file(
33
+ registration_groups,
34
+ File.join(options[:dir], REGISTRATION_GROUP_RANGES_FILE),
35
+ metadata
36
+ )
37
+ output_range_file(
38
+ registrants,
39
+ File.join(options[:dir], REGISTRANT_RANGES_FILE),
40
+ metadata
41
+ )
42
+ end
43
+
44
+ def extract_ranges(nodes)
45
+ nodes.map do |node|
46
+ prefix = node.xpath("Prefix").text
47
+ agency = node.xpath("Agency").text
48
+ ranges = node.xpath("Rules/Rule").map do |rule|
49
+ length = rule.xpath("Length").text.to_i
50
+ range = if length > 0
51
+ rule.xpath("Range").text.split("-").map{|s| s[0, length] }.join("-")
52
+ else
53
+ nil
54
+ end
55
+ range
56
+ end.compact
57
+ {
58
+ "prefix" => prefix,
59
+ "agency" => agency,
60
+ "ranges" => ranges
61
+ }
62
+ end
63
+ end
64
+
65
+ def output_range_file(ranges, range_file, metadata)
66
+ File.open(range_file, "w") do |f|
67
+ f.puts "# Generated from RangeMessage.xml file, downloaded from https://www.isbn-international.org/range_file_generation."
68
+ f.puts "#"
69
+ f.puts "# " + metadata[:source]
70
+ f.puts "# " + metadata[:date]
71
+ f.puts "#"
72
+ ranges.each do |range|
73
+ f.puts "# " + range["agency"]
74
+ f.puts range["prefix"] + ":" + range["ranges"].join(",")
75
+ end
76
+ end
77
+ $stderr.puts "Generated: #{range_file}"
78
+ end
79
+
80
+
81
+
82
+ main
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.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - takatoh
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-09-04 00:00:00.000000000 Z
11
+ date: 2020-09-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: 3.0.0
55
+ - !ruby/object:Gem::Dependency
56
+ name: nokogiri
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
55
69
  description: Library to manipulate ISBN numbers for Ruby.
56
70
  email:
57
71
  - takatoh.m@gmail.com
@@ -75,6 +89,7 @@ files:
75
89
  - lib/petrarca/isbn13.rb
76
90
  - lib/petrarca/version.rb
77
91
  - petrarca.gemspec
92
+ - scripts/generate_range_files.rb
78
93
  homepage: https://github.com/takatoh/Petrarca
79
94
  licenses:
80
95
  - MIT