ffi-geos 2.2.0 → 2.3.0

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.
data/Gemfile CHANGED
@@ -11,11 +11,6 @@ gem 'minitest-reporters'
11
11
  gem 'rake'
12
12
  gem 'rdoc'
13
13
  gem 'rubocop', require: false
14
- gem 'simplecov', '~> 0.17.0', require: false
15
-
16
- platforms :rbx do
17
- gem 'rubinius-developer_tools'
18
- gem 'rubysl', '~> 2.0'
19
- end
14
+ gem 'simplecov', require: false
20
15
 
21
16
  instance_eval File.read('Gemfile.local') if File.exist?('Gemfile.local')
data/ffi-geos.gemspec CHANGED
@@ -7,6 +7,8 @@ Gem::Specification.new do |s|
7
7
  s.version = Geos::VERSION
8
8
 
9
9
  s.required_rubygems_version = Gem::Requirement.new('>= 0') if s.respond_to? :required_rubygems_version=
10
+ s.required_ruby_version = '>= 2.5'
11
+
10
12
  s.authors = ['J Smith']
11
13
  s.description = 'An ffi wrapper for GEOS, a C++ port of the Java Topology Suite (JTS).'
12
14
  s.summary = s.description
@@ -22,4 +24,7 @@ Gem::Specification.new do |s|
22
24
  s.require_paths = ['lib']
23
25
 
24
26
  s.add_dependency('ffi', ['>= 1.0.0'])
27
+ s.metadata = {
28
+ 'rubygems_mfa_required' => 'true'
29
+ }
25
30
  end
@@ -36,7 +36,7 @@ module Geos
36
36
  end
37
37
  end
38
38
 
39
- def self.release(ptr) #:nodoc:
39
+ def self.release(ptr) # :nodoc:
40
40
  FFIGeos.GEOSBufferParams_destroy_r(Geos.current_handle_pointer, ptr)
41
41
  end
42
42
 
@@ -123,7 +123,7 @@ module Geos
123
123
  @z = CoordinateAccessor.new(self, 2)
124
124
  end
125
125
 
126
- def self.release(ptr) #:nodoc:
126
+ def self.release(ptr) # :nodoc:
127
127
  FFIGeos.GEOSCoordSeq_destroy_r(Geos.current_handle_pointer, ptr)
128
128
  end
129
129
 
@@ -287,7 +287,7 @@ module Geos
287
287
  RUBY
288
288
  end
289
289
 
