dartsclone 0.2.1 → 0.3.1

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: 5f885b4746eda49bbcdf7dd447acf1f5249f41fd3f259b9b5a0c4aefdb166a53
4
- data.tar.gz: 1526d141d3e0671be8b7bf80ea192477a6f2795fbfc627050a1a7edb9e37f7f7
3
+ metadata.gz: 0de9241630b790fea0794afe5ec48d7ac7335faae7c9d563ce42cdfe47670f43
4
+ data.tar.gz: 66dd871d41f3ba849c949093c02b6ac4613541e8ad81e062255a771955ec0988
5
5
  SHA512:
6
- metadata.gz: a3edde3163b959f31f61bed40d031bbeb6f86ca4774d9b110af4dd3d5e787210cef5fab01d87ba342def771ee52d28c133c643bd7179df8c42c6e2cc8e53c731
7
- data.tar.gz: e292bcd0444398425b931a6bf92217b06cf1f45eedc85af841aeb82cbbcb4bd1caaab5f57f43e54aa8e59a5e8b833570c269d699c71a2bd0d7f4e15482197a62
6
+ metadata.gz: 3f696063913884d67ebdd20b51b4d49363537650c831b28d9a987d808d9cb3e239eeec95e2e0b4fed67ab94925ca37649383b4ff956e37141f9c12b3cd79ef33
7
+ data.tar.gz: f5ffe5cc13ee5560e258ecbb0ead2a14b0b96b09d7f286317d1514f5b01eb1dcca12fa1bd15dedb594bd5393eaa51c9e49ddc28ac2b4f87eba599fc8f181f505
@@ -1,21 +1,20 @@
1
1
  name: build
2
2
 
3
- on: [push]
3
+ on: [push, pull_request]
4
4
 
5
5
  jobs:
6
6
  build:
7
7
  runs-on: ubuntu-latest
8
8
  strategy:
9
+ fail-fast: false
9
10
  matrix:
10
- ruby: [ '2.5', '2.6', '2.7' ]
11
+ ruby: [ '2.6', '2.7', '3.0' ]
11
12
  steps:
12
13
  - uses: actions/checkout@v2
13
14
  - name: Set up Ruby ${{ matrix.ruby }}
14
- uses: actions/setup-ruby@v1
15
+ uses: ruby/setup-ruby@v1
15
16
  with:
16
17
  ruby-version: ${{ matrix.ruby }}
18
+ bundler-cache: true
17
19
  - name: Build and test with Rake
18
- run: |
19
- gem install bundler
20
- bundle install --jobs 4 --retry 3
21
- bundle exec rake
20
+ run: bundle exec rake
data/CHANGELOG.md CHANGED
@@ -1,3 +1,15 @@
1
+ ## 0.3.1
2
+ - Add dummy constructor call at memory allocation of binding class to prevent occuring segment fault on GC when initialize method is failed.
3
+
4
+ ## 0.3.0
5
+ - Add type declaration file: sig/dartsclone.rbs
6
+
7
+ ## 0.2.3
8
+ - Fix some codes and configulation files.
9
+
10
+ ## 0.2.2
11
+ - Refactor native extension codes considering garbage collection.
12
+
1
13
  ## 0.2.1
2
14
  - Replace Data_ functions to TypedData_ functions.
3
15
  - Fix some config files.
data/Gemfile CHANGED
@@ -3,6 +3,8 @@ source "https://rubygems.org"
3
3
  # Specify your gem's dependencies in darts.gemspec
4
4
  gemspec
5
5
 
6
- gem "rake", "~> 12.0"
6
+ gem "rake", "~> 13.0"
7
7
  gem "rake-compiler"
8
8
  gem "rspec", "~> 3.0"
9
+ gem "rbs", "~> 1.2"
10
+ gem "steep", "~> 0.44"
data/LICENSE.txt CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2020 Atsushi Tatsuma
1
+ Copyright (c) 2020-2021 Atsushi Tatsuma
2
2
  All rights reserved.
3
3
 
4
4
  Redistribution and use in source and binary forms, with or without
