epub-cfi 0.1.2 → 0.1.4

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c7bd4bcf31dae58b934393de702fb036186b950bbeb72d065931d0406506c2be
4
- data.tar.gz: 5820d5272ed8c29790c69e959c1e4b140eae9e567182b2c5929dbbcff41efc0e
3
+ metadata.gz: cdf83e8e0bf1372467809ca0fbacdba9359e5fb9a55bcd6381b32a3e54f54b69
4
+ data.tar.gz: f812252ca173657a1f36a8ea986040540e5207e5bfdb24a53607974c67b4a55f
5
5
  SHA512:
6
- metadata.gz: 83d606fc2a8321349c6b055df31610bbc384b7c42e620ee01ec6b1461b2c6a51534327c70442894a70f8faf6c0cee0a0506e84b55c5765a25a97d2ae6548ac7e
7
- data.tar.gz: 8b950b018d6bde45b2c1107ab2c19048c4e05e06cc49c4cd59c4c77a5b4b706228bc2268b65eebbb91314a51104b5fa48ddf5371c202c187bda1faf023fbccab
6
+ metadata.gz: b622f524b56193a6b49119ec8abd1ffa9d789bb8a4d5c0a653d10cf5fe6830d8f8c643a6c618cfb1a3b63f2141e644b3d2df92ae599e56cf31ad7f0bf47f494c
7
+ data.tar.gz: b5666e05f99b2072e8e4c47097eb87a5b3070a585b5489fb4f5be089ed3380008ed0d41ccc859cc959a7471d49db0e587f10a71b84b5ec7b4d6f34d4270eb2c5
data/.gitlab-ci.yml CHANGED
@@ -1,24 +1,29 @@
1
1
  before_script:
2
2
  - ruby -v
3
3
  - which ruby
4
- - gem install --no-document racc rake rubygems-tasks yard test-unit test-unit-notify pretty_backtrace simplecov
4
+ - gem install --no-document racc rake rubygems-tasks yard test-unit test-unit-notify simplecov steep
5
5
 
6
- test:2.3:
7
- image: ruby:2.3
6
+ test:3.0:
7
+ image: ruby:3.0
8
8
  script:
9
9
  rake test
10
10
 
11
- test:2.4:
12
- image: ruby:2.4
11
+ test:3.1:
12
+ image: ruby:3.1
13
13
  script:
14
14
  rake test
15
15
 
16
- test:2.5:
17
- image: ruby:2.5
16
+ test:3.2:
17
+ image: ruby:3.2
18
18
  script:
19
- rake test
19
+ rake test typecheck
20
20
 
21
- test:2.6:
22
- image: ruby:2.6
21
+ test:3.3:
22
+ image: ruby:3.3
23
23
  script:
24
- rake test
24
+ rake test typecheck
25
+
26
+ test:3.4:
27
+ image: ruby:3.4
28
+ script:
29
+ rake test typecheck
data/ChangeLog.adoc CHANGED
@@ -1,3 +1,15 @@
1
+ === 0.1.4 / 2025-10-28
2
+
3
+ * Remove `NonEmptyArray` from signature
4
+ * Build parser table on installation
5
+
6
+ === 0.1.3 / 2023-12-28
7
+
8
+ * Suppress warning on unused variable
9
+ * Include RBS file
10
+ * [BUG FIX]Include strscan
11
+ * Add Racc to runtime dependencies
12
+
1
13
  === 0.1.2 / 2019-05-19
2
14
 
3
15
  * Scan CFI string on demand to reduce memory footprint
data/Rakefile CHANGED
@@ -1,27 +1,33 @@
1
1
  # encoding: utf-8
2
2
  require 'rake'
3
3
 
4
- task :default => "lib/epub/cfi/parser.tab.rb"
4
+ task :default => [:test, :typecheck]
5
+
6
+ TARGET = "lib/epub/cfi/parser.tab.rb"
5
7
 
6
8
  desc "Build EPUB CFI parser"
7
- file "lib/epub/cfi/parser.tab.rb" => "lib/epub/cfi/parser.y" do |task|
8
- sh "racc #{task.source}"
9
+ file TARGET => "lib/epub/cfi/parser.y" do |task|
10
+ sh "racc", task.source
9
11
  end
