character_set 1.6.0-java → 1.8.0-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/gouteur.yml +1 -1
  3. data/.github/workflows/lint.yml +1 -1
  4. data/.github/workflows/tests.yml +3 -1
  5. data/.rubocop.yml +3 -0
  6. data/BENCHMARK.md +32 -32
  7. data/CHANGELOG.md +24 -1
  8. data/Gemfile +7 -6
  9. data/LICENSE.txt +1 -1
  10. data/README.md +3 -3
  11. data/Rakefile +2 -123
  12. data/character_set.gemspec +0 -7
  13. data/ext/character_set/character_set.c +77 -43
  14. data/lib/character_set/core_ext/regexp_ext.rb +8 -0
  15. data/lib/character_set/expression_converter.rb +37 -54
  16. data/lib/character_set/parser.rb +8 -4
  17. data/lib/character_set/predefined_sets/assigned.cps +73 -52
  18. data/lib/character_set/predefined_sets/emoji.cps +10 -9
  19. data/lib/character_set/ruby_fallback/character_set_methods.rb +14 -17
  20. data/lib/character_set/ruby_fallback/set_methods.rb +6 -21
  21. data/lib/character_set/ruby_fallback/vendored_set_classes.rb +385 -0
  22. data/lib/character_set/ruby_fallback.rb +18 -6
  23. data/lib/character_set/set_method_adapters.rb +1 -1
  24. data/lib/character_set/shared_methods.rb +6 -2
  25. data/lib/character_set/version.rb +1 -1
  26. data/tasks/benchmark.rake +20 -0
  27. data/tasks/benchmarks/shared.rb +28 -0
  28. data/tasks/sync_casefold_data.rake +20 -0
  29. data/tasks/sync_predefined_sets.rake +9 -0
  30. data/tasks/sync_ruby_spec.rake +65 -0
  31. metadata +19 -28
  32. data/benchmarks/shared.rb +0 -30
  33. /data/{benchmarks → tasks/benchmarks}/count_in.rb +0 -0
  34. /data/{benchmarks → tasks/benchmarks}/cover.rb +0 -0
  35. /data/{benchmarks → tasks/benchmarks}/delete_in.rb +0 -0
  36. /data/{benchmarks → tasks/benchmarks}/keep_in.rb +0 -0
  37. /data/{benchmarks → tasks/benchmarks}/scan.rb +0 -0
  38. /data/{benchmarks → tasks/benchmarks}/used_by.rb +0 -0
  39. /data/{benchmarks → tasks/benchmarks}/z_add.rb +0 -0
  40. /data/{benchmarks → tasks/benchmarks}/z_delete.rb +0 -0
  41. /data/{benchmarks → tasks/benchmarks}/z_merge.rb +0 -0
  42. /data/{benchmarks → tasks/benchmarks}/z_minmax.rb +0 -0