290
- def snap_to_grid!(*args)
290
+ def snap_to_grid!(*args, **kwargs)
291
291
  grid = {
292
292
  offset_x: 0, # 1
293
293
  offset_y: 0, # 2
@@ -299,8 +299,8 @@ module Geos
299
299
 
300
300
  if args.length == 1 && args[0].is_a?(Numeric)
301
301
  grid[:size_x] = grid[:size_y] = grid[:size_z] = args[0]
302
- elsif args[0].is_a?(Hash)
303
- grid.merge!(args[0])
302
+ elsif !kwargs.empty?
303
+ grid.merge!(kwargs)
304
304
  end
305
305
 
306
306
  grid[:size_x] = grid[:size_y] = grid[:size_z] = grid[:size] if grid[:size]
@@ -321,11 +321,11 @@ module Geos
321
321
  end
322
322
 
323
323
  length.times do |i|
324
- x[i] = ((x[i] - grid[:offset_x]) / grid[:size_x]).round * grid[:size_x] + grid[:offset_x] if grid[:size_x] != 0
324
+ x[i] = (((x[i] - grid[:offset_x]) / grid[:size_x]).round * grid[:size_x]) + grid[:offset_x] if grid[:size_x] != 0
325
325
 
326
- y[i] = ((y[i] - grid[:offset_y]) / grid[:size_y]).round * grid[:size_y] + grid[:offset_y] if grid[:size_y] != 0
326
+ y[i] = (((y[i] - grid[:offset_y]) / grid[:size_y]).round * grid[:size_y]) + grid[:offset_y] if grid[:size_y] != 0
327
327
 
328
- z[i] = ((z[i] - grid[:offset_z]) / grid[:size_z]).round * grid[:size_z] + grid[:offset_z] if has_z? && grid[:size_z] != 0
328
+ z[i] = (((z[i] - grid[:offset_z]) / grid[:size_z]).round * grid[:size_z]) + grid[:offset_z] if has_z? && grid[:size_z] != 0
329
329
  end
330
330
 
331
331
  cs = remove_duplicate_coords
@@ -334,7 +334,7 @@ module Geos
334
334
  self
335
335
  end
336
336
 
337
- def snap_to_grid(*args)
337
+ def snap_to_grid(*args, **)
338
338
  dup.snap_to_grid!(*args)
339
339
  end
340
340
 
@@ -353,17 +353,17 @@ module Geos
353
353
  y = self.y[i]
354
354
  z = self.z[i]
355
355
 
356
- self.x[i] = options[:afac] * x + options[:bfac] * y + options[:cfac] * z + options[:xoff]
357
- self.y[i] = options[:dfac] * x + options[:efac] * y + options[:ffac] * z + options[:yoff]
358
- self.z[i] = options[:gfac] * x + options[:hfac] * y + options[:ifac] * z + options[:zoff]
356
+ self.x[i] = (options[:afac] * x) + (options[:bfac] * y) + (options[:cfac] * z) + options[:xoff]
357
+ self.y[i] = (options[:dfac] * x) + (options[:efac] * y) + (options[:ffac] * z) + options[:yoff]
358
+ self.z[i] = (options[:gfac] * x) + (options[:hfac] * y) + (options[:ifac] * z) + options[:zoff]
359
359
  end
360
360
  else
361
361
  length.times do |i|
362
362
  x = self.x[i]
363
363
  y = self.y[i]
364
364
 
365
- self.x[i] = options[:afac] * x + options[:bfac] * y + options[:xoff]
366
- self.y[i] = options[:dfac] * x + options[:efac] * y + options[:yoff]
365
+ self.x[i] = (options[:afac] * x) + (options[:bfac] * y) + options[:xoff]
366
+ self.y[i] = (options[:dfac] * x) + (options[:efac] * y) + options[:yoff]
367
367
  end
368
368
  end
369
369
 
@@ -395,8 +395,8 @@ module Geos
395
395
  gfac: 0,
396
396
  hfac: 0,
397
397
  ifac: 1,
398
- xoff: origin[0] - Math.cos(radians) * origin[0] + Math.sin(radians) * origin[1],
399
- yoff: origin[1] - Math.sin(radians) * origin[0] - Math.cos(radians) * origin[1],
398
+ xoff: origin[0] - (Math.cos(radians) * origin[0]) + (Math.sin(radians) * origin[1]),
399
+ yoff: origin[1] - (Math.sin(radians) * origin[0]) - (Math.cos(radians) * origin[1]),
400
400
  zoff: 0
401
401
  )
402
402
  end
@@ -455,9 +455,9 @@ module Geos
455
455
  dup.rotate!(radians)
456
456
  end
457
457
 
458
- def scale!(*args)
459
- x, y, z = if args.length == 1 && args[0].is_a?(Hash)
460
- args[0].values_at(:x, :y, :z)
458
+ def scale!(*args, **kwargs)
459
+ x, y, z = if !kwargs.empty?
460
+ kwargs.values_at(:x, :y, :z)
461
461
  elsif args.length.between?(1, 3)
462
462
  args.values_at(0...3)
463
463
  else
@@ -480,13 +480,13 @@ module Geos
480
480
  )
481
481
  end
482
482
 
483
- def scale(*args)
484
- dup.scale!(*args)
483
+ def scale(*args, **kwargs)
484
+ dup.scale!(*args, **kwargs)
485
485
  end
486
486
 
