librtree 1.0.0 → 1.0.2

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: f4cc8665ba0560f3258c4857556efa67195cc699915adc9d2297a78d0f41c3cc
4
- data.tar.gz: 1b20b6f067a37c4f3265c9f9d7084d4736a8367aa05613e075a4589ba1dc0259
3
+ metadata.gz: c35526142564e94d93f091e405467f2ee2df3d294b1a4b8e3a87db66f1229043
4
+ data.tar.gz: dffb928767c821a14460f21d06fc1c90e41a7a17a94a8e700fac0c409d65ca59
5
5
  SHA512:
6
- metadata.gz: c0ae30faf7cba617f9ab96be3d9ec5325505a9b97b9591fc64bcbd8e2de327def4bca47386992c80f6c1d6021211cdd660ca10cfa1ed8f75d82b67cc6a33f1a0
7
- data.tar.gz: d561ecb375d69cb78a1f2681c43e430692c4f191bc9555cd317e8b0b76d726740154aa2befb6bdc9f35aa56adf0686c5030593ac81fff9fc3ce167ecdd9eeef4
6
+ metadata.gz: 0447a6e59546922ed8d227e0f3589aae7771243c4e16c24ae46cde5075dae4b1f7be2b1a8526d58adc6c3db379719201fcf370f1251e82773f488046ab66caff
7
+ data.tar.gz: 8ed4fd4e3982a4bfbffac9a53f92ae6dfd497ac4e684110d72591e7ec500a4ee2629a5b3a17dad5cc404383eb7aaccf333d7d15a8aeaa943d858a3e973a35d13
data/CHANGELOG.md CHANGED
@@ -1,6 +1,22 @@
1
1
  Changelog
2
2
  ---------
3
3
 
4
+ ### 1.0.2, pending
5
+
6
+ - The `#serialise` method raises if the read from pipe returns
7
+ nil (which it might), so the method (and other methods which
8
+ call it to serialise) now return `String` or raise
9
+ - Added RBS static type signatures and infrastructure for static
10
+ type checking with **steep**
11
+
12
+ ### 1.0.1, 16-03-2023
13
+
14
+ - Update to 1.1.4 of embedded `librtree`
15
+ - The `#empty?` method uses faster `rtree_empty` of the latest
16
+ version of the embedded library
17
+ - Added the `simplecov` gem and configured (Ruby) coverage in
18
+ CI runs
19
+
4
20
  ### 1.0.0, 24-02-2023
5
21
 
6
22
  - The `librtree` library is no longer a requirement: the code
data/README.md CHANGED
@@ -1,8 +1,8 @@
1
1
  librtree-ruby
2
2
  -------------
3
3
 
4
- A Ruby native extension for [librtree][3] implementing the R-tree
5
- spatial index of Guttman-Green.
4
+ A Ruby native extension implementing the R-tree spatial index of
5
+ Guttman-Green. The code is an embedded version of [librtree][3].
6
6
 
7
7
 
8
8
  ### Installing dependencies
@@ -47,12 +47,12 @@ will import the **RTree** class, its usage is described [here][5].
47
47
  This is only needed if you want work on the extension, not for
48
48
  a Gem install.
49
49
 
50
- First install the dependencies and [librtree][3] as above. Then
51
- clone the repository and install the extension's Ruby dependencies,
52
- there are several ways to do this.
50
+ First install the dependencies as above. Then clone the repository and
51
+ install the extension's Ruby dependencies, there are several ways to do
52
+ this.
53
53
 
54
- If using [rbenv][4], then first set a local version of Ruby to
55
- use, then install the gems into your local cache
54
+ If using [rbenv][4], then first set a local version of Ruby to use,
55
+ then install the gems into your local cache
56
56
 
57
57
  rbenv local 2.7.0
58
58
  bundle install
@@ -79,6 +79,8 @@ run the tests:
79
79
 
80
80
  bundle exec rake compile
81
81
  bundle exec rake spec
82
+ bundle exec steep check
83
+
82
84
 
83
85
  [1]: http://www.digip.org/jansson/
84
86
  [3]: http://soliton.vm.bytemark.co.uk/pub/jjg/en/code/librtree/