10
12
 
11
13
  require "rake/clean"
12
- CLOBBER.include "lib/epub/cfi/parser.tab.rb"
14
+ CLOBBER.include TARGET
13
15
 
14
16
  require 'rubygems/tasks'
15
17
  Gem::Tasks.new
16
- task :build => "lib/epub/cfi/parser.tab.rb"
17
18
 
18
19
  require 'rake/testtask'
19
20
  Rake::TestTask.new do |test|
20
21
  test.libs << 'test'
21
- test.pattern = 'test/**/test_*.rb'
22
22
  test.verbose = true
23
23
  end
24
- task :test => "lib/epub/cfi/parser.tab.rb"
24
+ task :test => TARGET
25
25
 
26
26
  require 'yard'
27
27
  YARD::Rake::YardocTask.new
28
+
29
+ require "steep"
30
+ desc "Check type"
31
+ task typecheck: TARGET do
32
+ Steep::Drivers::Check.new(stdout: $stdout, stderr: $stderr).run
33
+ end
data/Steepfile ADDED
@@ -0,0 +1,30 @@
1
+ # D = Steep::Diagnostic
2
+ #
3
+ target :lib do
4
+ signature "sig"
5
+
6
+ check "lib" # Directory name
7
+ # check "Gemfile" # File name
8
+ # check "app/models/**/*.rb" # Glob
9
+ ignore "lib/shims"
10
+
11
+ # library "pathname" # Standard libraries
12
+ # library "strong_json" # Gems
13
+ library "strscan"
14
+
15
+ # configure_code_diagnostics(D::Ruby.default) # `default` diagnostics setting (applies by default)
16
+ # configure_code_diagnostics(D::Ruby.strict) # `strict` diagnostics setting
17
+ # configure_code_diagnostics(D::Ruby.lenient) # `lenient` diagnostics setting
18
+ # configure_code_diagnostics(D::Ruby.silent) # `silent` diagnostics setting
19
+ # configure_code_diagnostics do |hash| # You can setup everything yourself
20
+ # hash[D::Ruby::NoMethod] = :information
21
+ # end
22
+ end
23
+
24
+ target :test do
25
+ signature "sig", "sig-private"
26
+
27
+ check "test"
28
+
29
+ # library "pathname" # Standard libraries
30
+ end
data/epub-cfi.gemspec CHANGED
@@ -9,12 +9,12 @@ Gem::Specification.new do |gem|
9
9
  gem.version = EPUB::CFI::VERSION
10
10
  gem.summary = %q{EPUB CFI parser and builder}