487
- def trans_scale!(*args)
488
- delta_x, delta_y, x_factor, y_factor = if args.length == 1 && args[0].is_a?(Hash)
489
- args[0].values_at(:delta_x, :delta_y, :x_factor, :y_factor)
487
+ def trans_scale!(*args, **kwargs)
488
+ delta_x, delta_y, x_factor, y_factor = if !kwargs.empty?
489
+ kwargs.values_at(:delta_x, :delta_y, :x_factor, :y_factor)
490
490
  elsif args.length.between?(1, 4)
491
491
  args.values_at(0...4)
492
492
  else
@@ -514,13 +514,13 @@ module Geos
514
514
  )
515
515
  end
516
516
 
517
- def trans_scale(*args)
518
- dup.trans_scale!(*args)
517
+ def trans_scale(*args, **kwargs)
518
+ dup.trans_scale!(*args, **kwargs)
519
519
  end
520
520
 
521
- def translate!(*args)
522
- x, y, z = if args.length == 1 && args[0].is_a?(Hash)
523
- args[0].values_at(:x, :y, :z)
521
+ def translate!(*args, **kwargs)
522
+ x, y, z = if !kwargs.empty?
523
+ kwargs.values_at(:x, :y, :z)
524
524
  elsif args.length.between?(1, 3)
525
525
  args.values_at(0...3)
526
526
  else
@@ -543,17 +543,17 @@ module Geos
543
543
  )
544
544
  end
545
545
 
546
- def translate(*args)
547
- dup.translate!(*args)
546
+ def translate(*args, **kwargs)
547
+ dup.translate!(*args, **kwargs)
548
548
  end
549
549
 
550
550
  protected
551
551
 
552
- def check_bounds(idx) #:nodoc:
552
+ def check_bounds(idx) # :nodoc:
553
553
  raise Geos::IndexBoundsError, 'Index out of bounds' if idx.negative? || idx >= length
554
554
  end
555
555
 