@@ -0,0 +1,9 @@
1
+ Embedded librtree
2
+ -----------------
3
+
4
+ The code in this directory is largely generated by the script
5
+ `bin/librtee-update`, one should not edit it directly, instead
6
+ make a clone of the [librtree][1] project, modify that and use
7
+ the update-script to copy the results here.
8
+
9
+ [1]: https://gitlab.com/jjg/librtree
data/ext/rtree/lib/node.c CHANGED
@@ -700,6 +700,34 @@ bool node_identical(const state_t *state, const node_t *a, const node_t *b)
700
700
  return ! (a || b);
701
701
  }
702
702
 
703
+ /*
704
+ find whether the node or its descendants have a leaf, so we're
705
+ looking for a level-zero node with a non-zero count, of course
706
+ we short circuit as soon as we find one.
707
+ */
708
+
709
+ bool node_nonempty(const state_t *state, const node_t *node)
710
+ {
711
+ node_count_t count;
712
+
713
+ if ((count = node_count(node)) == 0)
714
+ return false;
715
+
716
+ if (node_level(node) == 0)
717
+ return true;
718
+
719
+ for (size_t i = 0 ; i < count ; i++)
720
+ {
721
+ const branch_t *branch = node_get_branch(state, node, i);
722
+ const node_t *child = branch_get_child(branch);
723
+
724
+ if (node_nonempty(state, child))
725
+ return true;
726
+ }
727
+
728
+ return false;
729
+ }
730
+
703
731
  extern node_count_t node_count(const node_t*);
704
732
  extern void node_count_increment(node_t*);
705
733
  extern void node_count_decrement(node_t*);
@@ -5,7 +5,7 @@
5
5
 
6
6
  #include "rtree/package.h"
7
7
 
8
- const char *rtree_package_version = "1.1.3";
9
- const char *rtree_package_name = "librtree";
10
- const char *rtree_package_url = "https://gitlab.com/jjg/librtree";
11
- const char *rtree_package_bugreport = "j.j.green@gmx.co.uk";
8
+ const char rtree_package_version[] = "1.1.4";
9
+ const char rtree_package_name[] = "librtree";
10
+ const char rtree_package_url[] = "https://gitlab.com/jjg/librtree";
11
+ const char rtree_package_bugreport[] = "j.j.green@gmx.co.uk";
@@ -8,6 +8,9 @@
8
8
 
9
9
  #ifdef __cplusplus
10
10
  extern "C" {
11
+ #if 0
12
+ }
13
+ #endif
11
14
  #endif
12
15
 
13
16
  #include <stdint.h>
@@ -54,6 +57,7 @@ int node_update(const state_t*, const node_t*, rtree_update_t*, void*);
54
57
  bool node_identical(const state_t*, const node_t*, const node_t*);
55
58
  node_height_t node_height(const state_t*, const node_t*);
56
59
  size_t node_bytes(const state_t*, const node_t*);
60
+ bool node_nonempty(const state_t*, const node_t*);
57
61
 
58
62
  inline node_count_t node_count(const node_t *node)
59
63
  {
@@ -6,9 +6,9 @@
6
6
  #ifndef RTREE_PACKAGE_H
7
7
  #define RTREE_PACKAGE_H
8
8
 
9
- extern const char *rtree_package_version;
10
- extern const char *rtree_package_name;
11
- extern const char *rtree_package_url;
12
- extern const char *rtree_package_bugreport;
9
+ extern const char rtree_package_version[];
10
+ extern const char rtree_package_name[];
11
+ extern const char rtree_package_url[];
12
+ extern const char rtree_package_bugreport[];
13
13
 
14
14
  #endif
@@ -188,3 +188,10 @@ size_t rtree_bytes(const rtree_t *rtree)
188
188
  state_bytes(rtree->state) +
189
189
  node_bytes(rtree->state, rtree->root);
190
190
  }
191
+
192
+ bool rtree_empty(const rtree_t *rtree)
193
+ {
194
+ return
195
+ (rtree == NULL) ||
196
+ (! node_nonempty(rtree->state, rtree->root));
197
+ }
@@ -53,6 +53,7 @@ rtree_t* rtree_bsrt_read(FILE*);
53
53
  int rtree_postscript(const rtree_t*, const rtree_postscript_t*, FILE*);