11
11
  gem.description = %q{Parser and builder implementation for EPUB CFI defined at http://www.idpf.org/epub/linking/cfi/}
12
- gem.license = "LGPL"
12
+ gem.license = "LGPL-3.0-or-later"
13
13
  gem.authors = ["KITAITI Makoto"]
14
14
  gem.email = "KitaitiMakoto@gmail.com"
15
15
  gem.homepage = "https://gitlab.com/KitaitiMakoto/epub-cfi"
16
16
 
17
- gem.files = `git ls-files`.split($/) << "lib/epub/cfi/parser.tab.rb"
17
+ gem.files = `git ls-files`.split($/)
18
18
 
19
19
  `git submodule --quiet foreach --recursive pwd`.split($/).each do |submodule|
20
20
  submodule.sub!("#{Dir.pwd}/",'')
@@ -28,13 +28,15 @@ Gem::Specification.new do |gem|
28
28
  gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
29
29
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
30
30
  gem.require_paths = ['lib']
31
+ gem.extensions = ["ext/epub-cfi/Rakefile"]
32
+
33
+ gem.add_runtime_dependency "racc"
31
34
 
32
- gem.add_development_dependency "racc"
33
35
  gem.add_development_dependency 'rake'
34
36
  gem.add_development_dependency 'rubygems-tasks'
35
37
  gem.add_development_dependency 'yard'
36
38
  gem.add_development_dependency "test-unit"
37
39
  gem.add_development_dependency "test-unit-notify"
38
- gem.add_development_dependency "pretty_backtrace"
39
40
  gem.add_development_dependency "simplecov"
41
+ gem.add_development_dependency "steep"
40
42
  end
@@ -0,0 +1,12 @@
1
+ root = File.expand_path("../..", __dir__)
2
+ lib_dir = File.join(root, "lib")
3
+ source = File.join(lib_dir, "epub/cfi/parser.y")
4
+ target = File.join(lib_dir, "epub/cfi/parser.tab.rb")
5
+
6
+ task default: target
7
+
8
+ file target => source do |t|
9
+ Dir.chdir root do
10
+ sh "racc", "lib/epub/cfi/parser.y"
11
+ end
12
+ end
@@ -1,10 +1,13 @@
1
+ require "strscan"
1
2
  require "epub/cfi/parser.tab"
2
3
 
3
4
  class EPUB::CFI::Parser
4
5
  include Comparable
5
6
 
6
7
  UNICODE_CHARACTER_EXCLUDING_SPECIAL_CHARS_AND_SPACE_AND_DOT_AND_COLON_AND_TILDE_AND_ATMARK_AND_SOLIDUS_AND_EXCLAMATION_MARK_PATTERN = /\u0009|\u000A|\u000D|[\u0022-\u0027]|[\u002A-\u002B]|\u002D|[\u0030-\u0039]|\u003C|[\u003E-\u0040]|[\u0041-\u005A]|\u005C|[\u005F-\u007D]|[\u007F-\uD7FF]|[\uE000-\uFFFD]|[\u10000-\u10FFFF]/ # excluding special chars and space(\u0020) and dot(\u002E) and colon(\u003A) and tilde(\u007E) and atmark(\u0040) and solidus(\u002F) and exclamation mark(\u0021)
7
- UNICODE_CHARACTER_PATTERN = Regexp.union(UNICODE_CHARACTER_EXCLUDING_SPECIAL_CHARS_AND_SPACE_AND_DOT_AND_COLON_AND_TILDE_AND_ATMARK_AND_SOLIDUS_AND_EXCLAMATION_MARK_PATTERN, Regexp.new(Regexp.escape(EPUB::CFI::SPECIAL_CHARS), / \.:~@!/))
8
+ FRAGMENT_PREFIX = "epubcfi("
9
+ FRAGMENT_PREFIX_LENGTH = FRAGMENT_PREFIX.length
10
+ FRAGMENT_SUFFIX_LENGTH = ")".length
8
11
 
9
12
  class << self
10
13
  def parse(string, debug: $DEBUG)
@@ -18,8 +21,9 @@ class EPUB::CFI::Parser
18
21
  end
19
22
 
20
23
  def parse(string)
21
- if string.start_with? 'epubcfi('
22
- string = string['epubcfi('.length .. -2]
24
+ if string.start_with? FRAGMENT_PREFIX
25
+ string = string[FRAGMENT_PREFIX_LENGTH .. -(FRAGMENT_SUFFIX_LENGTH + 1)]
26
+ # @type var string: String
23
27
  end
24
28
  @scanner = StringScanner.new(string, true)
25
29
  do_parse
@@ -107,7 +111,10 @@ end
107
111
  # @raise [Racc::ParseError] if given string is invalid
108
112
  # @see CFI.parse
109
113
  def EPUB::CFI(string)
110
- string.kind_of?(EPUB::CFI::Location) || string.kind_of?(EPUB::CFI::Range) ?
111
- string :
114
+ case string
115
+ when EPUB::CFI::Location, EPUB::CFI::Range
116
+ string
117
+ else
112
118
  EPUB::CFI.parse(string)
119
+ end
113
120
  end
@@ -15,7 +15,7 @@ rule
15
15
 
16
16
  path : step local_path
17
17
  {
18
- path, redirected_path = *val[1]
18
+ path, _redirected_path = *val[1]
19
19
  path.steps.unshift val[0]
20
20
  result = val[1]
21
21
  }
@@ -18,6 +18,6 @@
18
18
  module EPUB
19
19
  module CFI
20
20
  # epub-cfi version
21
- VERSION = "0.1.2"
21
+ VERSION = "0.1.4"
22
22
  end
23
23
  end
data/lib/epub/cfi.rb CHANGED
@@ -221,7 +221,7 @@ module EPUB
221
221
  end
222
222
 
223
223
  def to_s
224
- return @string_cache if @string_cache
224
+ return @string_cache if @string_cache # @type ivar @string_cache: String
225
225
  string_cache = '['
226
226
  string_cache << CFI.escape(id) if id
227
227
  parameters.each_pair do |key, values|
@@ -242,7 +242,7 @@ module EPUB
242
242
  end
243
243
 
244
244
  def to_s
245
- return @string_cache if @string_cache
245
+ return @string_cache if @string_cache # @type ivar @string_cache: String
246
246
  string_cache = '['
247
247
  string_cache << CFI.escape(preceded) if preceded
248
248
  string_cache << ',' << CFI.escape(followed) if followed
@@ -279,13 +279,13 @@ module EPUB
279
279
  def initialize(temporal=nil, x=nil, y=nil, assertion=nil)
280
280
  raise RangeError, "dimension must be in 0..100 but passed #{x}" unless (0.0..100.0).cover?(x) if x
281
281
  raise RangeError, "dimension must be in 0..100 but passed #{y}" unless (0.0..100.0).cover?(y) if y
282
- warn "Assertion is passed to #{__class__} but cannot know how to handle with it: #{assertion}" if assertion
282
+ warn "Assertion is passed to #{self.class} but cannot know how to handle with it: #{assertion}" if assertion
283
283
  @temporal, @x, @y, @assertion = temporal, x, y, assertion
284
284
  @string_cache = nil
285
285
  end
286
286
 
287
287
  def to_s
288
- return @string_cache if @string_cache
288
+ return @string_cache if @string_cache # @type ivar @string_cache: String
289
289
  string_cache = ''
290
290
  string_cache << "~#{temporal}" if temporal
291
291
  string_cache << "@#{x}:#{y}" if x or y
data/sig/epub-cfi.rbs ADDED
@@ -0,0 +1,125 @@
1
+ # TypeProf 0.21.8
2
+
3
+ # Classes
4
+ module EPUB
5
+ def self.CFI: (String | CFI::Location | CFI::Range) -> (CFI::Location | CFI::Range)
6
+
7
+ module CFI
8
+ VERSION: String
9
+ SPECIAL_CHARS: "^[](),;="
10
+ RE_ESCAPED_SPECIAL_CHARS: String
11
+
12
+ def self.escape: (String string) -> String
13
+ def self.unescape: (String string) -> String
14
+ def self.parse: (String) -> (Location | Range)
15
+
16
+ class Location
17
+ include Comparable
18
+
19
+ attr_reader paths: Array[Path]
20
+ def self.from_parent_and_subpath: (Array[Path] parent_path, (Array[Path]?) subpath) -> Location
21
+ def self.resolve_path: (Array[Path] parent_path, (Array[Path]?) subpath) -> Array[Path]
22
+ def initialize: (?Array[Path] paths) -> void
23
+ def initialize_copy: (self original) -> void
24
+ def <=>: (self other) -> Integer?
25
+ def path_string: -> String
26
+ def to_s: -> String
27
+ def inspect: -> String
28
+ def join: (*Path other_paths) -> Location
29
+ end
30
+
31
+ class Path
32
+ @string_cache: String
33
+
34
+ attr_reader steps: Array[Path | Step]
35
+ attr_reader offset: (CharacterOffset | TemporalSpatialOffset)?
36
+ def initialize: (?Array[Path | Step] steps, ?nil offset) -> void
37
+ def initialize_copy: (self original) -> void
38
+ def to_s: -> String
39
+ def <=>: (self other) -> Integer?
40
+ end
41
+
42
+ class Range < ::Range[Location]
43
+ @string_cache: String
44
+
45
+ attr_accessor parent_path: Location
46
+ attr_accessor start_subpath: String
47
+ attr_accessor end_subpath: String
48
+ def self.from_parent_and_start_and_end: (Array[Path] parent_path, Array[Path] start_subpath, Array[Path] end_subpath) -> Range
49
+ def to_s: -> String
50
+ end
51
+
52
+ class Step
53
+ @string_cache: String?
54
+
55
+ attr_reader value: Integer
56
+ attr_reader assertion: (IDAssertion | String)?
57
+ alias step value
58
+ def initialize: (Integer value, ?(IDAssertion | String)? assertion) -> void
59
+ def initialize_copy: (self original) -> void
60
+ def to_s: -> String
61
+ def <=>: (self other) -> Integer?
62
+ def element?: -> bool
63
+ def character_data?: -> bool
64
+ end
65
+
66
+ class IDAssertion
67
+ @string_cache: String?
68
+
69
+ attr_reader id: String
70
+ attr_reader parameters: Hash[String, [String]]
71
+ def initialize: (String id, ?Hash[String, [String]] parameters) -> void
72
+ def to_s: -> String
73
+ end
74
+
75
+ class TextLocationAssertion
76
+ @string_cache: String?
77
+
78
+ attr_reader preceded: String?
79
+ attr_reader followed: String?
80
+ attr_reader parameters: Hash[String, [String]]
81
+ def initialize: (?String? preceded, ?String? followed, ?Hash[String, [String]] parameters) -> void
82
+ def to_s: -> String
83
+ end
84
+
85
+ class CharacterOffset
86
+ @string_cache: String?
87
+
88
+ attr_reader value: Integer
89
+ attr_reader assertion: TextLocationAssertion?
90
+ alias offset value
91
+ def initialize: (Integer value, ?TextLocationAssertion? assertion) -> void
92
+ def to_s: -> String
93
+ def <=>: (self other) -> Integer?
94
+ end
95
+
96
+ class TemporalSpatialOffset
97
+ @string_cache: String?
98
+
99
+ attr_reader temporal: (Float | Integer)?
100
+ attr_reader x: (Float | Integer)?
101
+ attr_reader y: (Float | Integer)?
102
+ attr_reader assertion: nil
103
+ def initialize: (?(Float | Integer)? temporal, ?(Float | Integer)? x, ?(Float | Integer)? y, ?nil assertion) -> void
104
+ def to_s: -> String
105
+ def <=>: (self other) -> Integer?
106
+ end
107
+
108
+ class Parser < Racc::Parser
109
+ Racc_arg: [[Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer], [Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer], [Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer], [Integer, Integer, Integer, Integer, Integer, Integer, nil, nil, Integer, nil, Integer, nil, Integer, nil, Integer, nil, Integer, nil, nil, nil, Integer, nil, Integer, Integer, Integer, Integer, nil, Integer, nil, Integer, nil, nil, nil, Integer, nil, nil, Integer, nil, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, Integer, nil, Integer, nil, nil, Integer, Integer, nil, nil, Integer, nil, Integer, Integer, Integer, Integer, Integer, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, Integer, Integer, nil, nil, Integer, nil, Integer, nil, Integer, Integer, nil, Integer, nil], [Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, Integer, Integer, nil, nil, nil, Integer, Integer], [Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, Integer, Integer, nil, nil, nil, Integer, Integer], [nil, nil, nil, nil, nil, Integer, nil, Integer, nil, nil, nil, nil, nil, Integer, nil, nil, Integer, nil, nil, nil, nil, Integer, Integer, nil, nil, nil, Integer, nil, nil, Integer, nil, Integer, nil, nil, Integer, Integer, nil, Integer, Integer], [nil, Integer, Integer, Integer, Integer, Integer, Integer, nil, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer, nil, Integer, Integer, Integer, Integer, Integer, Integer, Integer, nil, Integer, Integer, Integer, Integer, Integer, nil, Integer, Integer, nil], Integer, [Integer, Integer, :racc_error, Integer, Integer, :_reduce_1, Integer, Integer, :_reduce_none, Integer, Integer, :_reduce_none, Integer, Integer, :_reduce_4, Integer, Integer, :_reduce_5, Integer, Integer, :_reduce_6, Integer, Integer, :_reduce_7, Integer, Integer, :_reduce_8, Integer, Integer, :_reduce_9, Integer, Integer, :_reduce_10, Integer, Integer, :_reduce_11, Integer, Integer, :_reduce_12, Integer, Integer, :_reduce_13, Integer, Integer, :_reduce_none, Integer, Integer, :_reduce_none, Integer, Integer, :_reduce_16, Integer, Integer, :_reduce_17, Integer, Integer, :_reduce_18, Integer, Integer, :_reduce_none, Integer, Integer, :_reduce_none, Integer, Integer, :_reduce_21, Integer, Integer, :_reduce_22, Integer, Integer, :_reduce_none, Integer, Integer, :_reduce_24, Integer, Integer, :_reduce_25, Integer, Integer, :_reduce_none, Integer, Integer, :_reduce_none, Integer, Integer, :_reduce_28, Integer, Integer, :_reduce_29, Integer, Integer, :_reduce_none, Integer, Integer, :_reduce_31, Integer, Integer, :_reduce_32, Integer, Integer, :_reduce_none, Integer, Integer, :_reduce_none, Integer, Integer, :_reduce_35, Integer, Integer, :_reduce_36, Integer, Integer, :_reduce_37, Integer, Integer, :_reduce_38, Integer, Integer, :_reduce_39, Integer, Integer, :_reduce_40, Integer, Integer, :_reduce_41, Integer, Integer, :_reduce_42, Integer, Integer, :_reduce_43, Integer, Integer, :_reduce_44, Integer, Integer, :_reduce_45, Integer, Integer, :_reduce_46, Integer, Integer, :_reduce_none, Integer, Integer, :_reduce_48, Integer, Integer, :_reduce_49, Integer, Integer, :_reduce_50, Integer, Integer, :_reduce_51, Integer, Integer, :_reduce_52, Integer, Integer, :_reduce_53, Integer, Integer, :_reduce_none, Integer, Integer, :_reduce_none, Integer, Integer, :_reduce_56, Integer, Integer, :_reduce_57, Integer, Integer, :_reduce_none, Integer, Integer, :_reduce_none, Integer, Integer, :_reduce_none, Integer, Integer, :_reduce_none, Integer, Integer, :_reduce_none, Integer, Integer, :_reduce_none, Integer, Integer, :_reduce_none, Integer, Integer, :_reduce_none, Integer, Integer, :_reduce_none, Integer, Integer, :_reduce_none, Integer, Integer, :_reduce_none, Integer, Integer, :_reduce_none, Integer, Integer, :_reduce_none, Integer, Integer, :_reduce_none, Integer, Integer, :_reduce_none, Integer, Integer, :_reduce_none, Integer, Integer, :_reduce_none, Integer, Integer, :_reduce_none, Integer, Integer, :_reduce_none, Integer, Integer, :_reduce_none, Integer, Integer, :_reduce_none, Integer, Integer, :_reduce_none, Integer, Integer, :_reduce_none], Hash[:ATMARK | :CIRCUMFLEX | :CLOSING_PARENTHESIS | :CLOSING_SQUARE_BRACKET | :COLON | :COMMA | :DIGIT_NON_ZERO | :DOT | :EQUAL | :EXCLAMATION_MARK | :OPENING_PARENTHESIS | :OPENING_SQUARE_BRACKET | :SEMICOLON | :SOLIDUS | :SPACE | :TILDE | :UNICODE_CHARACTER_EXCLUDING_SPECIAL_CHARS_AND_SPACE_AND_DOT_AND_COLON_AND_TILDE_AND_ATMARK_AND_SOLIDUS_AND_EXCLAMATION_MARK | :ZERO | :error | false, Integer], Integer, Integer, true]
110
+ Racc_token_to_s_table: [String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String]
111
+ Racc_debug_parser: false
112
+ UNICODE_CHARACTER_EXCLUDING_SPECIAL_CHARS_AND_SPACE_AND_DOT_AND_COLON_AND_TILDE_AND_ATMARK_AND_SOLIDUS_AND_EXCLAMATION_MARK_PATTERN: Regexp
113
+ FRAGMENT_PREFIX: "epubcfi("
114
+ FRAGMENT_PREFIX_LENGTH: 8
115
+ FRAGMENT_SUFFIX_LENGTH: 1
116
+ include Comparable
117
+
118
+ def _reduce_none: (untyped val, untyped _values, untyped result) -> untyped
119
+ def self.parse: (String string, ?debug: boolish) -> (Location | Range)
120
+ def initialize: (?debug: boolish) -> void
121
+ def parse: (String string) -> (Location | Range)
122
+ def next_token: -> ([:ATMARK | :CIRCUMFLEX | :CLOSING_PARENTHESIS | :CLOSING_SQUARE_BRACKET | :COLON | :COMMA | :DIGIT_NON_ZERO | :DOT | :EQUAL | :EXCLAMATION_MARK | :OPENING_PARENTHESIS | :OPENING_SQUARE_BRACKET | :SEMICOLON | :SOLIDUS | :SPACE | :TILDE | :UNICODE_CHARACTER_EXCLUDING_SPECIAL_CHARS_AND_SPACE_AND_DOT_AND_COLON_AND_TILDE_AND_ATMARK_AND_SOLIDUS_AND_EXCLAMATION_MARK | :ZERO, String] | [bool, bool])
123
+ end
124
+ end
125
+ end
@@ -0,0 +1,8 @@
1
+ module Racc
2
+ class Parser
3
+ private def do_parse: () -> untyped
4
+ end
5
+
6
+ class ParseError < StandardError
7
+ end
8
+ end
@@ -0,0 +1,7 @@
1
+ module SimpleCov
2
+ def self.start: { [self: Configuration] -> void } -> void
3
+
4
+ module Configuration
5
+ def add_filter: (string) -> void
6
+ end
7
+ end
@@ -0,0 +1,31 @@
1
+ module Test
2
+ module Unit
3
+ class TestCase
4
+ include Assertions
5
+ extend Data::ClassMethods
6
+
7
+ def self.data: (untyped) -> untyped
8
+ end
9
+
10
+ module Assertions
11
+ def assert_equal: (untyped, untyped) -> void
12
+ def assert_not_same: (untyped, untyped) -> void
13
+ def assert_nil: (untyped) -> void
14
+ def assert_true: (untyped) -> void
15
+ def assert_block: (string?) { -> void } -> void
16
+ def assert_raise: (singleton(Exception)?) { -> void } -> void
17
+ def assert_nothing_raised: { -> void } -> void
18
+ def build_message: (string, string?, *string) -> String
19
+
20
+ class AssertionMessage
21
+ def self.delayed_diff: (string? from, string? to) -> String
22
+ end
23
+ end
24
+
25
+ module Data
26
+ module ClassMethods
27
+ def data: (untyped) -> untyped
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,39 @@
1
+ class TestCFI < Test::Unit::TestCase
2
+ private
3
+
4
+ def epubcfi: (String string) -> (EPUB::CFI::Location | EPUB::CFI::Range)
5
+ def assert_equal_node: (untyped expected, untyped actual, ?String message) -> void
6
+
7
+ class TestLocation < TestCFI
8
+ end
9
+
10
+ class TestPath < TestCFI
11
+ end
12
+
13
+ class TestRange < TestCFI
14
+ end
15
+
16
+ class TestStep < TestCFI
17
+ end
18
+
19
+ class TestIDAssertion < TestCFI
20
+ end
21
+
22
+ class TestTextLocationAssertion < TestCFI
23
+ end
24
+
25
+ class TestCharacterOffset < TestCFI
26
+ end
27
+
28
+ class TestSpatialOffset < TestCFI
29
+ end
30
+
31
+ class TestTemporalOffset < TestCFI
32
+ end
33
+
34
+ class TestTemporalSpatialOffset < TestCFI
35
+ end
36
+ end
37
+
38
+ class TestParserCFI < Test::Unit::TestCase
39
+ end
data/test/helper.rb CHANGED
@@ -5,9 +5,3 @@ end
5
5
 
6
6
  require 'test/unit'
7
7
  require "test/unit/notify"
8
-
9
- require "pretty_backtrace"
10
- PrettyBacktrace.enable
11
-
12
- class Test::Unit::TestCase
13
- end
data/test/test_cfi.rb CHANGED
@@ -21,13 +21,14 @@ class TestCFI < Test::Unit::TestCase
21
21
 
22
22
  def test_join
23
23
  location = EPUB::CFI::Parser.parse('epubcfi(/6/14[chap05ref])')
24
+ # @type var location: EPUB::CFI::Location
24
25
  other_path = EPUB::CFI::Path.new([EPUB::CFI::Path.new([
25
26
  EPUB::CFI::Step.new(4, EPUB::CFI::IDAssertion.new('body01')),
26
27
  EPUB::CFI::Step.new(10),
27
28
  EPUB::CFI::Step.new(2),
28
29
  EPUB::CFI::Step.new(1)
29
30
  ])])
30
- joined = location.join([other_path])
31
+ joined = location.join(other_path)
31
32
 
32
33
  assert_equal 'epubcfi(/6/14[chap05ref]!/4[body01]/10/2/1)', joined.to_s
33
34
  end
@@ -81,6 +82,7 @@ class TestCFI < Test::Unit::TestCase
81
82
  first = epubcfi('/6/4[chap01ref]!/4[body01]/10[para05]/2/1:1')
82
83
  last = epubcfi('/6/4[chap01ref]!/4[body01]/10[para05]/3:4')
83
84
  range = epubcfi('/6/4[chap01ref]!/4[body01]/10[para05],/2/1:1,/3:4')
85
+ # @type var range: EPUB::CFI::Range
84
86
  assert_equal 0, first <=> range.first
85
87
  assert_equal 0, last <=> range.last
86
88
 
@@ -93,7 +95,9 @@ class TestCFI < Test::Unit::TestCase
93
95
  end
94
96
 
95
97
  def test_cover
96
- assert_true epubcfi('/6/4[chap01ref]!/4[body01]/10[para05],/2/1:1,/3:4').cover? epubcfi('/6/4[chap01ref]!/4[body01]/10[para05]/2/2/4')
98
+ range = epubcfi('/6/4[chap01ref]!/4[body01]/10[para05],/2/1:1,/3:4')
99
+ # @type var range: EPUB::CFI::Range
100
+ assert_true range.cover? epubcfi('/6/4[chap01ref]!/4[body01]/10[para05]/2/2/4')
97
101
  end
98
102
  end
99
103
 
@@ -201,6 +205,15 @@ class TestCFI < Test::Unit::TestCase
201
205
  end
202
206
  end
203
207
 
208
+ class TestRactor < self
209
+ def test_ractor
210
+ cfi = EPUB::CFI("/6/14[chap05ref]!/4[body01]/10/2/1:3[2^[1^]]")
211
+ ractor = Ractor.new {Ractor.receive.to_s}
212
+ ractor.send cfi
213
+ assert_equal "epubcfi(/6/14[chap05ref]!/4[body01]/10/2/1:3[2^[1^]])", ractor.take
214
+ end
215
+ end
216
+
204
217
  private
205
218
 
206
219
  def epubcfi(string)
@@ -0,0 +1,22 @@
1
+ require_relative "helper"
2
+ require "tempfile"
3
+
4
+ class TestPackage < Test::Unit::TestCase
5
+ def test_build
6
+ Tempfile.create do |file|
7
+ assert system("gem", "build", "epub-cfi.gemspec", "--output", file.to_path, exception: true)
8
+ assert_path_exist file.to_path
9
+ assert file.size > 0
10
+ end
11
+ end
12
+
13
+ def test_install
14
+ gemspec = Gem::Specification.load("epub-cfi.gemspec")
15
+ system "rake", "build", exception: true
16
+ Dir.mktmpdir do |dir|
17
+ dir = File.realpath(dir)
18
+ system "gem", "install", "--install-dir", dir, File.join("pkg", gemspec.file_name), exception: true
19
+ assert_path_exist File.join(dir, "gems/#{gemspec.full_name}/lib/epub/cfi/parser.tab.rb")
20
+ end
21
+ end
22
+ end