@@ -0,0 +1,385 @@
1
+ # set, vendored from https://github.com/ruby/set/blob/master/lib/set.rb,
2
+ # with comments removed and linted.
3
+ class CharacterSet::RubyFallback::Set
4
+ Set = self
5
+ include Enumerable
6
+
7
+ def self.[](*ary)
8
+ new(ary)
9
+ end
10
+
11
+ def initialize(enum = nil, &block)
12
+ @hash = Hash.new(false)
13
+
14
+ enum.nil? and return
15
+
16
+ if block
17
+ do_with_enum(enum) { |o| add(block[o]) }
18
+ else
19
+ merge(enum)
20
+ end
21
+ end
22
+
23
+ def do_with_enum(enum, &block)
24
+ if enum.respond_to?(:each_entry)
25
+ enum.each_entry(&block) if block
26
+ elsif enum.respond_to?(:each)
27
+ enum.each(&block) if block
28
+ else
29
+ raise ArgumentError, "value must be enumerable"
30
+ end
31
+ end
32
+ private :do_with_enum
33
+
34
+ def initialize_dup(orig)
35
+ super
36
+ @hash = orig.instance_variable_get(:@hash).dup
37
+ end
38
+
39
+ if Kernel.instance_method(:initialize_clone).arity != 1
40
+ def initialize_clone(orig, **options)
41
+ super
42
+ @hash = orig.instance_variable_get(:@hash).clone(**options)
43
+ end
44
+ else
45
+ def initialize_clone(orig)
46
+ super
47
+ @hash = orig.instance_variable_get(:@hash).clone
48
+ end
49
+ end
50
+
51
+ def freeze
52
+ @hash.freeze
53
+ super
54
+ end
55
+
56
+ def size
57
+ @hash.size
58
+ end
59
+ alias length size
60
+
61
+ def empty?
62
+ @hash.empty?
63
+ end
64
+
65
+ def clear
66
+ @hash.clear
67
+ self
68
+ end
69
+
70
+ def to_a
71
+ @hash.keys
72
+ end
73
+
74
+ def include?(o)
75
+ @hash[o]
76
+ end
77
+ alias member? include?
78
+
79
+ def superset?(set)
80
+ case
81
+ when set.instance_of?(self.class) && @hash.respond_to?(:>=)
82
+ @hash >= set.instance_variable_get(:@hash)
83
+ when set.is_a?(Set)
84
+ size >= set.size && set.all? { |o| include?(o) }
85
+ else
86
+ raise ArgumentError, "value must be a set"
87
+ end
88
+ end
89
+ alias >= superset?
90
+
91
+ def proper_superset?(set)
92
+ case
93
+ when set.instance_of?(self.class) && @hash.respond_to?(:>)
94
+ @hash > set.instance_variable_get(:@hash)
95
+ when set.is_a?(Set)
96
+ size > set.size && set.all? { |o| include?(o) }
97
+ else
98
+ raise ArgumentError, "value must be a set"
99
+ end
100
+ end
101
+ alias > proper_superset?
102
+
103
+ def subset?(set)
104
+ case
105
+ when set.instance_of?(self.class) && @hash.respond_to?(:<=)
106
+ @hash <= set.instance_variable_get(:@hash)
107
+ when set.is_a?(Set)
108
+ size <= set.size && all? { |o| set.include?(o) }
109
+ else
110
+ raise ArgumentError, "value must be a set"
111
+ end
112
+ end
113
+ alias <= subset?
114
+
115
+ def proper_subset?(set)
116
+ case
117
+ when set.instance_of?(self.class) && @hash.respond_to?(:<)
118
+ @hash < set.instance_variable_get(:@hash)
119
+ when set.is_a?(Set)
120
+ size < set.size && all? { |o| set.include?(o) }
121
+ else
122
+ raise ArgumentError, "value must be a set"
123
+ end
124
+ end
125
+ alias < proper_subset?
126
+
127
+ def <=>(set)
128
+ return unless set.is_a?(Set)
129
+
130
+ case size <=> set.size
131
+ when -1 then -1 if proper_subset?(set)
132
+ when +1 then +1 if proper_superset?(set)
133
+ else 0 if self.==(set)
134
+ end
135
+ end
136
+
137
+ def intersect?(set)
138
+ case set
139
+ when Set
140
+ if size < set.size
141
+ any? { |o| set.include?(o) }
142
+ else
143
+ set.any? { |o| include?(o) }
144
+ end
145
+ when Enumerable
146
+ set.any? { |o| include?(o) }
147
+ else
148
+ raise ArgumentError, "value must be enumerable"
149
+ end
150
+ end
151
+
152
+ def disjoint?(set)
153
+ !intersect?(set)
154
+ end
155
+
156
+ def each(&block)
157
+ block_given? or return enum_for(__method__) { size }
158
+ @hash.each_key(&block)
159
+ self
160
+ end
161
+
162
+ def add(o)
163
+ @hash[o] = true
164
+ self
165
+ end
166
+ alias << add
167
+
168
+ def add?(o)
169
+ add(o) unless include?(o)
170
+ end
171
+
172
+ def delete(o)
173
+ @hash.delete(o)
174
+ self
175
+ end
176
+
177
+ def delete?(o)
178
+ delete(o) if include?(o)
179
+ end
180
+
181
+ def delete_if
182
+ block_given? or return enum_for(__method__) { size }
183
+ select { |o| yield o }.each { |o| @hash.delete(o) }
184
+ self
185
+ end
186
+
187
+ def keep_if
188
+ block_given? or return enum_for(__method__) { size }
189
+ reject { |o| yield o }.each { |o| @hash.delete(o) }
190
+ self
191
+ end
192
+
193
+ def reject!(&block)
194
+ block_given? or return enum_for(__method__) { size }
195
+ n = size
196
+ delete_if(&block)
197
+ self if size != n
198
+ end
199
+
200
+ def select!(&block)
201
+ block_given? or return enum_for(__method__) { size }
202
+ n = size
203
+ keep_if(&block)
204
+ self if size != n
205
+ end
206
+
207
+ alias filter! select!
208
+
209
+ def merge(*enums, **_rest)
210
+ enums.each do |enum|
211
+ if enum.instance_of?(self.class)
212
+ @hash.update(enum.instance_variable_get(:@hash))
213
+ else
214
+ do_with_enum(enum) { |o| add(o) }
215
+ end
216
+ end
217
+
218
+ self
219
+ end
220
+
221
+ def subtract(enum)
222
+ do_with_enum(enum) { |o| delete(o) }
223
+ self
224
+ end
225
+
226
+ def |(enum)
227
+ dup.merge(enum)
228
+ end
229
+ alias + |
230
+ alias union |
231
+
232
+ def -(enum)
233
+ dup.subtract(enum)
234
+ end
235
+ alias difference -
236
+
237
+ def &(enum)
238
+ n = self.class.new
239
+ if enum.is_a?(Set)
240
+ if enum.size > size
241
+ each { |o| n.add(o) if enum.include?(o) }
242
+ else
243
+ enum.each { |o| n.add(o) if include?(o) }
244
+ end
245
+ else
246
+ do_with_enum(enum) { |o| n.add(o) if include?(o) }
247
+ end
248
+ n
249
+ end
250
+ alias intersection &
251
+
252
+ def ^(enum)
253
+ n = Set.new(enum)
254
+ each { |o| n.add(o) unless n.delete?(o) }
255
+ n
256
+ end
257
+
258
+ def ==(other)
259
+ if self.equal?(other)
260
+ true
261
+ elsif other.instance_of?(self.class)
262
+ @hash == other.instance_variable_get(:@hash)
263
+ elsif other.is_a?(Set) && self.size == other.size
264
+ other.all? { |o| @hash.include?(o) }
265
+ else
266
+ false
267
+ end
268
+ end
269
+
270
+ def hash
271
+ @hash.hash
272
+ end
273
+
274
+ def eql?(o)
275
+ return false unless o.is_a?(Set)
276
+ @hash.eql?(o.instance_variable_get(:@hash))
277
+ end
278
+
279
+ alias === include?
280
+
281
+ def classify
282
+ block_given? or return enum_for(__method__) { size }
283
+
284
+ h = {}
285
+
286
+ each { |i|
287
+ (h[yield(i)] ||= self.class.new).add(i)
288
+ }
289
+
290
+ h
291
+ end
292
+
293
+ def divide(&func)
294
+ func or return enum_for(__method__) { size }
295
+
296
+ if func.arity == 2
297
+ require 'tsort'
298
+
299
+ class << dig = {}
300
+ include TSort
301
+
302
+ alias tsort_each_node each_key
303
+ def tsort_each_child(node, &block)
304
+ fetch(node).each(&block)
305
+ end
306
+ end
307
+
308
+ each { |u|
309
+ dig[u] = a = []
310
+ each{ |v| func.call(u, v) and a << v }
311
+ }
312
+
313
+ set = Set.new()
314
+ dig.each_strongly_connected_component { |css|
315
+ set.add(self.class.new(css))
316
+ }
317
+ set
318
+ else
319
+ Set.new(classify(&func).values)
320
+ end
321
+ end
322
+ end
323
+
324
+ # sorted_set without rbtree dependency, vendored from
325
+ # https://github.com/ruby/set/blob/72f08c4/lib/set.rb#L731-L800
326
+ class CharacterSet::RubyFallback::SortedSet < CharacterSet::RubyFallback::Set
327
+ def initialize(*args)
328
+ @keys = nil
329
+ super
330
+ end
331
+
332
+ def clear
333
+ @keys = nil
334
+ super
335
+ end
336
+
337
+ def add(o)
338
+ @keys = nil
339
+ super
340
+ end
341
+ alias << add
342
+
343
+ def delete(o)
344
+ @keys = nil
345
+ @hash.delete(o)
346
+ self
347
+ end
348
+
349
+ def delete_if
350
+ block_given? or return enum_for(__method__) { size }
351
+ n = @hash.size
352
+ super
353
+ @keys = nil if @hash.size != n
354
+ self
355
+ end
356
+
357
+ def keep_if
358
+ block_given? or return enum_for(__method__) { size }
359
+ n = @hash.size
360
+ super
361
+ @keys = nil if @hash.size != n
362
+ self
363
+ end
364
+
365
+ def merge(enum)
366
+ @keys = nil
367
+ super
368
+ end
369
+
370
+ def each(&block)
371
+ block or return enum_for(__method__) { size }
372
+ to_a.each(&block)
373
+ self
374
+ end
375
+
376
+ def to_a
377
+ (@keys = @hash.keys).sort! unless @keys
378
+ @keys.dup
379
+ end
380
+
381
+ def freeze
382
+ to_a
383
+ super
384
+ end
385
+ end
@@ -1,8 +1,3 @@
1
- if RUBY_VERSION.to_f >= 3.0 && !RUBY_PLATFORM[/java/i]
2
- require 'sorted_set'
3
- else
4
- require 'set'
5
- end
6
1
  require 'character_set/ruby_fallback/set_methods'