data/README.md CHANGED
@@ -2,9 +2,9 @@
2
2
 
3
3
  [![Build Status](https://github.com/yoshoku/darts-clone.rb/workflows/build/badge.svg)](https://github.com/yoshoku/darts-clone.rb/actions?query=workflow%3Abuild)
4
4
  [![Gem Version](https://badge.fury.io/rb/dartsclone.svg)](https://badge.fury.io/rb/dartsclone)
5
- [![BSD 2-Clause License](https://img.shields.io/badge/License-BSD%202--Clause-orange.svg)](https://github.com/yoshoku/darts-clone.rb/blob/master/LICENSE.txt)
5
+ [![BSD 2-Clause License](https://img.shields.io/badge/License-BSD%202--Clause-orange.svg)](https://github.com/yoshoku/darts-clone.rb/blob/main/LICENSE.txt)
6
6
 
7
- Darts-clone.rb is a Ruby binding for the [Darts-clone](https://github.com/s-yata/darts-clone).
7
+ Darts-clone.rb provides Ruby bindings for the [Darts-clone](https://github.com/s-yata/darts-clone).
8
8
 
9
9
  ## Installation
10
10
 
@@ -51,14 +51,14 @@ da.open('foo.dat')
51
51
  ## Contributing
52
52
 
53
53
  Bug reports and pull requests are welcome on GitHub at https://github.com/yoshoku/darts-clone.rb.
54
- This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [code of conduct](https://github.com/yoshoku/darts-clone.rb/blob/master/CODE_OF_CONDUCT.md).
54
+ This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [code of conduct](https://github.com/yoshoku/darts-clone.rb/blob/main/CODE_OF_CONDUCT.md).
55
55
 
56
56
  ## License
57
57
 
58
58
  The gem is available as open source under the terms of the [BSD 2-clause License](https://opensource.org/licenses/BSD-2-Clause).
59
59
  Moreover, the gem includes the source code of Darts-clone.
60
- The License of Darts-clone can be found in [COPYING.md](https://github.com/yoshoku/darts-clone.rb/blob/master/ext/dartsclone/src/COPYING.md).
60
+ The License of Darts-clone can be found in [COPYING.md](https://github.com/yoshoku/darts-clone.rb/blob/main/ext/dartsclone/src/COPYING.md).
61
61
 
62
62
  ## Code of Conduct
63
63
 
64
- Everyone interacting in the Darts project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/yoshoku/darts-clone.rb/blob/master/CODE_OF_CONDUCT.md).
64
+ Everyone interacting in the Darts project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/yoshoku/darts-clone.rb/blob/main/CODE_OF_CONDUCT.md).
data/Steepfile ADDED
@@ -0,0 +1,20 @@
1
+ target :lib do
2
+ signature "sig"
3
+ #
4
+ check "lib" # Directory name
5
+ # check "Gemfile" # File name
6
+ # check "app/models/**/*.rb" # Glob
7
+ # # ignore "lib/templates/*.rb"
8
+ #
9
+ # # library "pathname", "set" # Standard libraries
10
+ # # library "strong_json" # Gems
11
+ end
12
+
13
+ # target :spec do
14
+ # signature "sig", "sig-private"
15
+ #
16
+ # check "spec"
17
+ #
18
+ # # library "pathname", "set" # Standard libraries
19
+ # # library "rspec"
20
+ # end
data/dartsclone.gemspec CHANGED
@@ -6,8 +6,8 @@ Gem::Specification.new do |spec|
6
6
  spec.authors = ['yoshoku']
7
7
  spec.email = ['yoshoku@outlook.com']
8
8
 
9
- spec.summary = 'Ruby binding for the Darts-clone.'
10
- spec.description = 'Darts-clone.rb is a Ruby binding for the Darts-clone.'
9
+ spec.summary = 'Ruby bindings for the Darts-clone.'
10
+ spec.description = 'Darts-clone.rb provides Ruby bindings for the Darts-clone.'
11
11
  spec.homepage = 'https://github.com/yoshoku/darts-clone.rb'
12
12
  spec.license = 'BSD-2-Clause'
13
13
 
@@ -1,6 +1,8 @@
1
1
  #ifndef DARTSCLONEEXT_HPP
2
2
  #define DARTSCLONEEXT_HPP 1
3
3
 
4
+ #include <cstring>
5
+
4
6
  #include <ruby.h>
5
7
  #include <darts.h>
6
8
 
@@ -9,6 +11,7 @@ class RbDoubleArray
9
11
  public:
10
12
  static VALUE double_array_alloc(VALUE self) {
11
13
  Darts::DoubleArray* ptr = (Darts::DoubleArray*)ruby_xmalloc(sizeof(Darts::DoubleArray));
14
+ new (ptr) Darts::DoubleArray(); // dummy call to constructor for GC.
12
15
  return TypedData_Wrap_Struct(self, &double_array_type, ptr);
13
16
  };
14
17
 
@@ -68,22 +71,26 @@ class RbDoubleArray
68
71
  const int n_keys = RARRAY_LEN(_keys);
69
72
  char** keys = (char**)ruby_xmalloc(n_keys * sizeof(char*));
70
73
  int* values = _values == Qundef ? NULL : (int*)ruby_xmalloc(n_keys * sizeof(int));
74
+ VALUE key_str;
71
75
  for (int i = 0; i < n_keys; i++) {
72
- VALUE key_str = rb_ary_entry(_keys, i);
73
- keys[i] = StringValueCStr(key_str);
76
+ key_str = rb_ary_entry(_keys, i);
77
+ keys[i] = strcpy((char*)ruby_xmalloc((RSTRING_LEN(key_str) + 1) * sizeof(char)), StringValueCStr(key_str));
74
78
  if (_values != Qundef) values[i] = NUM2INT(rb_ary_entry(_values, i));
75
79
  }
76
80
 
77
81
  try {
78
82
  get_double_array(self)->build(n_keys, keys, NULL, values);
79
83
  } catch (Darts::Details::Exception e) {
84
+ for (int i = 0; i < n_keys; i++) ruby_xfree(keys[i]);
80
85
  ruby_xfree(keys);
81
86
  if (_values != Qundef) ruby_xfree(values);
82
87
  rb_raise(rb_eRuntimeError, "%s", e.what());
83
88
  return Qfalse;
84
89
  }
90
+ for (int i = 0; i < n_keys; i++) ruby_xfree(keys[i]);
85
91
  ruby_xfree(keys);
86
92
  if (_values != Qundef) ruby_xfree(values);
93
+ RB_GC_GUARD(key_str);
87
94
  return Qtrue;
88
95
  }
89
96
 
@@ -97,13 +104,16 @@ class RbDoubleArray
97
104
  rb_get_kwargs(kwargs, kwtable, 0, 3, kwvalues);
98
105
 
99
106
  const char* filename = StringValueCStr(_filename);
100
- const char* mode = kwvalues[0] == Qundef ? "rb" : StringValueCStr(kwvalues[0]);
107
+ VALUE _mode = kwvalues[0];
108
+ const char* mode = kwvalues[0] == Qundef ? "rb" : StringValueCStr(_mode);
101
109
  const size_t offset = kwvalues[1] == Qundef ? 0 : NUM2SIZET(kwvalues[1]);
102
110
  const size_t size = kwvalues[2] == Qundef ? 0 : NUM2SIZET(kwvalues[2]);
103
111
 
104
112
  if (get_double_array(self)->open(filename, mode, offset, size) != 0) {
105
113
  return Qfalse;
106
114
  }
115
+ RB_GC_GUARD(_filename);
116
+ RB_GC_GUARD(_mode);
107
117
  return Qtrue;
108
118
  };
109
119
 
@@ -117,12 +127,15 @@ class RbDoubleArray
117
127
  rb_get_kwargs(kwargs, kwtable, 0, 2, kwvalues);
118
128
 
119
129
  const char* filename = StringValueCStr(_filename);
120
- const char* mode = kwvalues[0] == Qundef ? "wb" : StringValueCStr(kwvalues[0]);
130
+ VALUE _mode = kwvalues[0];
131
+ const char* mode = kwvalues[0] == Qundef ? "wb" : StringValueCStr(_mode);
121
132
  const size_t offset = kwvalues[1] == Qundef ? 0 : NUM2SIZET(kwvalues[1]);
122
133
 
123
134
  if (get_double_array(self)->save(filename, mode, offset) != 0) {
124
135
  return Qfalse;
125
136
  }
137
+ RB_GC_GUARD(_filename);
138
+ RB_GC_GUARD(_mode);
126
139
  return Qtrue;
127
140
  };
128
141
 
@@ -137,6 +150,7 @@ class RbDoubleArray
137
150
  const size_t total_sz = sz / get_double_array(self)->unit_size();
138
151
  char* arr = StringValuePtr(bytes);
139
152
  get_double_array(self)->set_array(arr, total_sz);
153
+ RB_GC_GUARD(bytes);
140
154
  return Qnil;
141
155
  };
142
156
 
@@ -160,6 +174,7 @@ class RbDoubleArray
160
174
 
161
175
  Darts::DoubleArray::value_type value;
162
176
  get_double_array(self)->exactMatchSearch(key, value, length, node_pos);
177
+ RB_GC_GUARD(_key);
163
178
  return INT2NUM(value);
164
179
  };
165
180
 
@@ -200,6 +215,7 @@ class RbDoubleArray
200
215
  rb_ary_push(ret, values);
201
216
  }
202
217
  ruby_xfree(results);
218
+ RB_GC_GUARD(_key);
203
219
  return ret;
204
220
  };
205
221
 
@@ -223,6 +239,7 @@ class RbDoubleArray
223
239
  rb_hash_aset(ret, ID2SYM(rb_intern("value")), INT2NUM(value));
224
240
  rb_hash_aset(ret, ID2SYM(rb_intern("node_pos")), INT2NUM((int)node_pos));
225
241
  rb_hash_aset(ret, ID2SYM(rb_intern("key_pos")), INT2NUM((int)key_pos));
242
+ RB_GC_GUARD(_key);
226
243
  return ret;
227
244
  };
228
245
 
@@ -0,0 +1,93 @@
1
+ # This class is for yard.
2
+
3
+ # Darts-clone.rb is a Ruby binding for the Darts-clone.
4
+ module DartsClone
5
+ # The version of Darts-clone.rb you are using.
6
+ VERSION = '0.2.2'
7
+
8
+ # The version of Darts-clone that this gem is binding to.
9
+ DARTS_CLONE_VERSION = '0.32'
10
+
11
+ # DoubleArray is a class that implements double-array trie.
12
+ #
13
+ # @example
14
+ # require 'dartsclone'
15
+ #
16
+ # da = DartsClone::DoubleArray.new
17
+ #
18
+ # keys = ['abc', 'abcd', 'abcde', 'bcd', 'cde']
19
+ # da.build(keys)
20
+ #
21
+ # p da.common_prefix_search('abcde')
22
+ # # => [["abc", "abcd", "abcde"], [0, 1, 2]]
23
+ #
24
+ class DoubleArray
25
+ # Create a new double-array trie.
26
+ def initialize; end
27
+
28
+ # Build index of double-array trie
29
+ #
30
+ # @param keys [Array<String>]
31
+ # @param values [Array<Integer>]
32
+ # @return [Boolean]
33
+ def build(keys, values: nil); end
34
+
35
+ # Open saved index.
36
+ #
37
+ # @param filename [String]
38
+ # @return [Boolean]
39
+ def open(filename); end
40
+
41
+ # Save index.
42
+ #
43
+ # @param filename [String]
44
+ # @param mode [String]
45
+ # @param offset [Integer]
46
+ # @return [Boolean]
47
+ def save(filename, mode: 'wb', offset: 0); end
48
+
49
+ # Dump array data.
50
+ #
51
+ # @return [String]
52
+ def get_array(); end
53
+
54
+ # Load array data.
55
+ #
56
+ # @param str [String]
57
+ def set_array(str); end
58
+
59
+ # Search with exact match
60
+ #
61
+ # @param key [String]
62
+ # @param length [Integer]
63
+ # @param node_pos [Integer]
64
+ def exact_match_search(key, length: 0, node_pos: 0); end
65
+
66
+ # Common prefix search.
67
+ #
68
+ # @param key [String]
69
+ def common_prefix_search(key, max_num_results: nil, length: 0, node_pos: 0); end
70
+
71
+ # Traverse trie.
72
+ #
73
+ # @param key [String]
74
+ def traverse(key, node_pos: nil, key_pos: nil, length: nil); end
75
+
76
+ # size
77
+ # @return [Integer]
78
+ def unit_size(); end
79
+
80
+ # unit size
81
+ # @return [Integer]
82
+ def size(); end
83
+
84
+ # total size
85
+ # @return [Integer]
86
+ def total_size(); end
87
+
88
+ # clear trie
89
+ # @return [Nil]
90
+ def clear(); end
91
+ end
92
+ end
93
+
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module DartsClone
4
- VERSION = '0.2.1'
4
+ VERSION = '0.3.1'
5
5
  DARTS_CLONE_VERSION = '0.32'
6
6
  end
@@ -0,0 +1,20 @@
1
+ module DartsClone
2
+ VERSION: String
3
+ DARTS_CLONE_VERSION: String
4
+
5
+ class DoubleArray
6
+ def initialize: () -> void
7
+ def build: (Array[String] keys, ?values: Array[Integer]? values) -> bool
8
+ def open: (String filename) -> bool
9
+ def save: (String filename, ?mode: String mode, ?offset: Integer offset) -> bool
10
+ def get_array: () -> String
11
+ def set_array: (String str) -> nil
12
+ def exact_match_search: (String key, ?length: Integer length, ?node_pos: Integer node_pos) -> Integer
13
+ def common_prefix_search: (String key, ?max_num_results: Integer? max_num_results, ?length: Integer length, ?node_pos: Integer node_pos) -> [Array[String], Array[Integer]]
14
+ def traverse: (String key, ?node_pos: Integer? node_pos, ?key_pos: Integer? key_pos, ?length: Integer? length) -> { value: Integer, node_pos: Integer, key_pos: Integer }
15
+ def unit_size: () -> Integer
16
+ def size: () -> Integer
17
+ def total_size: () -> Integer
18
+ def clear: () -> nil
19
+ end
20
+ end
metadata CHANGED
@@ -1,16 +1,16 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dartsclone
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - yoshoku
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-11-29 00:00:00.000000000 Z
11
+ date: 2021-08-08 00:00:00.000000000 Z
12
12
  dependencies: []
13
- description: Darts-clone.rb is a Ruby binding for the Darts-clone.
13
+ description: Darts-clone.rb provides Ruby bindings for the Darts-clone.
14
14
  email:
15
15
  - yoshoku@outlook.com
16
16
  executables: []
@@ -27,14 +27,17 @@ files:
27
27
  - LICENSE.txt
28
28
  - README.md
29
29
  - Rakefile
30
+ - Steepfile
30
31
  - dartsclone.gemspec
31
32
  - ext/dartsclone/dartscloneext.cpp
32
33
  - ext/dartsclone/dartscloneext.hpp
34
+ - ext/dartsclone/dummy.rb
33
35
  - ext/dartsclone/extconf.rb
34
36
  - ext/dartsclone/src/COPYING.md
35
37
  - ext/dartsclone/src/darts.h
36
38
  - lib/dartsclone.rb
37
39
  - lib/dartsclone/version.rb
40
+ - sig/dartsclone.rbs
38
41
  homepage: https://github.com/yoshoku/darts-clone.rb
39
42
  licenses:
40
43
  - BSD-2-Clause
@@ -58,8 +61,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
58
61
  - !ruby/object:Gem::Version
59
62
  version: '0'
60
63
  requirements: []
61
- rubygems_version: 3.1.4
64
+ rubygems_version: 3.2.22
62
65
  signing_key:
63
66
  specification_version: 4
64
- summary: Ruby binding for the Darts-clone.
67
+ summary: Ruby bindings for the Darts-clone.
65
68
  test_files: []