556
- def build_coordinate(n) #:nodoc:
556
+ def build_coordinate(n) # :nodoc:
557
557
  [
558
558
  get_x(n),
559
559
  (dimensions >= 2 ? get_y(n) : nil),
@@ -38,7 +38,7 @@ module Geos
38
38
  self.srid = source.srid
39
39
  end
40
40
 
41
- def self.release(ptr) #:nodoc:
41
+ def self.release(ptr) # :nodoc:
42
42
  FFIGeos.GEOSGeom_destroy_r(Geos.current_handle_pointer, ptr)
43
43
  end
44
44
 
@@ -330,7 +330,7 @@ module Geos
330
330
  bool_result(FFIGeos.GEOSCovers_r(Geos.current_handle_pointer, ptr, geom.ptr))
331
331
  end
332
332
  else
333
- def covers?(geom) #:nodoc:
333
+ def covers?(geom) # :nodoc:
334
334
  check_geometry(geom)
335
335
  !!%w{
336
336
  T*****FF*
@@ -352,7 +352,7 @@ module Geos
352
352
  bool_result(FFIGeos.GEOSCoveredBy_r(Geos.current_handle_pointer, ptr, geom.ptr))
353
353
  end
354
354
  else
355
- def covered_by?(geom) #:nodoc:
355
+ def covered_by?(geom) # :nodoc:
356
356
  check_geometry(geom)
357
357
  !!%w{
358
358
  T*F**F***
@@ -386,7 +386,7 @@ module Geos
386
386
 
387
387
  def eql_almost?(other, decimal = 6)
388
388
  check_geometry(other)
389
- bool_result(FFIGeos.GEOSEqualsExact_r(Geos.current_handle_pointer, ptr, other.ptr, 0.5 * 10 ** -decimal))
389
+ bool_result(FFIGeos.GEOSEqualsExact_r(Geos.current_handle_pointer, ptr, other.ptr, 0.5 * (10 ** -decimal)))
390
390
  end
391
391
  alias equals_almost? eql_almost?
392
392
  alias almost_equals? eql_almost?
@@ -441,7 +441,7 @@ module Geos
441
441
 
442
442
  # GEOS versions prior to 3.3.0 didn't handle exceptions and can crash on
443
443
  # bad input.
444
- if FFIGeos.respond_to?(:GEOSProject_r) && Geos::GEOS_VERSION >= '3.3.0'
444
+ if FFIGeos.respond_to?(:GEOSProject_r) && Geos::GEOS_NICE_VERSION >= '030300'
445
445
  def project(geom, normalized = false)
446
446
  raise TypeError, 'Expected Geos::Point type' unless geom.is_a?(Geos::Point)
447
447
 
@@ -82,18 +82,18 @@ module Geos
82
82
  translate
83
83
  }.each do |m|
84
84
  class_eval(<<-RUBY, __FILE__, __LINE__ + 1)
85
- def #{m}!(*args)
85
+ def #{m}!(*args, **kwargs)
86
86
  unless self.empty?
87
87
  self.num_geometries.times do |i|
88
- self[i].#{m}!(*args)
88
+ self[i].#{m}!(*args, **kwargs)
89
89
  end
90
90
  end
91
91
 
92
92
  self
93
93
  end
94
94
 
95
- def #{m}(*args)
96
- ret = self.dup.#{m}!(*args)
95
+ def #{m}(*args, **kwargs)
96
+ ret = self.dup.#{m}!(*args, **kwargs)
97
97
  ret.srid = pick_srid_according_to_policy(self.srid)
98
98
  ret
99
99
  end
@@ -42,7 +42,7 @@ module Geos
42
42
  end
43
43
  alias slice []
44
44
 
45
- def offset_curve(width, options = {})
45
+ def offset_curve(width, **options)
46
46
  options = Constants::BUFFER_PARAM_DEFAULTS.merge(options)
47
47
 
48
48
  cast_geometry_ptr(
@@ -81,7 +81,7 @@ module Geos
81
81
  cur_path.concat(to_a)
82
82
  end
83
83
 
84
- def snap_to_grid!(*args)
84
+ def snap_to_grid!(*args, **)
85
85
  unless empty?
86
86
  cs = coord_seq.snap_to_grid!(*args)
87
87
 
@@ -97,7 +97,7 @@ module Geos
97
97
  self
98
98
  end
99
99
 
100
- def snap_to_grid(*args)
100
+ def snap_to_grid(*args, **)
101
101
  ret = dup.snap_to_grid!(*args)
102
102
  ret.srid = pick_srid_according_to_policy(srid)
103
103
  ret
@@ -126,9 +126,9 @@ module Geos
126
126
  dseg = (fraction - total_length) / seg_length
127
127
 
128
128
  args = []
129
- args << p_1.x + ((p_2.x - p_1.x) * dseg)
130
- args << p_1.y + ((p_2.y - p_1.y) * dseg)
131
- args << p_1.z + ((p_2.z - p_1.z) * dseg) if has_z?
129
+ args << (p_1.x + ((p_2.x - p_1.x) * dseg))
130
+ args << (p_1.y + ((p_2.y - p_1.y) * dseg))
131
+ args << (p_1.z + ((p_2.z - p_1.z) * dseg)) if has_z?
132
132
 
133
133
  args << { srid: pick_srid_according_to_policy(srid) } unless srid.zero?
134
134
 
@@ -193,16 +193,16 @@ module Geos
193
193
  translate
194
194
  }.each do |m|
195
195
  class_eval(<<-RUBY, __FILE__, __LINE__ + 1)
196
- def #{m}!(*args)
196
+ def #{m}!(*args, **kwargs)
197
197
  unless self.empty?
198
- self.coord_seq.#{m}!(*args)
198
+ self.coord_seq.#{m}!(*args, **kwargs)
199
199
  end
200
200
 
201
201
  self
202
202
  end
203
203
 
204
- def #{m}(*args)
205
- ret = self.dup.#{m}!(*args)
204
+ def #{m}(*args, **kwargs)
205
+ ret = self.dup.#{m}!(*args, **kwargs)
206
206
  ret.srid = pick_srid_according_to_policy(self.srid)
207
207
  ret
208
208
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Geos
4
4
  class MultiLineString < GeometryCollection
5
- if FFIGeos.respond_to?(:GEOSisClosed_r) && Geos::GEOS_VERSION >= '3.5.0'
5
+ if FFIGeos.respond_to?(:GEOSisClosed_r) && Geos::GEOS_NICE_VERSION >= '030500'
6
6
  # Available in GEOS 3.5.0+.
7
7
  def closed?
8
8
  bool_result(FFIGeos.GEOSisClosed_r(Geos.current_handle_pointer, ptr))
@@ -118,16 +118,16 @@ module Geos
118
118
  translate
119
119
  }.each do |m|
120
120
  class_eval(<<-RUBY, __FILE__, __LINE__ + 1)
121
- def #{m}!(*args)
121
+ def #{m}!(*args, **kwargs)
122
122
  unless empty?
123
- coord_seq.#{m}!(*args)
123
+ coord_seq.#{m}!(*args, **kwargs)
124
124
  end
125
125
 
126
126
  self
127
127
  end
128
128
 
129
- def #{m}(*args)
130
- ret = dup.#{m}!(*args)
129
+ def #{m}(*args, **kwargs)
130
+ ret = dup.#{m}!(*args, **kwargs)
131
131
  ret.srid = pick_srid_according_to_policy(srid)
132
132
  ret
133
133
  end
@@ -125,16 +125,16 @@ module Geos
125
125
  translate
126
126
  }.each do |m|