54
54
  const char* rtree_strerror(int);
55
55
  size_t rtree_bytes(const rtree_t*);
56
+ bool rtree_empty(const rtree_t*);
56
57
 
57
58
  #ifdef __cplusplus
58
59
  }
data/ext/rtree/rtree.c CHANGED
@@ -55,6 +55,16 @@ static VALUE rt_release(VALUE self)
55
55
  return self;
56
56
  }
57
57
 
58
+ static VALUE rt_empty(VALUE self)
59
+ {
60
+ rtree_t *rtree;
61
+ TypedData_Get_Struct(self, rtree_t, &rtree_type, rtree);
62
+ if (rtree_empty(rtree))
63
+ return Qtrue;
64
+ else
65
+ return Qfalse;
66
+ }
67
+
58
68
  static VALUE rt_height(VALUE self)
59
69
  {
60
70
  rtree_t *rtree;
@@ -505,6 +515,7 @@ void Init_rtree(void)
505
515
  rb_define_method(cRTreeBase, "free", rt_release, 0);
506
516
  rb_define_method(cRTreeBase, "clone", rt_clone, 0);
507
517
  rb_define_method(cRTreeBase, "update!", rt_update, 0);
518
+ rb_define_method(cRTreeBase, "empty?", rt_empty, 0);
508
519
  rb_define_method(cRTreeBase, "height", rt_height, 0);
509
520
  rb_define_method(cRTreeBase, "add_rect", rt_add_rect, 2);
510
521
  rb_define_method(cRTreeBase, "search", rt_search, 1);
data/lib/rtree.rb CHANGED
@@ -14,9 +14,9 @@ require 'fcntl'
14
14
 
15
15
  # @author RTree J. J. Green
16
16
  #
17
- # A Ruby wrapper around
18
- # {http://soliton.vm.bytemark.co.uk/pub/jjg/en/code/librtree librtree}
19
- # implementing the R-tree spatial index of Guttman-Green.
17
+ # A Ruby native extension implementing the R-tree spatial index of
18
+ # Guttman-Green. The code is an emebded version of
19
+ # {http://soliton.vm.bytemark.co.uk/pub/jjg/en/code/librtree librtree}.
20
20
  #
21
21
  # Use
22
22
  #
@@ -71,6 +71,10 @@ class RTree < RTreeBase
71
71
 
72
72
  # @!visibility private
73
73
  #
74
+ # The call to exit! here has a true argument, indicationg success,
75
+ # but the value is ignored, so could be omitted; but the sigature
76
+ # for exit! is incorrect: https://github.com/ruby/rbs/issues/1298
77
+ #
74
78
  def deserialise(string, encoding)
75
79
  raise TypeError unless string.is_a? String
76
80
  rd, wr = IO.pipe(encoding)
@@ -89,7 +93,7 @@ class RTree < RTreeBase
89
93
  wr.write(string)
90
94
  ensure
91
95
  wr.close
92
- exit!
96
+ exit! true
93
97
  end
94
98
  end
95
99
  result
@@ -97,13 +101,15 @@ class RTree < RTreeBase
97
101
 
98
102
  # @!visibility private
99
103
  #
104
+ # See note above on argument to exit!
105
+ #
100
106
  def serialise(encoding)
101
107
  rd, wr = IO.pipe(encoding)
102
108
  if fork then
103
109
  wr.close
104
110
  unset_nonblock(rd)
105
111
  begin
106
- result = rd.read
112
+ result = rd.read || raise(IOError, 'reading from pipe')
107
113
  ensure
108
114
  rd.close
109
115
  Process.wait
@@ -114,7 +120,7 @@ class RTree < RTreeBase
114
120
  yield(wr)
115
121
  ensure
116
122
  wr.close
117
- exit!
123
+ exit! true
118
124
  end
119
125
  end
120
126
  result
@@ -233,19 +239,12 @@ class RTree < RTreeBase
233
239
  # https://stackoverflow.com/questions/68122256/ It's still not
234
240
  # clear to me why this qualification is needed, but that's a
235
241
  # problem with my understanding of the Ruby Eigenclass, it is
236
- # the expected behaviour
242
+ # the expected behaviour. Note that self.const_get(:FOO) is
243
+ # the same as self::FOO, but the latter gives a spurious
244
+ # type-warning from steep
237
245
  #
238
246
  def split_flag(split)
239
- case split
240
- when :quadratic
241
- self::SPLIT_QUADRATIC
242
- when :linear
243
- self::SPLIT_LINEAR
244
- when :greene
245
- self::SPLIT_GREENE
246
- else
247
- raise ArgumentError, "bad split value: #{split}"
248
- end
247
+ self.const_get(split_symbol(split))
249
248
  end
250
249
 
251
250
  # @!visibility private
@@ -256,10 +255,22 @@ class RTree < RTreeBase
256
255
 
257
256
  private
258
257
 
259
- def deserialise(*args, &block)
260
- RTree::IOUtil.deserialise(*args, &block)
258
+ def deserialise(string, encoding, &block)
259
+ RTree::IOUtil.deserialise(string, encoding, &block)
261
260
  end
262
261
 
262
+ def split_symbol(split)
263
+ case split
264
+ when :quadratic
265
+ :SPLIT_QUADRATIC
266
+ when :linear
267
+ :SPLIT_LINEAR
268
+ when :greene
269
+ :SPLIT_GREENE
270
+ else
271
+ raise ArgumentError, "bad split value: #{split}"
272
+ end
273
+ end
263
274
  end
264
275
 
265
276
  # Initialize a new (empty) RTree
@@ -355,7 +366,7 @@ class RTree < RTreeBase
355
366
  # @return [Boolean] true if the RTree is empty
356
367
  #
357
368
  def empty?
358
- height.zero?
369
+ super
359
370
  end
360
371
 
361
372
  # Serialise to JSON stream
@@ -512,8 +523,8 @@ class RTree < RTreeBase
512
523
  node_page_flag | split_flag
513
524
  end
514
525
 
515
- def serialise(*args, &block)
516
- RTree::IOUtil.serialise(*args, &block)
526
+ def serialise(encoding, &block)
527
+ RTree::IOUtil.serialise(encoding, &block)
517
528
  end
518
529
 
519
530
  end
@@ -576,8 +587,8 @@ class RTree::Style < RTreeStyleBase
576
587
 
577
588
  private
578
589
 
579
- def deserialise(*args, &block)
580
- RTree::IOUtil.deserialise(*args, &block)
590
+ def deserialise(string, encoding, &block)
591
+ RTree::IOUtil.deserialise(string, encoding, &block)
581
592
  end
582
593
 
583
594
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: librtree
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - J.J. Green
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-02-24 00:00:00.000000000 Z
11
+ date: 2023-04-06 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.10'
55
+ - !ruby/object:Gem::Dependency
56
+ name: simplecov
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '0.22'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '0.22'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: yard
57
71
  requirement: !ruby/object:Gem::Requirement
@@ -94,6 +108,20 @@ dependencies:
94
108
  - - "~>"
95
109
  - !ruby/object:Gem::Version
96
110
  version: '1.1'
111
+ - !ruby/object:Gem::Dependency
112
+ name: steep
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '1.3'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '1.3'
97
125
  description: |
98
126
  A Ruby extension implementing the R-tree spatial-index of
99
127
  Guttman-Green.
@@ -107,6 +135,7 @@ files:
107
135
  - COPYING
108
136
  - README.md
109
137
  - ext/rtree/extconf.rb
138
+ - ext/rtree/lib/README.md
110
139
  - ext/rtree/lib/bindex.c
111
140
  - ext/rtree/lib/bindex.h
112
141
  - ext/rtree/lib/bounds.h
@@ -173,7 +202,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
173
202
  - !ruby/object:Gem::Version
174
203
  version: '0'
175
204
  requirements:
176
- - The Jannson library
205
+ - The Jansson library
177
206
  rubygems_version: 3.1.6
178
207
  signing_key:
179
208
  specification_version: 4