pg 1.2.0 → 1.2.3

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: e1618ae02150b1bed4ee83669aff1133e74d07f0a9ccdf2e3cee3a6a57ba738f
4
- data.tar.gz: 5c70825cf567d526e5e11679f88806e3c1723acb301bc356992df417575b8d3a
3
+ metadata.gz: 0bbf07a6db2bae71c6f6eee0b440f27f84ae21de66dbd97536499425cdbc9b54
4
+ data.tar.gz: 8860905a7fdb97cd007530b831ee8bf39f06c2c79d52361c7a825f897374830f
5
5
  SHA512:
6
- metadata.gz: f55fc75632dc1c60b1620f83cadcc961cf601f50bb30a878159ddbca10eaaccf0ee9ff2028fbb2e74f979d570c1b809d07224fc4bd664e15ecf5fb05ec8398e2
7
- data.tar.gz: d92e3c96466f13a8679c9ac68d14a01c1fd2133efc637d7e0dd4c0f3649ffbc769a1f100b8bbe705b5a4d9cdb5d8921b1a6b19ad34eee6d7a73eff31de9480c7
6
+ metadata.gz: 5a304ec0488a34e03f257769d710dfd1b4e7261023c88bf91945f0c7af99178885c32ba920931dda01776dbc2a613de66d8cf86ee10d57c231ae44fba2544acf
7
+ data.tar.gz: 88aaaedfd420a601836c3c924b9e6c6e97770f9d16de62c6121c8420967ef43501c2988d8006e9d3261388af570590cadf27a806c72ca574796d76be013e4831
Binary file
data.tar.gz.sig CHANGED
Binary file
@@ -1,3 +1,26 @@
1
+ == v1.2.3 [2020-03-18] Michael Granger <ged@FaerieMUD.org>
2
+
3
+ Bugfixes:
4
+
5
+ - Fix possible segfault at `PG::Coder#encode`, `decode` or their implicit calls through
6
+ a typemap after GC.compact. #327
7
+ - Fix possible segfault in `PG::TypeMapByClass` after GC.compact. #328
8
+
9
+
10
+ == v1.2.2 [2020-01-06] Michael Granger <ged@FaerieMUD.org>
11
+
12
+ Enhancements:
13
+
14
+ - Add a binary gem for Ruby 2.7.
15
+
16
+
17
+ == v1.2.1 [2020-01-02] Michael Granger <ged@FaerieMUD.org>
18
+
19
+ Enhancements:
20
+
21
+ - Added internal API for sequel_pg compatibility.
22
+
23
+
1
24
  == v1.2.0 [2019-12-20] Michael Granger <ged@FaerieMUD.org>
2
25
 
3
26
  Repository:
@@ -39,7 +39,7 @@ A small example usage:
39
39
  * Ruby 2.2 or newer
40
40
  * PostgreSQL 9.2.x or later (with headers, -dev packages, etc).
41
41
 
42
- It usually work with earlier versions of Ruby/PostgreSQL as well, but those are
42
+ It usually works with earlier versions of Ruby/PostgreSQL as well, but those are
43
43
  not regularly tested.
44
44
 
45
45
 
@@ -118,7 +118,7 @@ PG::Coder objects can be used to set up a PG::TypeMap or alternatively
118
118
  to convert single values to/from their string representation.
119
119
 
120
120
  The following PostgreSQL column types are supported by ruby-pg (TE = Text Encoder, TD = Text Decoder, BE = Binary Encoder, BD = Binary Decoder):