7
2
  require 'character_set/ruby_fallback/character_set_methods'
8
3
 
@@ -16,8 +11,25 @@ class CharacterSet
16
11
  end
17
12
 
18
13
  def initialize(enum = [])
19
- @__set = SortedSet.new
14
+ @__set = CharacterSet::RubyFallback::SortedSet.new
20
15
  super
21
16
  end
22
17
  end
23
18
  end
19
+
20
+ if RUBY_PLATFORM[/java/i]
21
+ # JRuby has sorted_set in the stdlib.
22
+ require 'set'
23
+ CharacterSet::RubyFallback::Set = ::Set
24
+ CharacterSet::RubyFallback::SortedSet = ::SortedSet
25
+ else
26
+ # For other rubies, set/sorted_set are vendored due to dependency issues:
27
+ #
28
+ # - issues with default vs. installed gems such as [#2]
29
+ # - issues with the sorted_set dependency rb_tree
30
+ # - long-standing issues in recent versions of sorted_set
31
+ #
32
+ # The RubyFallback, and thus these set classes, are only used for testing,
33
+ # and for exotic rubies which use neither C nor Java.
34
+ require 'character_set/ruby_fallback/vendored_set_classes'
35
+ end
@@ -22,7 +22,7 @@ class CharacterSet
22
22
 