127
127
  class_eval(<<-RUBY, __FILE__, __LINE__ + 1)
128
- def #{m}!(*args)
129
- exterior_ring.coord_seq.#{m}!(*args)
128
+ def #{m}!(*args, **kwargs)
129
+ exterior_ring.coord_seq.#{m}!(*args, **kwargs)
130
130
  interior_rings.each do |ring|
131
131
  ring.coord_seq.#{m}!(*args)
132
132
  end
133
133
  self
134
134
  end
135
135
 
136
- def #{m}(*args)
137
- ret = dup.#{m}!(*args)
136
+ def #{m}(*args, **kwargs)
137
+ ret = dup.#{m}!(*args, **kwargs)
138
138
  ret.srid = pick_srid_according_to_policy(srid)
139
139
  ret
140
140
  end
@@ -24,7 +24,7 @@ module Geos
24
24
  @ptr.autorelease = !!options[:auto_free]
25
25
  end
26
26
 
27
- def self.release(ptr) #:nodoc:
27
+ def self.release(ptr) # :nodoc:
28
28
  FFIGeos.GEOSPreparedGeom_destroy_r(Geos.current_handle_pointer, ptr)
29
29
  end
30
30
 
@@ -60,7 +60,7 @@ module Geos
60
60
  end
61
61
  end
62
62
 
63
- def self.release(ptr) #:nodoc:
63
+ def self.release(ptr) # :nodoc:
64
64
  FFIGeos.GEOSSTRtree_destroy_r(Geos.current_handle_pointer, ptr)
65
65
  end
66
66
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Geos
4
- VERSION = '2.2.0'
4
+ VERSION = '2.3.0'
5
5
  end
@@ -34,7 +34,7 @@ module Geos
34
34
  raise ParseError, e
35
35
  end
36
36
 
37
- def self.release(ptr) #:nodoc:
37
+ def self.release(ptr) # :nodoc:
38
38
  FFIGeos.GEOSWKBReader_destroy_r(Geos.current_handle_pointer, ptr)
39
39
  end
40
40
  end
@@ -20,7 +20,7 @@ module Geos
20
20
  set_options(options)
21
21
  end
22
22
 