121
- * Integer: {TE}[rdoc-ref:PG::TextEncoder::Integer], {TD}[rdoc-ref:PG::TextDecoder::Integer], {BD}[rdoc-ref:PG::BinaryDecoder::Integer]
121
+ * Integer: {TE}[rdoc-ref:PG::TextEncoder::Integer], {TD}[rdoc-ref:PG::TextDecoder::Integer], {BD}[rdoc-ref:PG::BinaryDecoder::Integer] 💡 No links? Switch to {here}[https://deveiate.org/code/pg/README_rdoc.html#label-Type+Casts] 💡
122
122
  * BE: {Int2}[rdoc-ref:PG::BinaryEncoder::Int2], {Int4}[rdoc-ref:PG::BinaryEncoder::Int4], {Int8}[rdoc-ref:PG::BinaryEncoder::Int8]
123
123
  * Float: {TE}[rdoc-ref:PG::TextEncoder::Float], {TD}[rdoc-ref:PG::TextDecoder::Float], {BD}[rdoc-ref:PG::BinaryDecoder::Float]
124
124
  * Numeric: {TE}[rdoc-ref:PG::TextEncoder::Numeric], {TD}[rdoc-ref:PG::TextDecoder::Numeric]
data/Rakefile CHANGED
@@ -35,6 +35,8 @@ TEST_DIRECTORY = BASEDIR + "tmp_test_specs"
35
35
 
36
36
  CLOBBER.include( TEST_DIRECTORY.to_s )
37
37
  CLEAN.include( PKGDIR.to_s, TMPDIR.to_s )
38
+ CLEAN.include "lib/*/libpq.dll"
39
+ CLEAN.include "lib/pg_ext.*"
38
40
 
39
41
  # Set up Hoe plugins
40
42
  Hoe.plugin :mercurial
@@ -61,7 +63,7 @@ $hoespec = Hoe.spec 'pg' do
61
63
  self.developer 'Lars Kanis', 'lars@greiz-reinsdorf.de'
62
64
 
63
65
  self.dependency 'rake-compiler', '~> 1.0', :developer
64
- self.dependency 'rake-compiler-dock', ['~> 0.7.0'], :developer
66
+ self.dependency 'rake-compiler-dock', ['~> 1.0'], :developer
65
67
  self.dependency 'hoe-deveiate', '~> 0.9', :developer
66
68
  self.dependency 'hoe-bundler', '~> 1.0', :developer
67
69
  self.dependency 'rspec', '~> 3.5', :developer
@@ -113,7 +115,7 @@ Rake::ExtensionTask.new do |ext|
113
115
  ext.lib_dir = 'lib'
114
116
  ext.source_pattern = "*.{c,h}"
115
117
  ext.cross_compile = true
116
- ext.cross_platform = CrossLibraries.map &:for_platform
118
+ ext.cross_platform = CrossLibraries.map(&:for_platform)
117
119
 
118
120
  ext.cross_config_options += CrossLibraries.map do |lib|
119
121
  {
@@ -129,7 +131,7 @@ Rake::ExtensionTask.new do |ext|
129
131
 
130
132
  # Add libpq.dll to windows binary gemspec
131
133
  ext.cross_compiling do |spec|
132
- spec.files << "lib/libpq.dll"
134
+ spec.files << "lib/#{spec.platform}/libpq.dll"
133
135
  end
134
136
  end
135
137
 
@@ -37,7 +37,7 @@ class CrossLibrary < OpenStruct
37
37
  begin
38
38
  FileUtils.rm_f '.test_symlink'
39
39
  FileUtils.ln_s '/', '.test_symlink'
40
- rescue SystemCallError
40
+ rescue NotImplementedError, SystemCallError
41
41
  # Symlinks don't work -> use home directory instead
42
42
  self.compile_home = Pathname( "~/.ruby-pg-build" ).expand_path
43
43
  else
@@ -45,6 +45,8 @@ class CrossLibrary < OpenStruct
45
45
  end
46
46
  self.static_sourcesdir = compile_home + 'sources'
47
47
  self.static_builddir = compile_home + 'builds' + for_platform
48
+ CLOBBER.include( static_sourcesdir )
49
+ CLEAN.include( static_builddir )
48
50
 
49
51
  # Static OpenSSL build vars
50
52
  self.static_openssl_builddir = static_builddir + "openssl-#{openssl_version}"
@@ -81,17 +83,6 @@ class CrossLibrary < OpenStruct
81
83
  # clean intermediate files and folders
82
84
  CLEAN.include( static_builddir.to_s )
83
85
 
84
-
85
- def download(url, save_to)
86
- part = save_to+".part"
87
- sh "wget #{url.to_s.inspect} -O #{part.inspect} || curl #{url.to_s.inspect} -o #{part.inspect}"
88
- FileUtils.mv part, save_to
89
- end
90
-
91
- def run(*args)
92
- sh *args
93
- end
94
-
95
86
  #####################################################################
96
87
  ### C R O S S - C O M P I L A T I O N - T A S K S
97
88
  #####################################################################
@@ -141,9 +132,9 @@ class CrossLibrary < OpenStruct
141
132
  end
142
133
 
143
134
  desc "compile static openssl libraries"
144
- task :openssl_libs => [ libssl, libcrypto ]
135
+ task "openssl_libs:#{for_platform}" => [ libssl, libcrypto ]
145
136
 
146
- task :compile_static_openssl => openssl_makefile do |t|
137
+ task "compile_static_openssl:#{for_platform}" => openssl_makefile do |t|
147
138
  chdir( static_openssl_builddir ) do
148
139
  cmd = cmd_prelude.dup
149
140
  cmd << 'make' << "-j#{NUM_CPUS}" << 'build_libs'
@@ -153,12 +144,12 @@ class CrossLibrary < OpenStruct
153
144
  end
154
145
 
155
146
  desc "compile static #{libssl}"
156
- file libssl => :compile_static_openssl do |t|
147
+ file libssl => "compile_static_openssl:#{for_platform}" do |t|
157
148
  rm t.name.gsub(/\.a$/, ".dll.a")
158
149
  end
159
150
 
160
151
  desc "compile static #{libcrypto}"
161
- file libcrypto => :compile_static_openssl do |t|
152
+ file libcrypto => "compile_static_openssl:#{for_platform}" do |t|
162
153
  rm t.name.gsub(/\.a$/, ".dll.a")
163
154
  end
164
155
 
@@ -189,7 +180,7 @@ class CrossLibrary < OpenStruct
189
180
  end
190
181
 
191
182
  # generate the makefile in a clean build location
192
- file postgresql_global_makefile => [ static_postgresql_builddir, :openssl_libs ] do |t|
183
+ file postgresql_global_makefile => [ static_postgresql_builddir, "openssl_libs:#{for_platform}" ] do |t|
193
184
  options = [
194
185
  "--target=#{host_platform}",
195
186
  "--host=#{host_platform}",
@@ -231,10 +222,10 @@ class CrossLibrary < OpenStruct
231
222
 
232
223
 
233
224
  #desc 'compile libpg.a'
234
- task :libpq => postgresql_lib
225
+ task "native:#{for_platform}" => postgresql_lib
235
226
 
236
227
  # copy libpq.dll to lib dir
237
- dest_libpq = "lib/#{postgresql_lib.basename}"
228
+ dest_libpq = "lib/#{for_platform}/#{postgresql_lib.basename}"
238
229
  directory File.dirname(dest_libpq)
239
230
  file dest_libpq => [postgresql_lib, File.dirname(dest_libpq)] do
240
231
  cp postgresql_lib, dest_libpq
@@ -246,22 +237,27 @@ class CrossLibrary < OpenStruct
246
237
  cp postgresql_lib, stage_libpq
247
238
  end
248
239
  end
249
- end
250
240
 
251
- if File.exist?(File.expand_path("~/.rake-compiler/config.yml"))
252
- CrossLibraries = [
253
- ['i386-mingw32', 'mingw', 'i686-w64-mingw32'],
254
- ['x64-mingw32', 'mingw64', 'x86_64-w64-mingw32'],
255
- ].map do |platform, openssl_config, toolchain|
256
- CrossLibrary.new platform, openssl_config, toolchain
241
+ def download(url, save_to)
242
+ part = save_to+".part"
243
+ sh "wget #{url.to_s.inspect} -O #{part.inspect} || curl #{url.to_s.inspect} -o #{part.inspect}"
244
+ FileUtils.mv part, save_to
257
245
  end
258
- else
259
- $stderr.puts "Cross-compilation disabled -- rake-compiler not properly installed"
260
- CrossLibraries = []
246
+
247
+ def run(*args)
248
+ sh(*args)
249
+ end
250
+ end
251
+
252
+ CrossLibraries = [
253
+ ['x86-mingw32', 'mingw', 'i686-w64-mingw32'],
254
+ ['x64-mingw32', 'mingw64', 'x86_64-w64-mingw32'],
255
+ ].map do |platform, openssl_config, toolchain|
256
+ CrossLibrary.new platform, openssl_config, toolchain
261
257
  end
262
258
 
263
259
  desc 'cross compile pg for win32'
264
- task :cross => [ :mingw32, :libpq ]
260
+ task :cross => [ :mingw32 ]
265
261
 
266
262
  task :mingw32 do
267
263
  # Use Rake::ExtensionCompiler helpers to find the proper host
@@ -272,30 +268,32 @@ task :mingw32 do
272
268
  end
273
269
  end
274
270
 
275
- # To reduce the gem file size strip mingw32 dlls before packaging
276
- ENV['RUBY_CC_VERSION'].to_s.split(':').each do |ruby_version|
277
- task "tmp/i386-mingw32/stage/lib/#{ruby_version[/^\d+\.\d+/]}/pg_ext.so" do |t|
278
- sh "i686-w64-mingw32-strip -S tmp/i386-mingw32/stage/lib/#{ruby_version[/^\d+\.\d+/]}/pg_ext.so"
279
- end
280
-
281
- task "tmp/x64-mingw32/stage/lib/#{ruby_version[/^\d+\.\d+/]}/pg_ext.so" do |t|
282
- sh "x86_64-w64-mingw32-strip -S tmp/x64-mingw32/stage/lib/#{ruby_version[/^\d+\.\d+/]}/pg_ext.so"
283
- end
271
+ task 'gem:windows:prepare' do
272
+ require 'io/console'
273
+ require 'rake_compiler_dock'
274
+
275
+ # Copy gem signing key and certs to be accessable from the docker container
276
+ mkdir_p 'build/gem'
277
+ sh "cp ~/.gem/gem-*.pem build/gem/ || true"
278
+ sh "bundle package"
279
+ begin
280
+ OpenSSL::PKey.read(File.read(File.expand_path("~/.gem/gem-private_key.pem")), ENV["GEM_PRIVATE_KEY_PASSPHRASE"] || "")
281
+ rescue OpenSSL::PKey::PKeyError
282
+ ENV["GEM_PRIVATE_KEY_PASSPHRASE"] = STDIN.getpass("Enter passphrase of gem signature key: ")
283
+ retry
284
+ end
284
285
  end
285
286
 
286
- desc "Build the windows binary gems"
287
- task 'gem:windows' => ['ChangeLog'] do
288
- require 'rake_compiler_dock'
289
-
290
- # Copy gem signing key and certs to be accessable from the docker container
291
- mkdir_p 'build/gem'
292
- sh "cp ~/.gem/gem-*.pem build/gem/ || true"
293
- sh "bundle package"
294
-
295
- RakeCompilerDock.sh <<-EOT
296
- mkdir ~/.gem &&
297
- (cp build/gem/gem-*.pem ~/.gem/ || true) &&
298
- gem install -Ng &&
299
- rake cross native gem MAKE="make -j`nproc`"
300
- EOT
287
+ CrossLibraries.each do |xlib|
288
+ platform = xlib.for_platform
289
+ desc "Build fat binary gem for platform #{platform}"
290
+ task "gem:windows:#{platform}" => ['ChangeLog', 'gem:windows:prepare', xlib.openssl_tarball, xlib.postgresql_tarball] do
291
+ RakeCompilerDock.sh <<-EOT, platform: platform
292
+ (cp build/gem/gem-*.pem ~/.gem/ || true) &&
293
+ bundle install --local &&
294
+ rake native:#{platform} pkg/#{$hoespec.spec.full_name}-#{platform}.gem MAKE="make -j`nproc`"
295
+ EOT
296
+ end
297
+ desc "Build the windows binary gems"
298
+ multitask 'gem:windows' => "gem:windows:#{platform}"
301
299
  end
data/ext/pg.h CHANGED
@@ -304,6 +304,7 @@ VALUE pg_obj_to_i _(( VALUE ));
304
304
  VALUE pg_tmbc_allocate _(( void ));
305
305
  void pg_coder_init_encoder _(( VALUE ));
306
306
  void pg_coder_init_decoder _(( VALUE ));
307
+ void pg_coder_mark _(( t_pg_coder * ));
307
308
  char *pg_rb_str_ensure_capa _(( VALUE, long, char *, char ** ));
308
309
 
309
310
  #define PG_RB_STR_ENSURE_CAPA( str, expand_len, curr_ptr, end_ptr ) \
@@ -61,11 +61,23 @@ pg_coder_init_decoder( VALUE self )
61
61
  rb_iv_set( self, "@name", Qnil );
62
62
  }
63
63
 
64
+ void
65
+ pg_coder_mark(t_pg_coder *this)
66
+ {
67
+ rb_gc_mark(this->coder_obj);
68
+ }
69
+
70
+ static void
71
+ pg_composite_coder_mark(t_pg_composite_coder *this)
72
+ {
73
+ pg_coder_mark(&this->comp);
74
+ }
75
+
64
76
  static VALUE
65
77
  pg_simple_encoder_allocate( VALUE klass )
66
78
  {
67
79
  t_pg_coder *this;
68
- VALUE self = Data_Make_Struct( klass, t_pg_coder, NULL, -1, this );
80
+ VALUE self = Data_Make_Struct( klass, t_pg_coder, pg_coder_mark, -1, this );
69
81
  pg_coder_init_encoder( self );
70
82
  return self;
71
83
  }
@@ -74,7 +86,7 @@ static VALUE
74
86
  pg_composite_encoder_allocate( VALUE klass )
75
87
  {
76
88
  t_pg_composite_coder *this;
77
- VALUE self = Data_Make_Struct( klass, t_pg_composite_coder, NULL, -1, this );
89
+ VALUE self = Data_Make_Struct( klass, t_pg_composite_coder, pg_composite_coder_mark, -1, this );
78
90
  pg_coder_init_encoder( self );
79
91
  this->elem = NULL;
80
92
  this->needs_quotation = 1;
@@ -87,7 +99,7 @@ static VALUE
87
99
  pg_simple_decoder_allocate( VALUE klass )
88
100
  {
89
101
  t_pg_coder *this;
90
- VALUE self = Data_Make_Struct( klass, t_pg_coder, NULL, -1, this );
102
+ VALUE self = Data_Make_Struct( klass, t_pg_coder, pg_coder_mark, -1, this );
91
103
  pg_coder_init_decoder( self );
92
104
  return self;
93
105
  }
@@ -96,7 +108,7 @@ static VALUE
96
108
  pg_composite_decoder_allocate( VALUE klass )
97
109
  {
98
110
  t_pg_composite_coder *this;
99
- VALUE self = Data_Make_Struct( klass, t_pg_composite_coder, NULL, -1, this );
111
+ VALUE self = Data_Make_Struct( klass, t_pg_composite_coder, pg_composite_coder_mark, -1, this );
100
112
  pg_coder_init_decoder( self );
101
113
  this->elem = NULL;
102
114
  this->needs_quotation = 1;
@@ -23,6 +23,7 @@ typedef struct {
23
23
  static void
24
24
  pg_copycoder_mark( t_pg_copycoder *this )
25
25
  {
26
+ pg_coder_mark(&this->comp);
26
27
  rb_gc_mark(this->typemap);
27
28
  rb_gc_mark(this->null_string);
28
29
  }
@@ -18,6 +18,7 @@ typedef struct {
18
18
  static void
19
19
  pg_recordcoder_mark( t_pg_recordcoder *this )
20
20
  {
21
+ pg_coder_mark(&this->comp);
21
22
  rb_gc_mark(this->typemap);
22
23
  }
23
24
 
@@ -167,6 +167,11 @@ static const rb_data_type_t pgresult_type = {
167
167
  #endif
168
168
  };
169
169
 
170
+ /* Needed by sequel_pg gem, do not delete */
171
+ int pg_get_result_enc_idx(VALUE self)
172
+ {
173
+ return pgresult_get_this(self)->enc_idx;
174
+ }
170
175
 
171
176
  /*
172
177
  * Global functions
@@ -333,8 +338,7 @@ pg_result_check( VALUE self )
333
338
  * Special care must be taken when PG::Tuple objects are used.
334
339
  * In this case #clear must not be called unless all PG::Tuple objects of this result are fully materialized.
335
340
  *
336
- * If PG::Result#autoclear? is true then the result is marked as cleared
337
- * and the underlying C struct will be cleared automatically by libpq.
341
+ * If PG::Result#autoclear? is +true+ then the result is only marked as cleared but clearing the underlying C struct will happen when the callback returns.
338
342
  *
339
343
  */
340
344
  VALUE
@@ -362,8 +366,10 @@ pgresult_cleared_p( VALUE self )
362
366
  * call-seq:
363
367
  * res.autoclear? -> boolean
364
368
  *
365
- * Returns +true+ if the underlying C struct will be cleared automatically by libpq.
366
- * Elsewise the result is cleared by PG::Result#clear or by the GC when it's no longer in use.
369
+ * Returns +true+ if the underlying C struct will be cleared at the end of a callback.
370
+ * This applies only to Result objects received by the block to PG::Cinnection#set_notice_receiver .
371
+ *
372
+ * All other Result objects are automatically cleared by the GC when the object is no longer in use or manually by PG::Result#clear .
367
373
  *
368
374
  */
369
375
  VALUE
@@ -126,7 +126,11 @@ pg_tmbk_mark( t_tmbk *this )
126
126
  {
127
127
  rb_gc_mark(this->typemap.default_typemap);
128
128
  rb_gc_mark(this->klass_to_coder);
129
- /* All coders are in the Hash, so no need to mark the cache. */
129
+ rb_gc_mark(this->self);
130
+ /* Clear the cache, to be safe from changes of klass VALUE by GC.compact.
131
+ * TODO: Move cache clearing to compactation callback provided by Ruby-2.7+.
132
+ */
133
+ memset(&this->cache_row, 0, sizeof(this->cache_row));
130
134
  }
131
135
 
132
136
  static VALUE
data/lib/pg.rb CHANGED
@@ -22,7 +22,8 @@ rescue LoadError
22
22
  end
23
23
 
24
24
  # Temporary add this directory for DLL search, so that libpq.dll can be found.
25
- add_dll_path.call(__dir__) do
25
+ # mingw32-platform strings differ (RUBY_PLATFORM=i386-mingw32 vs. x86-mingw32 for rubygems)
26
+ add_dll_path.call(File.join(__dir__, RUBY_PLATFORM.gsub(/^i386-/, "x86-"))) do
26
27
  require "#{major_minor}/pg_ext"
27
28
  end
28
29
  else
@@ -36,7 +37,7 @@ end
36
37
  module PG
37
38
 
38
39
  # Library version
39
- VERSION = '1.2.0'
40
+ VERSION = '1.2.3'
40
41
 
41
42
  # VCS revision
42
43
  REVISION = %q$Revision: 6f611e78845a $
@@ -118,13 +118,13 @@ module PG::BasicTypeRegistry
118
118
  def build_coder_maps(connection)
119
119
  if supports_ranges?(connection)
120
120
  result = connection.exec <<-SQL
121
- SELECT t.oid, t.typname, t.typelem, t.typdelim, t.typinput, r.rngsubtype
121
+ SELECT t.oid, t.typname::text, t.typelem, t.typdelim, t.typinput::text, r.rngsubtype
122
122
  FROM pg_type as t
123
123
  LEFT JOIN pg_range as r ON oid = rngtypid
124
124
  SQL
125
125
  else
126
126
  result = connection.exec <<-SQL
127
- SELECT t.oid, t.typname, t.typelem, t.typdelim, t.typinput
127
+ SELECT t.oid, t.typname::text, t.typelem, t.typdelim, t.typinput::text
128
128
  FROM pg_type as t
129
129
  SQL
130
130
  end
@@ -225,7 +225,7 @@ module PG::TestingHelpers
225
225
  rescue => err
226
226
  $stderr.puts "%p during test setup: %s" % [ err.class, err.message ]
227
227
  $stderr.puts "See #{@logfile} for details."
228
- $stderr.puts *err.backtrace if $DEBUG
228
+ $stderr.puts err.backtrace if $DEBUG
229
229
  fail
230
230
  end
231
231
 
@@ -370,8 +370,6 @@ RSpec.configure do |config|
370
370
  else
371
371
  config.filter_run_excluding :windows
372
372
  end
373
- config.filter_run_excluding :socket_io unless
374
- PG::Connection.instance_methods.map( &:to_sym ).include?( :socket_io )
375
373
 
376
374
  config.filter_run_excluding( :postgresql_93 ) if PG.library_version < 90300
377
375
  config.filter_run_excluding( :postgresql_94 ) if PG.library_version < 90400
@@ -21,14 +21,6 @@ ensure
21
21
  end
22
22
  end
23
23
 
24
- def expect_to_typecase_result_value_warning
25
- warning = 'Warning: no type cast defined for type "name" with oid 19. '\
26
- "Please cast this type explicitly to TEXT to be safe for future changes.\n"\
27
- 'Warning: no type cast defined for type "regproc" with oid 24. '\
28
- "Please cast this type explicitly to TEXT to be safe for future changes.\n"
29
- expect { yield }.to output(warning).to_stderr
30
- end
31
-
32
24
  describe 'Basic type mapping' do
33
25
 
34
26
  describe PG::BasicTypeMapForQueries do
@@ -318,9 +310,7 @@ describe 'Basic type mapping' do
318
310
  it "should convert format #{format} timestamps per TimestampUtc" do
319
311
  restore_type("timestamp") do
320
312
  PG::BasicTypeRegistry.register_type 0, 'timestamp', nil, PG::TextDecoder::TimestampUtc
321
- expect_to_typecase_result_value_warning do
322
- @conn.type_map_for_results = PG::BasicTypeMapForResults.new(@conn)
323
- end
313
+ @conn.type_map_for_results = PG::BasicTypeMapForResults.new(@conn)
324
314
  res = @conn.exec_params( "SELECT CAST('2013-07-31 23:58:59+02' AS TIMESTAMP WITHOUT TIME ZONE),
325
315
  CAST('1913-12-31 23:58:59.1231-03' AS TIMESTAMP WITHOUT TIME ZONE),
326
316
  CAST('4714-11-24 23:58:59.1231-03 BC' AS TIMESTAMP WITHOUT TIME ZONE),
@@ -342,9 +332,7 @@ describe 'Basic type mapping' do
342
332
  restore_type("timestamp") do
343
333
  PG::BasicTypeRegistry.register_type 0, 'timestamp', nil, PG::TextDecoder::TimestampUtcToLocal
344
334
  PG::BasicTypeRegistry.register_type 1, 'timestamp', nil, PG::BinaryDecoder::TimestampUtcToLocal
345
- expect_to_typecase_result_value_warning do
346
- @conn.type_map_for_results = PG::BasicTypeMapForResults.new(@conn)
347
- end
335
+ @conn.type_map_for_results = PG::BasicTypeMapForResults.new(@conn)
348
336
  res = @conn.exec_params( "SELECT CAST('2013-07-31 23:58:59+02' AS TIMESTAMP WITHOUT TIME ZONE),
349
337
  CAST('1913-12-31 23:58:59.1231-03' AS TIMESTAMP WITHOUT TIME ZONE),
350
338
  CAST('4714-11-24 23:58:59.1231-03 BC' AS TIMESTAMP WITHOUT TIME ZONE),
@@ -366,9 +354,7 @@ describe 'Basic type mapping' do
366
354
  restore_type("timestamp") do
367
355
  PG::BasicTypeRegistry.register_type 0, 'timestamp', nil, PG::TextDecoder::TimestampLocal
368
356
  PG::BasicTypeRegistry.register_type 1, 'timestamp', nil, PG::BinaryDecoder::TimestampLocal
369
- expect_to_typecase_result_value_warning do
370
- @conn.type_map_for_results = PG::BasicTypeMapForResults.new(@conn)
371
- end
357
+ @conn.type_map_for_results = PG::BasicTypeMapForResults.new(@conn)
372
358
  res = @conn.exec_params( "SELECT CAST('2013-07-31 23:58:59' AS TIMESTAMP WITHOUT TIME ZONE),
373
359
  CAST('1913-12-31 23:58:59.1231' AS TIMESTAMP WITHOUT TIME ZONE),
374
360
  CAST('4714-11-24 23:58:59.1231-03 BC' AS TIMESTAMP WITHOUT TIME ZONE),
@@ -503,7 +489,6 @@ describe 'Basic type mapping' do
503
489
  sql_vals = vals.map{|v| "CAST('#{v}' AS inet)"}
504
490
  res = @conn.exec_params(("SELECT " + sql_vals.join(', ')), [], format )
505
491
  vals.each_with_index do |v, i|
506
- val = res.getvalue(0,i)
507
492
  expect( res.getvalue(0,i) ).to eq( IPAddr.new(v) )
508
493
  end
509
494
  end
@@ -527,22 +512,22 @@ describe 'Basic type mapping' do
527
512
  sql_vals = vals.map { |v| "CAST('#{v}' AS cidr)" }
528
513
  res = @conn.exec_params(("SELECT " + sql_vals.join(', ')), [], format )
529
514
  vals.each_with_index do |v, i|
530
- val = res.getvalue(0,i)
515
+ val = res.getvalue(0,i)
531
516
  ip, prefix = v.split('/', 2)
532
- expect( val.to_s ).to eq( ip )
517
+ expect( val.to_s ).to eq( ip )
533
518
  if val.respond_to?(:prefix)
534
519
  val_prefix = val.prefix
535
520
  else
536
- default_prefix = (val.family == Socket::AF_INET ? 32 : 128)
521
+ default_prefix = (val.family == Socket::AF_INET ? 32 : 128)
537
522
  range = val.to_range
538
523
  val_prefix = default_prefix - Math.log(((range.end.to_i - range.begin.to_i) + 1), 2).to_i
539
524
  end
540
525
  if v.include?('/')
541
- expect( val_prefix ).to eq( prefix.to_i )
526
+ expect( val_prefix ).to eq( prefix.to_i )
542
527
  elsif v.include?('.')
543
- expect( val_prefix ).to eq( 32 )
544
- else
545
- expect( val_prefix ).to eq( 128 )
528
+ expect( val_prefix ).to eq( 32 )
529
+ else
530
+ expect( val_prefix ).to eq( 128 )
546
531
  end
547
532
  end
548
533
  end
@@ -173,7 +173,7 @@ describe PG::Connection do
173
173
  end
174
174
  end
175
175
 
176
- it "can connect asynchronously", :socket_io do
176
+ it "can connect asynchronously" do
177
177
  tmpconn = described_class.connect_start( @conninfo )
178
178
  expect( tmpconn ).to be_a( described_class )
179
179
 
@@ -182,7 +182,7 @@ describe PG::Connection do
182
182
  tmpconn.finish
183
183
  end
184
184
 
185
- it "can connect asynchronously for the duration of a block", :socket_io do
185
+ it "can connect asynchronously for the duration of a block" do
186
186
  conn = nil
187
187
 
188
188
  described_class.connect_start(@conninfo) do |tmpconn|
@@ -196,7 +196,7 @@ describe PG::Connection do
196
196
  expect( conn ).to be_finished()
197
197
  end
198
198
 
199
- context "with async established connection", :socket_io do
199
+ context "with async established connection" do
200
200
  before :each do
201
201
  @conn2 = described_class.connect_start( @conninfo )
202
202
  wait_for_polling_ok(@conn2)
@@ -340,10 +340,10 @@ describe PG::Connection do
340
340
  @conn.trace( trace_io )
341
341
  trace_io.close
342
342
 
343
- res = @conn.exec("SELECT 1 AS one")
343
+ @conn.exec("SELECT 1 AS one")
344
344
  @conn.untrace
345
345
 
346
- res = @conn.exec("SELECT 2 AS two")
346
+ @conn.exec("SELECT 2 AS two")
347
347
 
348
348
  trace_data = trace_file.read
349
349
 
@@ -902,7 +902,7 @@ describe PG::Connection do
902
902
  end
903
903
 
904
904
 
905
- it "handles server close while asynchronous connect", :socket_io do
905
+ it "handles server close while asynchronous connect" do
906
906
  serv = TCPServer.new( '127.0.0.1', 54320 )
907
907
  conn = described_class.connect_start( '127.0.0.1', 54320, "", "", "me", "xxxx", "somedb" )
908
908
  expect( [PG::PGRES_POLLING_WRITING, PG::CONNECTION_OK] ).to include conn.connect_poll
@@ -963,7 +963,7 @@ describe PG::Connection do
963
963
  conn.close
964
964
  end
965
965
 
966
- it "closes the IO fetched from #socket_io when the connection is closed", :without_transaction, :socket_io do
966
+ it "closes the IO fetched from #socket_io when the connection is closed", :without_transaction do
967
967
  conn = PG.connect( @conninfo )
968
968
  io = conn.socket_io
969
969
  conn.finish
@@ -971,7 +971,7 @@ describe PG::Connection do
971
971
  expect { conn.socket_io }.to raise_error( PG::ConnectionBad, /connection is closed/i )
972
972
  end
973
973
 
974
- it "closes the IO fetched from #socket_io when the connection is reset", :without_transaction, :socket_io do
974
+ it "closes the IO fetched from #socket_io when the connection is reset", :without_transaction do
975
975
  conn = PG.connect( @conninfo )
976
976
  io = conn.socket_io
977
977
  conn.reset
@@ -1622,6 +1622,7 @@ describe PG::Connection do
1622
1622
 
1623
1623
  expect( event ).to eq( "Möhre" )
1624
1624
  expect( event.encoding ).to eq( Encoding::UTF_8 )
1625
+ expect( pid ).to be_a_kind_of(Integer)
1625
1626
  expect( msg ).to eq( '世界線航跡蔵' )
1626
1627
  expect( msg.encoding ).to eq( Encoding::UTF_8 )
1627
1628
  end
@@ -1702,12 +1703,12 @@ describe PG::Connection do
1702
1703
  row_encoder = PG::TextEncoder::CopyRow.new type_map: tm
1703
1704
 
1704
1705
  @conn.exec( "CREATE TEMP TABLE copytable (col1 TEXT)" )
1705
- res2 = @conn.copy_data( "COPY copytable FROM STDOUT" ) do |res|
1706
+ @conn.copy_data( "COPY copytable FROM STDOUT" ) do |res|
1706
1707
  @conn.put_copy_data [1], row_encoder
1707
1708
  @conn.put_copy_data ["2"], row_encoder
1708
1709
  end
1709
1710
 
1710
- res2 = @conn.copy_data( "COPY copytable FROM STDOUT", row_encoder ) do |res|
1711
+ @conn.copy_data( "COPY copytable FROM STDOUT", row_encoder ) do |res|
1711
1712
  @conn.put_copy_data [3]
1712
1713
  @conn.put_copy_data ["4"]
1713
1714
  end
@@ -1757,7 +1758,7 @@ describe PG::Connection do
1757
1758
 
1758
1759
  it "can process #copy_data input queries with row encoder and respects character encoding" do
1759
1760
  @conn2.exec( "CREATE TEMP TABLE copytable (col1 TEXT)" )
1760
- res2 = @conn2.copy_data( "COPY copytable FROM STDOUT" ) do |res|
1761
+ @conn2.copy_data( "COPY copytable FROM STDOUT" ) do |res|
1761
1762
  @conn2.put_copy_data [1]
1762
1763
  @conn2.put_copy_data ["Möhre".encode("utf-16le")]
1763
1764
  end
@@ -1808,7 +1809,7 @@ describe PG::Connection do
1808
1809
  it "can process #copy_data output with row decoder and respects character encoding" do
1809
1810
  @conn2.internal_encoding = Encoding::ISO8859_1
1810
1811
  rows = []
1811
- res2 = @conn2.copy_data( "COPY (VALUES('1'), ('Möhre')) TO STDOUT".encode("utf-16le") ) do |res|
1812
+ @conn2.copy_data( "COPY (VALUES('1'), ('Möhre')) TO STDOUT".encode("utf-16le") ) do |res|
1812
1813
  while row=@conn2.get_copy_data
1813
1814
  rows << row
1814
1815
  end
@@ -1871,34 +1872,71 @@ describe PG::Connection do
1871
1872
  end
1872
1873
 
1873
1874
  describe "deprecated forms of methods" do
1874
- it "should forward exec to exec_params" do
1875
- res = @conn.exec("VALUES($1::INT)", [7]).values
1876
- expect(res).to eq( [["7"]] )
1877
- res = @conn.exec("VALUES($1::INT)", [7], 1).values
1878
- expect(res).to eq( [[[7].pack("N")]] )
1879
- res = @conn.exec("VALUES(8)", [], 1).values
1880
- expect(res).to eq( [[[8].pack("N")]] )
1881
- end
1882
-
1883
- it "should forward exec_params to exec" do
1884
- res = @conn.exec_params("VALUES(3); VALUES(4)").values
1885
- expect(res).to eq( [["4"]] )
1886
- res = @conn.exec_params("VALUES(3); VALUES(4)", nil).values
1887
- expect(res).to eq( [["4"]] )
1888
- res = @conn.exec_params("VALUES(3); VALUES(4)", nil, nil).values
1889
- expect(res).to eq( [["4"]] )
1890
- res = @conn.exec_params("VALUES(3); VALUES(4)", nil, 1).values
1891
- expect(res).to eq( [["4"]] )
1892
- res = @conn.exec_params("VALUES(3); VALUES(4)", nil, nil, nil).values
1893
- expect(res).to eq( [["4"]] )
1894
- expect{
1895
- @conn.exec_params("VALUES(3); VALUES(4)", nil, nil, nil, nil).values
1896
- }.to raise_error(ArgumentError)
1897
- end
1875
+ if PG::VERSION < "2"
1876
+ it "should forward exec to exec_params" do
1877
+ res = @conn.exec("VALUES($1::INT)", [7]).values
1878
+ expect(res).to eq( [["7"]] )
1879
+ res = @conn.exec("VALUES($1::INT)", [7], 1).values
1880
+ expect(res).to eq( [[[7].pack("N")]] )
1881
+ res = @conn.exec("VALUES(8)", [], 1).values
1882
+ expect(res).to eq( [[[8].pack("N")]] )
1883
+ end
1884
+
1885
+ it "should forward exec_params to exec" do
1886
+ res = @conn.exec_params("VALUES(3); VALUES(4)").values
1887
+ expect(res).to eq( [["4"]] )
1888
+ res = @conn.exec_params("VALUES(3); VALUES(4)", nil).values
1889
+ expect(res).to eq( [["4"]] )
1890
+ res = @conn.exec_params("VALUES(3); VALUES(4)", nil, nil).values
1891
+ expect(res).to eq( [["4"]] )
1892
+ res = @conn.exec_params("VALUES(3); VALUES(4)", nil, 1).values
1893
+ expect(res).to eq( [["4"]] )
1894
+ res = @conn.exec_params("VALUES(3); VALUES(4)", nil, nil, nil).values
1895
+ expect(res).to eq( [["4"]] )
1896
+ expect{
1897
+ @conn.exec_params("VALUES(3); VALUES(4)", nil, nil, nil, nil).values
1898
+ }.to raise_error(ArgumentError)
1899
+ end
1900
+
1901
+ it "should forward send_query to send_query_params" do
1902
+ @conn.send_query("VALUES($1)", [5])
1903
+ expect(@conn.get_last_result.values).to eq( [["5"]] )
1904
+ end
1905
+
1906
+ it "should respond_to socket", :unix do
1907
+ expect( @conn.socket ).to eq( @conn.socket_io.fileno )
1908
+ end
1909
+ else
1910
+ # Method forwarding removed by PG::VERSION >= "2"
1911
+ it "shouldn't forward exec to exec_params" do
1912
+ expect do
1913
+ @conn.exec("VALUES($1::INT)", [7])
1914
+ end.to raise_error(ArgumentError)
1915
+ end
1916
+
1917
+ it "shouldn't forward exec_params to exec" do
1918
+ expect do
1919
+ @conn.exec_params("VALUES(3); VALUES(4)")
1920
+ end.to raise_error(ArgumentError)
1921
+ end
1922
+
1923
+ it "shouldn't forward send_query to send_query_params" do
1924
+ expect do
1925
+ @conn.send_query("VALUES($1)", [5])
1926
+ end.to raise_error(ArgumentError)
1927
+ end
1928
+
1929
+ it "shouldn't forward async_exec_params to async_exec" do
1930
+ expect do
1931
+ @conn.async_exec_params("VALUES(1)")
1932
+ end.to raise_error(ArgumentError)
1933
+ end
1898
1934
 
1899
- it "should forward send_query to send_query_params" do
1900
- @conn.send_query("VALUES($1)", [5])
1901
- expect(@conn.get_last_result.values).to eq( [["5"]] )
1935
+ it "shouldn't respond_to socket" do
1936
+ expect do
1937
+ @conn.socket
1938
+ end.to raise_error(ArgumentError)
1939
+ end
1902
1940
  end
1903
1941
 
1904
1942
  it "shouldn't forward send_query_params to send_query" do
@@ -300,7 +300,7 @@ describe PG::Result do
300
300
  it "detects division by zero as SQLSTATE 22012" do
301
301
  sqlstate = nil
302
302
  begin
303
- res = @conn.exec("SELECT 1/0")
303
+ @conn.exec("SELECT 1/0")
304
304
  rescue PG::Error => e
305
305
  sqlstate = e.result.result_error_field( PG::PG_DIAG_SQLSTATE ).to_i
306
306
  end
@@ -132,7 +132,7 @@ describe PG::TypeMapByClass do
132
132
  it "should raise error on invalid coder object" do
133
133
  tm[TrueClass] = "dummy"
134
134
  expect{
135
- res = @conn.exec_params( "SELECT $1", [true], 0, tm )
135
+ @conn.exec_params( "SELECT $1", [true], 0, tm )
136
136
  }.to raise_error(NoMethodError, /undefined method.*call/)
137
137
  end
138
138
  end
@@ -54,8 +54,8 @@ describe PG::TypeMapByOid do
54
54
  end
55
55
 
56
56
  it "should check format when deleting coders" do
57
- expect{ tm.rm_coder 2, 123 }.to raise_error(ArgumentError)
58
- expect{ tm.rm_coder -1, 123 }.to raise_error(ArgumentError)
57
+ expect{ tm.rm_coder(2, 123) }.to raise_error(ArgumentError)
58
+ expect{ tm.rm_coder(-1, 123) }.to raise_error(ArgumentError)
59
59
  end
60
60
 
61
61
  it "should check format when adding coders" do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pg
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 1.2.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Granger
@@ -11,9 +11,9 @@ bindir: bin
11
11
  cert_chain:
12
12
  - |
13
13
  -----BEGIN CERTIFICATE-----
14
- MIIENDCCApygAwIBAgIBATANBgkqhkiG9w0BAQsFADAiMSAwHgYDVQQDDBdnZWQv
15
- REM9RmFlcmllTVVEL0RDPW9yZzAeFw0xODExMjAxODI5NTlaFw0xOTExMjAxODI5
16
- NTlaMCIxIDAeBgNVBAMMF2dlZC9EQz1GYWVyaWVNVUQvREM9b3JnMIIBojANBgkq
14
+ MIID+DCCAmCgAwIBAgIBAjANBgkqhkiG9w0BAQsFADAiMSAwHgYDVQQDDBdnZWQv
15
+ REM9RmFlcmllTVVEL0RDPW9yZzAeFw0xOTEyMjQyMDE5NTFaFw0yMDEyMjMyMDE5
16
+ NTFaMCIxIDAeBgNVBAMMF2dlZC9EQz1GYWVyaWVNVUQvREM9b3JnMIIBojANBgkq
17
17
  hkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAvyVhkRzvlEs0fe7145BYLfN6njX9ih5H
18
18
  L60U0p0euIurpv84op9CNKF9tx+1WKwyQvQP7qFGuZxkSUuWcP/sFhDXL1lWUuIl
19
19
  M4uHbGCRmOshDrF4dgnBeOvkHr1fIhPlJm5FO+Vew8tSQmlDsosxLUx+VB7DrVFO
@@ -22,20 +22,19 @@ cert_chain:
22
22
  vQ66lts4alKC69TE5cuKasWBm+16A4aEe3XdZBRNmtOu/g81gvwA7fkJHKllJuaI
23
23
  dXzdHqq+zbGZVSQ7pRYHYomD0IiDe1DbIouFnPWmagaBnGHwXkDT2bKKP+s2v21m
24
24
  ozilJg4aar2okb/RA6VS87o+d7g6LpDDMMQjH4G9OPnJENLdhu8KnPw/ivSVvQw7
25
- N2I4L/ZOIe2DIVuYH7aLHfjZDQv/mNgpAgMBAAGjdTBzMAkGA1UdEwQCMAAwCwYD
26
- VR0PBAQDAgSwMB0GA1UdDgQWBBRyjf55EbrHagiRLqt5YAd3yb8k4DAcBgNVHREE
27
- FTATgRFnZWRARmFlcmllTVVELm9yZzAcBgNVHRIEFTATgRFnZWRARmFlcmllTVVE
28
- Lm9yZzANBgkqhkiG9w0BAQsFAAOCAYEAP9Ffkvg4e8CjIWi8SykQ8oJSS8jbmbgF
29
- abke3vXWLG6V9kFiObuJd5wZRBluJANu7bEtjgc3fFaGVP2XxVdCpVjNbmMDg4Qp
30
- ovvczP53X6pQP2RSZgxF6Lblvy8y11RziUTVRG/Z2aJHsElo6gI7vQznE/OSDrhC
31
- gEhr8uaIUt7D+HZWRbU0+MkKPpL5uMqaFuJbqXEvSwPTuUuYkDfNfsjQO7ruWBac
32
- bxHCrvpZ6Tijc0nrlyXi6gPOCLeaqhau2xFnlvKgELwsGYSoKBJyDwqtQ5kwrOlU
33
- tkSyLrfZ+RZcH535Hyvif7ZxB0v5OxXXoec+N2vrUsEUMRDL9dg4/WFdN8hIOixF
34
- 3IPKpZ1ho0Ya5q7yhygtBK9/NBFHw+nbJjcltfPDBXleRe8u73gnQo8AZIhStYSP
35
- v4qqqa27Bs468d6SoPxjSm8a2mM9HZ4OdWhq4tFsbTeXDVquCfi64OTEaTt2xQdR
36
- JnC4lpJfCP6aCXa5h2XAQfPSH636cQap
25
+ N2I4L/ZOIe2DIVuYH7aLHfjZDQv/mNgpAgMBAAGjOTA3MAkGA1UdEwQCMAAwCwYD
26
+ VR0PBAQDAgSwMB0GA1UdDgQWBBRyjf55EbrHagiRLqt5YAd3yb8k4DANBgkqhkiG
27
+ 9w0BAQsFAAOCAYEAifxlz7x0EfT3fjhM520ZEIrWa+tLMuLKNefkY18u8tZnx4EX
28
+ Xxwh3tna3fvNfrOrdY5leIj1dbv4FTRg+gIBnIxAySqvpGvI/Axg5EdYbwninCLL
29
+ LAKCmRo+5QwaPMYN2zdHIjGrp8jg1neCo5zy6tVvyTv0DMI6FLrydVJYduMMDFSy
30
+ gQKR1rVOcCJtnBnLCF9+kKEUKohAHOmGsE7OBZFnjMIpH5yUDUVJKByv0gIipFt0
31
+ 1T6zff6oVU0w8WBiNKR381+6sF3wIZVnVY0XeJg6hNL+YecE8ILxLhHTmtT/BO0S
32
+ 3xPze9uXDR+iD6HYl8KU5QEg/dXFPhfQb512vVkTJDZvMcwu6PxDUjHFChLjAji/
33
+ AZXjg1C5E9znTkeUR8ieU9F1MOKoiH57a5lYSTI8Ga8PpsNXTxNeXc16Ob26CqrJ
34
+ 83uuAYSy65yXDGXXPVBeKPVnYrqp91pqpS5Nh7wfuiCrE8lgU8PATh7K4BV1UhAT
35
+ 0MHbAT42wTYkfUj3
37
36
  -----END CERTIFICATE-----
38
- date: 2019-12-24 00:00:00.000000000 Z
37
+ date: 2020-03-18 00:00:00.000000000 Z
39
38
  dependencies:
40
39
  - !ruby/object:Gem::Dependency
41
40
  name: hoe-mercurial
@@ -57,14 +56,14 @@ dependencies:
57
56
  requirements:
58
57
  - - "~>"
59
58
  - !ruby/object:Gem::Version
60
- version: '0.9'
59
+ version: '0.10'
61
60
  type: :development
62
61
  prerelease: false
63
62
  version_requirements: !ruby/object:Gem::Requirement
64
63
  requirements:
65
64
  - - "~>"
66
65
  - !ruby/object:Gem::Version
67
- version: '0.9'
66
+ version: '0.10'
68
67
  - !ruby/object:Gem::Dependency
69
68
  name: hoe-highline
70
69
  requirement: !ruby/object:Gem::Requirement
@@ -99,14 +98,14 @@ dependencies:
99
98
  requirements:
100
99
  - - "~>"
101
100
  - !ruby/object:Gem::Version
102
- version: 0.7.0
101
+ version: '1.0'
103
102
  type: :development
104
103
  prerelease: false
105
104
  version_requirements: !ruby/object:Gem::Requirement
106
105
  requirements:
107
106
  - - "~>"
108
107
  - !ruby/object:Gem::Version
109
- version: 0.7.0
108
+ version: '1.0'
110
109
  - !ruby/object:Gem::Dependency
111
110
  name: hoe-bundler
112
111
  requirement: !ruby/object:Gem::Requirement
metadata.gz.sig CHANGED
Binary file