23
23
  # Allow some methods to take an Enum just as well as another CharacterSet.
24
24
  # Tested by ruby-spec.
25
- %w[& + - ^ | difference disjoint? intersect? intersection
25
+ %w[& + - ^ | <=> difference disjoint? intersect? intersection
26
26
  subtract union].each do |method|
27
27
  class_eval <<-RUBY, __FILE__, __LINE__ + 1
28
28
  def #{method}(arg)
@@ -165,8 +165,12 @@ class CharacterSet
165
165
  end
166
166
 
167
167
  def divide(&func)
168
- CharacterSet.require_optional_dependency('set', __method__)
169
- Set.new(to_a).divide(&func)
168
+ require 'character_set/ruby_fallback'
169
+ CharacterSet::RubyFallback::Set.new(to_a).divide(&func)
170
+ end
171
+
172
+ def join(separator = '')
173
+ to_a(true).join(separator)
170
174
  end
171
175
  RUBY
172
176
 
@@ -1,3 +1,3 @@
1
1
  class CharacterSet
2
- VERSION = '1.6.0'
2
+ VERSION = '1.8.0'
3
3
  end
@@ -0,0 +1,20 @@
1
+ desc 'Run all IPS benchmarks'
2
+ task :benchmark do
3
+ Dir["#{__dir__}/benchmarks/*.rb"].sort.each { |file| load(file) }
4
+ end
5
+
6
+ namespace :benchmark do
7
+ desc 'Run all IPS benchmarks and store the comparison results in BENCHMARK.md'
8
+ task :write_to_file do
9
+ Rake.application[:benchmark].invoke
10
+
11
+ # extract comparison results from reports
12
+ results = $benchmark_results
13
+ .map { |caption, report| "```\n#{caption}\n\n#{report[/(?<=Comparison:).+/m].strip}\n```" }
14
+ .join("\n")
15
+ .gsub(/ \(±[^)]+\) |(?<=same-ish).*/, '') # remove some noise
16
+
17
+ File.write "#{__dir__}/../BENCHMARK.md",
18
+ "Results of `rake:benchmark` on #{RUBY_DESCRIPTION}\n\n#{results}\n"
19
+ end
20
+ end
@@ -0,0 +1,28 @@
1
+ require 'benchmark/ips'
2
+ require_relative '../../lib/character_set'
3
+ if RUBY_VERSION.to_f >= 3.0 && !RUBY_PLATFORM[/java/i]
4
+ require 'sorted_set'
5
+ else
6
+ require 'set'
7
+ end
8
+
9
+ def benchmark(caption: nil, cases: {})
10
+ with_stdouts($stdout, string_io = StringIO.new) do
11
+ puts caption
12
+ Benchmark.ips do |x|
13
+ cases.each { |label, callable| x.report(label, &callable) }
14
+ x.compare!
15
+ end
16
+ end
17
+ ($benchmark_results ||= {})[caption] = string_io.string
18
+ end
19
+
20
+ def with_stdouts(*ios)
21
+ old_stdout = $stdout
22
+ ios.define_singleton_method(:method_missing) { |*args| each { |io| io.send(*args) } }
23
+ ios.define_singleton_method(:respond_to?) { |*args| IO.respond_to?(*args) }
24
+ $stdout = ios
25
+ yield
26
+ ensure
27
+ $stdout = old_stdout
28
+ end
@@ -0,0 +1,20 @@
1
+ desc 'Download unicode casefold data and write new C header file'
2
+ task :sync_casefold_data do
3
+ src_path = './CaseFolding.txt'
4
+ dst_path = "#{__dir__}/../ext/character_set/unicode_casefold_table.h"
5
+
6
+ `wget http://www.unicode.org/Public/UNIDATA/CaseFolding.txt`
7
+
8
+ mapping = File.foreach(src_path).each_with_object({}) do |line, hash|
9
+ from, type, to = line.split(/\s*;\s*/).first(3)
10
+ # type 'C' stands for 'common', excludes mappings to multiple chars
11
+ hash[from] = to if type == 'C'
12
+ end.sort
13
+
14
+ content = File.read(dst_path + '.tmpl')
15
+ .sub(/(CASEFOLD_COUNT )0/, "\\1#{mapping.count}")
16
+ .sub('{}', ['{', mapping.map { |a, b| "{0x#{a},0x#{b}}," }, '}'].join("\n"))
17
+
18
+ File.write(dst_path, content)
19
+ File.unlink(src_path)
20
+ end
@@ -0,0 +1,9 @@
1
+ desc 'Update codepoint data for predefined sets, based on Onigmo'
2
+ task :sync_predefined_sets do
3
+ %w[assigned emoji whitespace].each do |prop|
4
+ require 'regexp_property_values'
5
+ ranges = RegexpPropertyValues[prop].matched_ranges
6
+ str = ranges.map { |r| "#{r.min.to_s(16)},#{r.max.to_s(16)}\n" }.join.upcase
7
+ File.write("#{__dir__}/../lib/character_set/predefined_sets/#{prop}.cps", str, mode: 'w')
8
+ end
9
+ end
@@ -0,0 +1,65 @@
1
+ desc 'Download relevant ruby/spec tests, adapt to CharacterSet and its variants'
2
+ task :sync_ruby_spec do
3
+ require 'fileutils'
4
+
5
+ variants = {
6
+ 'CharacterSet' => "#{__dir__}/../spec/ruby-spec/library/character_set",
7
+ 'CharacterSet::Pure' => "#{__dir__}/../spec/ruby-spec/library/character_set_pure",
8
+ }
9
+
10
+ # download fresh specs from ruby/spec repository
11
+ variants.each do |_, dir|
12
+ FileUtils.rm_rf(dir)
13
+ `svn export https://github.com/ruby/spec/trunk/library/set/sortedset #{dir}`
14
+ end
15
+
16
+ # make copies for each CharacterSet variant
17
+ base = variants.first[1]
18
+ variants.each_value { |dir| FileUtils.copy_entry(base, dir) unless dir == base }
19
+
20
+ # adapt specs to work with CharacterSet
21
+ variants.each do |class_name, dir|
22
+ Dir["#{dir}/**/*.rb"].each do |spec|
23
+ # ignore some tests that do not apply or are covered otherwise
24
+ if spec =~ %r{/(classify|divide|flatten|initialize|pretty_print)}
25
+ File.delete(spec)
26
+ next
27
+ end
28
+
29
+ adapted_content =
30
+ File.read(spec).
31
+ # adapt class name
32
+ gsub('SortedSet', (spec['/shared/'] ? 'variant' : class_name)).
33
+ gsub(/(it_behaves_like :[^,\n]+), (:[^,\n]+)/, "\\1, #{class_name}, \\2").
34
+ # get shared specs from a single shared dir at the parent level
35
+ gsub(/(require_relative ['"])(shared\/)/, '\1../\2').
36
+ # make 'mspec' syntax rspec-compatible
37
+ gsub(/describe (.*), shared.*$/, 'shared_examples \1 do |variant, method|').
38
+ gsub(/be_(false|true)/, 'be \1').
39
+ gsub('stub!', 'stub').
40
+ gsub('mock', 'double').
41
+ gsub('@method', 'method').
42
+ # remove unneeded requires
43
+ gsub(/require 'set'\n/, '').
44
+ gsub(/require.*spec_helper.*\n/, '').
45
+ gsub(/\A\n+/, '').
46
+ # make examples use Integers/codepoints
47
+ gsub(/1\.0|"cat"|"dog"|"hello"|"test"/, '0').
48
+ gsub('"one"', '1').
49
+ gsub('"two"', '2').
50
+ gsub('"three"', '3').
51
+ gsub('"four"', '4').
52
+ gsub('"five"', '5').
53
+ gsub(/x.(size|length) == 3/, 'x != 3').
54
+ gsub(/x.(size|length) != 3/, 'x == 3').
55
+ gsub(/(add)\(\d\)(\.to_a \}.should raise)/, '\1(:foo)\2')
56
+
57
+ File.open(spec, 'w') { |f| f.puts adapted_content }
58
+ end
59
+ end
60
+
61
+ # keep only one copy of the shared specs, at the parent level
62
+ FileUtils.rm_rf(base + '/../shared')
63
+ FileUtils.mv(base + '/shared', base + '/../')
64
+ variants.each_value { |dir| FileUtils.rm_rf(dir + '/shared') }
65
+ end
metadata CHANGED
@@ -1,29 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: character_set
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.6.0
4
+ version: 1.8.0
5
5
  platform: java
6
6
  authors:
7
7
  - Janosch Müller
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-02-16 00:00:00.000000000 Z
11
+ date: 2024-01-07 00:00:00.000000000 Z
12
12
  dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: sorted_set
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - "~>"
18
- - !ruby/object:Gem::Version
19
- version: '1.0'
20
- type: :runtime
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - "~>"
25
- - !ruby/object:Gem::Version
26
- version: '1.0'
27
13
  - !ruby/object:Gem::Dependency
28
14
  name: range_compressor
29
15
  requirement: !ruby/object:Gem::Requirement
@@ -59,17 +45,6 @@ files:
59
45
  - LICENSE.txt
60
46
  - README.md
61
47
  - Rakefile
62
- - benchmarks/count_in.rb
63
- - benchmarks/cover.rb
64
- - benchmarks/delete_in.rb
65
- - benchmarks/keep_in.rb
66
- - benchmarks/scan.rb
67
- - benchmarks/shared.rb
68
- - benchmarks/used_by.rb
69
- - benchmarks/z_add.rb
70
- - benchmarks/z_delete.rb
71
- - benchmarks/z_merge.rb
72
- - benchmarks/z_minmax.rb
73
48
  - bin/console
74
49
  - bin/setup
75
50
  - character_set.gemspec
@@ -105,10 +80,26 @@ files:
105
80
  - lib/character_set/ruby_fallback.rb
106
81
  - lib/character_set/ruby_fallback/character_set_methods.rb
107
82
  - lib/character_set/ruby_fallback/set_methods.rb
83
+ - lib/character_set/ruby_fallback/vendored_set_classes.rb
108
84
  - lib/character_set/set_method_adapters.rb
109
85
  - lib/character_set/shared_methods.rb
110
86
  - lib/character_set/version.rb
111
87
  - lib/character_set/writer.rb
88
+ - tasks/benchmark.rake
89
+ - tasks/benchmarks/count_in.rb
90
+ - tasks/benchmarks/cover.rb
91
+ - tasks/benchmarks/delete_in.rb
92
+ - tasks/benchmarks/keep_in.rb
93
+ - tasks/benchmarks/scan.rb
94
+ - tasks/benchmarks/shared.rb
95
+ - tasks/benchmarks/used_by.rb
96
+ - tasks/benchmarks/z_add.rb
97
+ - tasks/benchmarks/z_delete.rb
98
+ - tasks/benchmarks/z_merge.rb
99
+ - tasks/benchmarks/z_minmax.rb
100
+ - tasks/sync_casefold_data.rake
101
+ - tasks/sync_predefined_sets.rake
102
+ - tasks/sync_ruby_spec.rake
112
103
  homepage: https://github.com/jaynetics/character_set
113
104
  licenses:
114
105
  - MIT
@@ -128,7 +119,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
128
119
  - !ruby/object:Gem::Version
129
120
  version: '0'
130
121
  requirements: []
131
- rubygems_version: 3.4.0.dev
122
+ rubygems_version: 3.5.0.dev
132
123
  signing_key:
133
124
  specification_version: 4
134
125
  summary: Build, read, write and compare sets of Unicode codepoints.