23
- def self.release(ptr) #:nodoc:
23
+ def self.release(ptr) # :nodoc:
24
24
  FFIGeos.GEOSWKBWriter_destroy_r(Geos.current_handle_pointer, ptr)
25
25
  end
26
26
 
@@ -85,7 +85,7 @@ module Geos
85
85
 
86
86
  private
87
87
 
88
- def set_options(options) #:nodoc:
88
+ def set_options(options) # :nodoc:
89
89
  self.include_srid = options[:include_srid] if options.key?(:include_srid)
90
90
  end
91
91
  end
@@ -28,7 +28,7 @@ module Geos
28
28
  raise ParseError, e
29
29
  end
30
30
 
31
- def self.release(ptr) #:nodoc:
31
+ def self.release(ptr) # :nodoc:
32
32
  FFIGeos.GEOSWKTReader_destroy_r(Geos.current_handle_pointer, ptr)
33
33
  end
34
34
  end
@@ -21,11 +21,11 @@ module Geos
21
21
  set_options(options)
22
22
  end
23
23
 
24
- def self.release(ptr) #:nodoc:
24
+ def self.release(ptr) # :nodoc:
25
25
  FFIGeos.GEOSWKTWriter_destroy_r(Geos.current_handle_pointer, ptr)
26
26
  end
27
27
 
28
- def set_options(options) #:nodoc:
28
+ def set_options(options) # :nodoc:
29
29
  [:trim, :old_3d, :rounding_precision, :output_dimensions].each do |k|
30
30
  send("#{k}=", options[k]) if respond_to?("#{k}=") && options.key?(k)
31
31
  end
data/lib/ffi-geos.rb CHANGED
@@ -56,7 +56,7 @@ module Geos
56
56
  elsif FFI::Platform::IS_WINDOWS
57
57
  ENV['PATH'].split(File::PATH_SEPARATOR)
58
58
  else
59
- ['/usr/local/{lib64,lib}', '/opt/local/{lib64,lib}', '/usr/{lib64,lib}', '/usr/lib/{x86_64,i386}-linux-gnu']
59
+ ['/usr/local/{lib64,lib}', '/opt/local/{lib64,lib}', '/usr/{lib64,lib}', '/usr/lib/{x86_64,i386,aarch64}-linux-gnu']
60
60
  end
61
61
  end
62
62
 
@@ -1363,12 +1363,14 @@ module Geos
1363
1363
  GEOS_CAPI_VERSION,
1364
1364
  GEOS_CAPI_VERSION_MAJOR, GEOS_CAPI_VERSION_MINOR, GEOS_CAPI_VERSION_PATCH,
1365
1365
  GEOS_SVN_REVISION =
1366
- if !(versions = Geos.version.scan(/^
1366
+ if (versions = Geos.version.scan(/^
1367
1367
  ((\d+)\.(\d+)\.(\d+)((?:dev|rc|beta|alpha)\d*)?)
1368
1368
  -CAPI-
1369
1369
  ((\d+)\.(\d+)\.(\d+))
1370
1370
  (?:\s+r?(\h+))?
1371
1371
  $/x)).empty?
1372
+ ['0.0.0', 0, 0, 0, nil, '0.0.0', 0, 0, 0]
1373
+ else
1372
1374
  versions = versions[0]
1373
1375
  [
1374
1376
  versions[0],
@@ -1382,11 +1384,13 @@ module Geos
1382
1384
  versions[8].to_i,
1383
1385
  versions[9]&.to_i
1384
1386
  ]
1385
- else
1386
- ['0.0.0', 0, 0, 0, nil, '0.0.0', 0, 0, 0]
1387
1387
  end
1388
1388
  GEOS_CAPI_FIRST_INTERFACE = GEOS_CAPI_VERSION_MAJOR.to_i
1389
1389
  GEOS_CAPI_LAST_INTERFACE = GEOS_CAPI_VERSION_MAJOR.to_i + GEOS_CAPI_VERSION_MINOR.to_i
1390
+
1391
+ GEOS_NICE_VERSION = [GEOS_VERSION_MAJOR, GEOS_VERSION_MINOR, GEOS_VERSION_PATCH].collect { |version|
1392
+ version.to_s.rjust(2, '0')
1393
+ }.join
1390
1394
  end
1391
1395
 
1392
1396
  module Constants
@@ -2,15 +2,15 @@ sonar.projectKey=dark-panda_ffi-geos
2
2
  sonar.organization=dark-panda
3
3
 
4
4
  # This is the name and version displayed in the SonarCloud UI.
5
- #sonar.projectName=ffi-geos
6
- #sonar.projectVersion=1.0
5
+ sonar.projectName=ffi-geos
6
+ sonar.projectVersion=1.0
7
7
 
8
8
  # Path is relative to the sonar-project.properties file. Replace "\" by "/" on Windows.
9
9
  sonar.sources=lib, test
10
10
 
11
11
  # Encoding of the source code. Default is default system encoding
12
- #sonar.sourceEncoding=UTF-8
12
+ sonar.sourceEncoding=UTF-8
13
13
 
14
14
  # Additional reports
15
15
  sonar.ruby.rubocop.reportPaths=rubocop-report.json
16
- sonar.ruby.coverage.reportPaths=coverage/.resultset.json
16
+ sonar.ruby.coverage.reportPaths=coverage/coverage.json
@@ -515,16 +515,16 @@ class CoordinateSequenceTests < Minitest::Test
515
515
  end
516
516
 
517
517
  undef :affine_tester
518
- def affine_tester(method, expected, coords, *args)
518
+ def affine_tester(method, expected, coords, *args, **options)
519
519
  cs = Geos::CoordinateSequence.new(coords)
520
- cs.send("#{method}!", *args)
520
+ cs.__safe_send__("#{method}!", *args, **options)
521
521
 
522
522
  expected.length.times do |i|
523
523
  assert_in_delta(expected[i], cs.get_ordinate(0, i), TOLERANCE)
524
524
  end
525
525
 
526
526
  cs = Geos::CoordinateSequence.new(coords)
527
- cs_2 = cs.send(method, *args)
527
+ cs_2 = cs.__safe_send__(method, *args, **options)
528
528
 
529
529
  expected.length.times do |i|
530
530
  assert_in_delta(coords[i], cs.get_ordinate(0, i), TOLERANCE)
@@ -542,21 +542,21 @@ class CoordinateSequenceTests < Minitest::Test
542
542
  def test_rotate_x
543
543
  affine_tester(:rotate_x, [1, -1, -1], [1, 1, 1], Math::PI)
544
544
  affine_tester(:rotate_x, [1, -1, 1], [1, 1, 1], Math::PI / 2)
545
- affine_tester(:rotate_x, [1, 1, -1], [1, 1, 1], Math::PI + Math::PI / 2)
545
+ affine_tester(:rotate_x, [1, 1, -1], [1, 1, 1], Math::PI + (Math::PI / 2))
546
546
  affine_tester(:rotate_x, [1, 1, 1], [1, 1, 1], Math::PI * 2)
547
547
  end
548
548
 
549
549
  def test_rotate_y
550
550
  affine_tester(:rotate_y, [-1, 1, -1], [1, 1, 1], Math::PI)
551
551
  affine_tester(:rotate_y, [1, 1, -1], [1, 1, 1], Math::PI / 2)
552
- affine_tester(:rotate_y, [-1, 1, 1], [1, 1, 1], Math::PI + Math::PI / 2)
552
+ affine_tester(:rotate_y, [-1, 1, 1], [1, 1, 1], Math::PI + (Math::PI / 2))
553
553
  affine_tester(:rotate_y, [1, 1, 1], [1, 1, 1], Math::PI * 2)
554
554
  end
555
555
 
556
556
  def test_rotate_z
557
557
  affine_tester(:rotate_z, [-1, -1], [1, 1], Math::PI)
558
558
  affine_tester(:rotate_z, [-1, 1], [1, 1], Math::PI / 2)
559
- affine_tester(:rotate_z, [1, -1], [1, 1], Math::PI + Math::PI / 2)
559
+ affine_tester(:rotate_z, [1, -1], [1, 1], Math::PI + (Math::PI / 2))
560
560
  affine_tester(:rotate_z, [1, 1], [1, 1], Math::PI * 2)
561
561
  end
562
562
 
@@ -174,7 +174,7 @@ class GeometryCollectionTests < Minitest::Test
174
174
 
175
175
  def test_snap_to_grid
176
176
  wkt = 'GEOMETRYCOLLECTION (LINESTRING (-10.12 0, -10.12 5, -10.12 5, -10.12 6, -10.12 6, -10.12 6, -10.12 7, -10.12 7, -10.12 7, -10.12 8, -10.12 8, -9 8, -9 9, -10.12 0), ' \
177
- 'POLYGON ((-10.12 0, -10.12 5, -10.12 5, -10.12 6, -10.12 6, -10.12 6, -10.12 7, -10.12 7, -10.12 7, -10.12 8, -10.12 8, -9 8, -9 9, -10.12 0)), POINT (10.12 10.12))'
177
+ 'POLYGON ((-10.12 0, -10.12 5, -10.12 5, -10.12 6, -10.12 6, -10.12 6, -10.12 7, -10.12 7, -10.12 7, -10.12 8, -10.12 8, -9 8, -9 9, -10.12 0)), POINT (10.12 10.12))'
178
178
 
179
179
  expected = 'GEOMETRYCOLLECTION (LINESTRING (-10 0, -10 5, -10 5, -10 6, -10 6, -10 6, -10 7, -10 7, -10 7, -10 8, -10 8, -9 8, -9 9, -10 0), POLYGON ((-10 0, -10 5, -10 5, -10 6, -10 6, -10 6, -10 7, -10 7, -10 7, -10 8, -10 8, -9 8, -9 9, -10 0)), POINT (10 10))'
180
180
 
@@ -255,7 +255,7 @@ class GeometryCollectionTests < Minitest::Test
255
255
  affine_tester(:rotate_x,
256
256
  'GEOMETRYCOLLECTION Z (POINT Z (1 1 -1), LINESTRING Z (1 1 -1, 10 10 -10), POLYGON Z ((0 0 0, 5 0 0, 5 0 -5, 0 0 -5, 0 0 0)))',
257
257
  wkt,
258
- Math::PI + Math::PI / 2)
258
+ Math::PI + (Math::PI / 2))
259
259
 
260
260
  affine_tester(:rotate_x,
261
261
  wkt,
@@ -282,7 +282,7 @@ class GeometryCollectionTests < Minitest::Test
282
282
  affine_tester(:rotate_y,
283
283
  'GEOMETRYCOLLECTION Z (POINT Z (-1 1 1), LINESTRING Z (-1 1 1, -10 10 10), POLYGON Z ((0 0 0, 0 0 5, 0 5 5, 0 5 0, 0 0 0)))',
284
284
  wkt,
285
- Math::PI + Math::PI / 2)
285
+ Math::PI + (Math::PI / 2))
286
286
 
287
287
  affine_tester(:rotate_y,
288
288
  wkt,
@@ -308,7 +308,7 @@ class GeometryCollectionTests < Minitest::Test
308
308
  affine_tester(:rotate_z,
309
309
  'GEOMETRYCOLLECTION (POINT (1 -1), LINESTRING (0 0, 10 -10), POLYGON ((0 0, 0 -5, 5 -5, 5 0, 0 0)))',
310
310
  wkt,
311
- Math::PI + Math::PI / 2)
311
+ Math::PI + (Math::PI / 2))
312
312
 
313
313
  affine_tester(:rotate_z,
314
314
  wkt,