pg 0.18.1-x64-mingw32 → 0.18.2-x64-mingw32

Sign up to get free protection for your applications and to get access to all the features.
Binary file
Binary file
Binary file
data/lib/pg.rb CHANGED
@@ -24,7 +24,7 @@ end
24
24
  module PG
25
25
 
26
26
  # Library version
27
- VERSION = '0.18.1'
27
+ VERSION = '0.18.2'
28
28
 
29
29
  # VCS revision
30
30
  REVISION = %q$Revision$
@@ -1,6 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  require 'pg' unless defined?( PG )
4
+ require 'uri'
4
5
 
5
6
  # The PostgreSQL connection class. The interface for this class is based on
6
7
  # {libpq}[http://www.postgresql.org/docs/9.2/interactive/libpq.html], the C
@@ -34,46 +35,55 @@ class PG::Connection
34
35
  def self::parse_connect_args( *args )
35
36
  return '' if args.empty?
36
37
 
37
- # This will be swapped soon for code that makes options like those required for
38
- # PQconnectdbParams()/PQconnectStartParams(). For now, stick to an options string for
39
- # PQconnectdb()/PQconnectStart().
38
+ hash_arg = args.last.is_a?( Hash ) ? args.pop : {}
39
+ option_string = ''
40
+ options = {}
40
41
 
41
42
  # Parameter 'fallback_application_name' was introduced in PostgreSQL 9.0
42
43
  # together with PQescapeLiteral().
43
- if PG::Connection.instance_methods.find{|m| m.to_sym == :escape_literal }
44
- appname = $0.sub(/^(.{30}).{4,}(.{30})$/){ $1+"..."+$2 }
45
- appname = PG::Connection.quote_connstr( appname )
46
- connopts = ["fallback_application_name=#{appname}"]
47
- else
48
- connopts = []
44
+ if PG::Connection.instance_methods.find {|m| m.to_sym == :escape_literal }
45
+ options[:fallback_application_name] = $0.sub( /^(.{30}).{4,}(.{30})$/ ){ $1+"..."+$2 }
49
46
  end
50
47
 
51
- # Handle an options hash first
52
- if args.last.is_a?( Hash )
53
- opthash = args.pop
54
- opthash.each do |key, val|
55
- connopts.push( "%s=%s" % [key, PG::Connection.quote_connstr(val)] )
48
+ if args.length == 1
49
+ case args.first
50
+ when URI, URI.regexp
51
+ uri = URI(args.first)
52
+ options.merge!( Hash[URI.decode_www_form( uri.query )] ) if uri.query
53
+ when /=/
54
+ # Option string style
55
+ option_string = args.first.to_s
56
+ else
57
+ # Positional parameters
58
+ options[CONNECT_ARGUMENT_ORDER.first.to_sym] = args.first
56
59
  end
57
- end
58
-
59
- # Option string style
60
- if args.length == 1 && args.first.to_s.index( '=' )
61
- connopts.unshift( args.first )
62
-
63
- # Append positional parameters
64
60
  else
65
- args.each_with_index do |val, i|
66
- next unless val # Skip nil placeholders
61
+ max = CONNECT_ARGUMENT_ORDER.length
62
+ raise ArgumentError,
63
+ "Extra positional parameter %d: %p" % [ max + 1, args[max] ] if args.length > max
67
64
 
68
- key = CONNECT_ARGUMENT_ORDER[ i ] or
69
- raise ArgumentError, "Extra positional parameter %d: %p" % [ i+1, val ]
70
- connopts.push( "%s=%s" % [key, PG::Connection.quote_connstr(val.to_s)] )
65
+ CONNECT_ARGUMENT_ORDER.zip( args ) do |(k,v)|
66
+ options[ k.to_sym ] = v if v
71
67
  end
72
68
  end
73
69
 
74
- return connopts.join(' ')
70
+ options.merge!( hash_arg )
71
+
72
+ if uri
73
+ uri.host = nil if options[:host]
74
+ uri.port = nil if options[:port]
75
+ uri.user = nil if options[:user]
76
+ uri.password = nil if options[:password]
77
+ uri.path = '' if options[:dbname]
78
+ uri.query = URI.encode_www_form( options )
79
+ return uri.to_s.sub( /^#{uri.scheme}:(?!\/\/)/, "#{uri.scheme}://" )
80
+ else
81
+ option_string += ' ' unless option_string.empty? && options.empty?
82
+ return option_string + options.map { |k,v| "#{k}=#{quote_connstr(v)}" }.join( ' ' )
83
+ end
75
84
  end
76
85
 
86
+
77
87
  # call-seq:
78
88
  # conn.copy_data( sql ) {|sql_result| ... } -> PG::Result
79
89
  #
@@ -27,11 +27,11 @@ module PG
27
27
  end
28
28
 
29
29
  class TimestampWithTimeZone < SimpleDecoder
30
- ISO_DATETIME_WITH_TIMEZONE = /\A(\d{4})-(\d\d)-(\d\d) (\d\d):(\d\d):(\d\d)(\.\d+)?([-\+]\d\d)\z/
30
+ ISO_DATETIME_WITH_TIMEZONE = /\A(\d{4})-(\d\d)-(\d\d) (\d\d):(\d\d):(\d\d)(\.\d+)?([-\+]\d\d):?(\d\d)?:?(\d\d)?\z/
31
31
 
32
32
  def decode(string, tuple=nil, field=nil)
33
33
  if string =~ ISO_DATETIME_WITH_TIMEZONE
34
- Time.new $1.to_i, $2.to_i, $3.to_i, $4.to_i, $5.to_i, "#{$6}#{$7}".to_r, "#{$8}:00"
34
+ Time.new $1.to_i, $2.to_i, $3.to_i, $4.to_i, $5.to_i, "#{$6}#{$7}".to_r, "#{$8}:#{$9 || '00'}:#{$10 || '00'}"
35
35
  else
36
36
  string
37
37
  end
Binary file
@@ -45,6 +45,14 @@ describe PG::Connection do
45
45
  expect( optstring ).to match( /(^|\s)user='jrandom'/ )
46
46
  end
47
47
 
48
+ it "can create a connection option string from an option string and a hash" do
49
+ optstring = described_class.parse_connect_args( 'dbname=original', :user => 'jrandom' )
50
+
51
+ expect( optstring ).to be_a( String )
52
+ expect( optstring ).to match( /(^|\s)dbname=original/ )
53
+ expect( optstring ).to match( /(^|\s)user='jrandom'/ )
54
+ end
55
+
48
56
  it "escapes single quotes and backslashes in connection parameters" do
49
57
  expect(
50
58
  described_class.parse_connect_args( "DB 'browser' \\" )
@@ -52,18 +60,72 @@ describe PG::Connection do
52
60
 
53
61
  end
54
62
 
63
+ let(:uri) { 'postgresql://user:pass@pgsql.example.com:222/db01?sslmode=require' }
64
+
65
+ it "can connect using a URI" do
66
+ string = described_class.parse_connect_args( uri )
67
+
68
+ expect( string ).to be_a( String )
69
+ expect( string ).to match( %r{^postgresql://user:pass@pgsql.example.com:222/db01\?} )
70
+ expect( string ).to match( %r{\?.*sslmode=require} )
71
+
72
+ string = described_class.parse_connect_args( URI.parse(uri) )
73
+
74
+ expect( string ).to be_a( String )
75
+ expect( string ).to match( %r{^postgresql://user:pass@pgsql.example.com:222/db01\?} )
76
+ expect( string ).to match( %r{\?.*sslmode=require} )
77
+ end
78
+
79
+ it "can create a connection URI from a URI and a hash" do
80
+ string = described_class.parse_connect_args( uri, :connect_timeout => 2 )
81
+
82
+ expect( string ).to be_a( String )
83
+ expect( string ).to match( %r{^postgresql://user:pass@pgsql.example.com:222/db01\?} )
84
+ expect( string ).to match( %r{\?.*sslmode=require} )
85
+ expect( string ).to match( %r{\?.*connect_timeout=2} )
86
+
87
+ string = described_class.parse_connect_args( uri,
88
+ :user => 'a',
89
+ :password => 'b',
90
+ :host => 'localhost',
91
+ :port => 555,
92
+ :dbname => 'x' )
93
+
94
+ expect( string ).to be_a( String )
95
+ expect( string ).to match( %r{^postgresql://\?} )
96
+ expect( string ).to match( %r{\?.*user=a} )
97
+ expect( string ).to match( %r{\?.*password=b} )
98
+ expect( string ).to match( %r{\?.*host=localhost} )
99
+ expect( string ).to match( %r{\?.*port=555} )
100
+ expect( string ).to match( %r{\?.*dbname=x} )
101
+ end
102
+
103
+ it "can create a connection URI with a non-standard domain socket directory" do
104
+ string = described_class.parse_connect_args( 'postgresql://%2Fvar%2Flib%2Fpostgresql/dbname' )
105
+
106
+ expect( string ).to be_a( String )
107
+ expect( string ).to match( %r{^postgresql://%2Fvar%2Flib%2Fpostgresql/dbname} )
108
+
109
+ string = described_class.
110
+ parse_connect_args( 'postgresql:///dbname', :host => '/var/lib/postgresql' )
111
+
112
+ expect( string ).to be_a( String )
113
+ expect( string ).to match( %r{^postgresql:///dbname\?} )
114
+ expect( string ).to match( %r{\?.*host=%2Fvar%2Flib%2Fpostgresql} )
115
+ end
116
+
55
117
  it "connects with defaults if no connection parameters are given" do
56
118
  expect( described_class.parse_connect_args ).to eq( '' )
57
119
  end
58
120
 
59
121
  it "connects successfully with connection string" do
60
- tmpconn = described_class.connect(@conninfo)
122
+ tmpconn = described_class.connect( @conninfo )
61
123
  expect( tmpconn.status ).to eq( PG::CONNECTION_OK )
62
124
  tmpconn.finish
63
125
  end
64
126
 
65
127
  it "connects using 7 arguments converted to strings" do
66
- tmpconn = described_class.connect('localhost', @port, nil, nil, :test, nil, nil)
128
+ tmpconn = described_class.connect( 'localhost', @port, nil, nil, :test, nil, nil )
67
129
  expect( tmpconn.status ).to eq( PG::CONNECTION_OK )
68
130
  tmpconn.finish
69
131
  end
@@ -89,8 +151,13 @@ describe PG::Connection do
89
151
 
90
152
  it "raises an exception when connecting with an invalid number of arguments" do
91
153
  expect {
92
- described_class.connect( 1, 2, 3, 4, 5, 6, 7, 'extra' )
93
- }.to raise_error( ArgumentError, /extra positional parameter/i )
154
+ described_class.connect( 1, 2, 3, 4, 5, 6, 7, 'the-extra-arg' )
155
+ }.to raise_error do |error|
156
+ expect( error ).to be_an( ArgumentError )
157
+ expect( error.message ).to match( /extra positional parameter/i )
158
+ expect( error.message ).to match( /8/ )
159
+ expect( error.message ).to match( /the-extra-arg/ )
160
+ end
94
161
  end
95
162
 
96
163
  it "can connect asynchronously", :socket_io do
@@ -162,8 +229,6 @@ describe PG::Connection do
162
229
  expect( @conn.user ).to be_a_kind_of( String )
163
230
  expect( @conn.pass ).to eq( "" )
164
231
  expect( @conn.host ).to eq( "localhost" )
165
- # TODO: Not sure why libpq returns a NULL ptr instead of "127.0.0.1"
166
- expect( @conn.hostaddr ).to eq( nil ) if @conn.server_version >= 9_04_00
167
232
  expect( @conn.port ).to eq( 54321 )
168
233
  expect( @conn.tty ).to eq( "" )
169
234
  expect( @conn.options ).to eq( "" )
@@ -1128,9 +1193,20 @@ describe PG::Connection do
1128
1193
  expect( escaped.encoding ).to eq( Encoding::ISO8859_1 )
1129
1194
  expect( escaped ).to eq( "\"string to\"" )
1130
1195
  end
1196
+ end
1131
1197
 
1198
+ it "can quote bigger strings with quote_ident" do
1199
+ original = "'01234567\"" * 100
1200
+ escaped = described_class.quote_ident( original + "\0afterzero" )
1201
+ expect( escaped ).to eq( "\"" + original.gsub("\"", "\"\"") + "\"" )
1132
1202
  end
1133
1203
 
1204
+ it "can quote Arrays with quote_ident" do
1205
+ original = "'01234567\""
1206
+ escaped = described_class.quote_ident( [original]*3 )
1207
+ expected = ["\"" + original.gsub("\"", "\"\"") + "\""] * 3
1208
+ expect( escaped ).to eq( expected.join(".") )
1209
+ end
1134
1210
 
1135
1211
  describe "Ruby 1.9.x default_internal encoding" do
1136
1212
 
@@ -15,6 +15,8 @@ describe "PG::Type derivations" do
15
15
  let!(:textdec_string) { PG::TextDecoder::String.new }
16
16
  let!(:textenc_timestamp) { PG::TextEncoder::TimestampWithoutTimeZone.new }
17
17
  let!(:textdec_timestamp) { PG::TextDecoder::TimestampWithoutTimeZone.new }
18
+ let!(:textenc_timestamptz) { PG::TextEncoder::TimestampWithTimeZone.new }
19
+ let!(:textdec_timestamptz) { PG::TextDecoder::TimestampWithTimeZone.new }
18
20
  let!(:textenc_bytea) { PG::TextEncoder::Bytea.new }
19
21
  let!(:textdec_bytea) { PG::TextDecoder::Bytea.new }
20
22
  let!(:binaryenc_int2) { PG::BinaryEncoder::Int2.new }
@@ -85,6 +87,48 @@ describe "PG::Type derivations" do
85
87
  expect( textdec_bytea.decode("\\377\\000") ).to eq( "\xff\0".b )
86
88
  end
87
89
 
90
+ context 'timestamps' do
91
+ it 'decodes timestamps without timezone' do
92
+ expect( textdec_timestamp.decode('2016-01-02 23:23:59.123456') ).
93
+ to be_within(0.000001).of( Time.new(2016,01,02, 23, 23, 59.123456) )
94
+ end
95
+ it 'decodes timestamps with hour timezone' do
96
+ expect( textdec_timestamptz.decode('2015-01-26 17:26:42.691511-04') ).
97
+ to be_within(0.000001).of( Time.new(2015,01,26, 17, 26, 42.691511, "-04:00") )
98
+ expect( textdec_timestamptz.decode('2015-01-26 17:26:42.691511+10') ).
99
+ to be_within(0.000001).of( Time.new(2015,01,26, 17, 26, 42.691511, "+10:00") )
100
+ end
101
+ it 'decodes timestamps with hour:minute timezone' do
102
+ expect( textdec_timestamptz.decode('2015-01-26 17:26:42.691511-04:15') ).
103
+ to be_within(0.000001).of( Time.new(2015,01,26, 17, 26, 42.691511, "-04:15") )
104
+ expect( textdec_timestamptz.decode('2015-01-26 17:26:42.691511-0430') ).
105
+ to be_within(0.000001).of( Time.new(2015,01,26, 17, 26, 42.691511, "-04:30") )
106
+ expect( textdec_timestamptz.decode('2015-01-26 17:26:42.691511+10:45') ).
107
+ to be_within(0.000001).of( Time.new(2015,01,26, 17, 26, 42.691511, "+10:45") )
108
+ end
109
+ it 'decodes timestamps with hour:minute:sec timezone' do
110
+ # SET TIME ZONE 'Europe/Dublin'; -- Was UTC−00:25:21 until 1916
111
+ # SELECT '1900-01-01'::timestamptz;
112
+ # -- "1900-01-01 00:00:00-00:25:21"
113
+ expect( textdec_timestamptz.decode('1916-01-01 00:00:00-00:25:21') ).
114
+ to be_within(0.000001).of( Time.new(1916, 1, 1, 0, 0, 0, "-00:25:21") )
115
+ end
116
+ end
117
+
118
+ context 'identifier quotation' do
119
+ it 'should build an array out of an quoted identifier string' do
120
+ quoted_type = PG::TextDecoder::Identifier.new
121
+ expect( quoted_type.decode(%["A.".".B"]) ).to eq( ["A.", ".B"] )
122
+ expect( quoted_type.decode(%["'A"".""B'"]) ).to eq( ['\'A"."B\''] )
123
+ end
124
+
125
+ it 'should split unquoted identifier string' do
126
+ quoted_type = PG::TextDecoder::Identifier.new
127
+ expect( quoted_type.decode(%[a.b]) ).to eq( ['a','b'] )
128
+ expect( quoted_type.decode(%[a]) ).to eq( ['a'] )
129
+ end
130
+ end
131
+
88
132
  it "should raise when decode method is called with wrong args" do
89
133
  expect{ textdec_int.decode() }.to raise_error(ArgumentError)
90
134
  expect{ textdec_int.decode("123", 2, 3, 4) }.to raise_error(ArgumentError)
@@ -156,6 +200,15 @@ describe "PG::Type derivations" do
156
200
  expect( textenc_bytea.encode("\x00\x01\x02\x03\xef".b) ).to eq( "\\x00010203ef" )
157
201
  end
158
202
 
203
+ context 'identifier quotation' do
204
+ it 'should quote and escape identifier' do
205
+ quoted_type = PG::TextEncoder::Identifier.new
206
+ expect( quoted_type.encode(['schema','table','col']) ).to eq( %["schema"."table"."col"] )
207
+ expect( quoted_type.encode(['A.','.B']) ).to eq( %["A.".".B"] )
208
+ expect( quoted_type.encode(%['A"."B']) ).to eq( %["'A"".""B'"] )
209
+ end
210
+ end
211
+
159
212
  it "should encode with ruby encoder" do
160
213
  expect( intenc_incrementer.encode(3) ).to eq( "4 " )
161
214
  end
@@ -347,20 +400,6 @@ describe "PG::Type derivations" do
347
400
  array_type = PG::TextDecoder::Array.new elements_type: nil
348
401
  expect( array_type.decode(%[{3,4}]) ).to eq( ['3','4'] )
349
402
  end
350
-
351
- context 'identifier quotation' do
352
- it 'should build an array out of an quoted identifier string' do
353
- quoted_type = PG::TextDecoder::Identifier.new elements_type: textdec_string
354
- expect( quoted_type.decode(%["A.".".B"]) ).to eq( ["A.", ".B"] )
355
- expect( quoted_type.decode(%["'A"".""B'"]) ).to eq( ['\'A"."B\''] )
356
- end
357
-
358
- it 'should split unquoted identifier string' do
359
- quoted_type = PG::TextDecoder::Identifier.new elements_type: textdec_string
360
- expect( quoted_type.decode(%[a.b]) ).to eq( ['a','b'] )
361
- expect( quoted_type.decode(%[a]) ).to eq( ['a'] )
362
- end
363
- end
364
403
  end
365
404
 
366
405
  describe '#encode' do
@@ -422,22 +461,6 @@ describe "PG::Type derivations" do
422
461
  expect( textenc_float_array.encode(1234) ).to eq( "1234" )
423
462
  end
424
463
 
425
- context 'identifier quotation' do
426
- it 'should quote and escape identifier' do
427
- quoted_type = PG::TextEncoder::Identifier.new elements_type: textenc_string
428
- expect( quoted_type.encode(['schema','table','col']) ).to eq( %["schema"."table"."col"] )
429
- expect( quoted_type.encode(['A.','.B']) ).to eq( %["A.".".B"] )
430
- expect( quoted_type.encode(%['A"."B']) ).to eq( %["'A"".""B'"] )
431
- end
432
-
433
- it 'shouldn\'t quote or escape identifier if requested to not do' do
434
- quoted_type = PG::TextEncoder::Identifier.new elements_type: textenc_string,
435
- needs_quotation: false
436
- expect( quoted_type.encode(['a','b']) ).to eq( %[a.b] )
437
- expect( quoted_type.encode(%[a.b]) ).to eq( %[a.b] )
438
- end
439
- end
440
-
441
464
  context 'literal quotation' do
442
465
  it 'should quote and escape literals' do
443
466
  quoted_type = PG::TextEncoder::QuotedLiteral.new elements_type: textenc_string_array
metadata CHANGED
@@ -1,121 +1,72 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pg
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.18.1
4
+ version: 0.18.2
5
5
  platform: x64-mingw32
6
6
  authors:
7
7
  - Michael Granger
8
8
  - Lars Kanis
9
9
  autorequire:
10
10
  bindir: bin
11
- cert_chain:
12
- - |
13
- -----BEGIN CERTIFICATE-----
14
- MIIDLjCCAhagAwIBAgIBAjANBgkqhkiG9w0BAQUFADA9MQ4wDAYDVQQDDAVrYW5p
15
- czEXMBUGCgmSJomT8ixkARkWB2NvbWNhcmQxEjAQBgoJkiaJk/IsZAEZFgJkZTAe
16
- Fw0xNDAyMjYwOTMzMDBaFw0xNTAyMjYwOTMzMDBaMD0xDjAMBgNVBAMMBWthbmlz
17
- MRcwFQYKCZImiZPyLGQBGRYHY29tY2FyZDESMBAGCgmSJomT8ixkARkWAmRlMIIB
18
- IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApop+rNmg35bzRugZ21VMGqI6
19
- HGzPLO4VHYncWn/xmgPU/ZMcZdfj6MzIaZJ/czXyt4eHpBk1r8QOV3gBXnRXEjVW
20
- 9xi+EdVOkTV2/AVFKThcbTAQGiF/bT1n2M+B1GTybRzMg6hyhOJeGPqIhLfJEpxn
21
- lJi4+ENAVT4MpqHEAGB8yFoPC0GqiOHQsdHxQV3P3c2OZqG+yJey74QtwA2tLcLn
22
- Q53c63+VLGsOjODl1yPn/2ejyq8qWu6ahfTxiIlSar2UbwtaQGBDFdb2CXgEufXT
23
- L7oaPxlmj+Q2oLOfOnInd2Oxop59HoJCQPsg8f921J43NCQGA8VHK6paxIRDLQID
24
- AQABozkwNzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQUvgTdT7fe
25
- x17ugO3IOsjEJwW7KP4wDQYJKoZIhvcNAQEFBQADggEBAFmIAhRT0awqLQN9e4Uv
26
- ZEk+jUWv4zkb+TWiKFJXlwjPyjGbZY9gVfOwAwMibYOK/t/+57ZzW3d0L12OUwvo
27
- on84NVvYtIr1/iskJFWFkMoIquAFCdi9p68stSPMQK2XcrJJuRot29fJtropsZBa
28
- 2cpaNd/sRYdK4oep2usdKifA1lI0hIkPb3r5nLfwG2lAqBH7WZsUICHcTgR0VEbG
29
- z9Ug5qQp9Uz73xC9YdGvGiuOX53LYobHAR4MWi2xxDlHI+ER8mRz0eY2FUuNu/Wj
30
- GrqF74zpLl7/KFdHC8VmzwZS18hvDjxeLVuVI2gIGnBInqnlqv05g/l4/1pISh5j
31
- dS4=
32
- -----END CERTIFICATE-----
33
- date: 2015-01-06 00:00:00.000000000 Z
11
+ cert_chain: []
12
+ date: 2015-05-15 00:00:00.000000000 Z
34
13
  dependencies:
35
14
  - !ruby/object:Gem::Dependency
36
- name: hoe-mercurial
37
- requirement: !ruby/object:Gem::Requirement
38
- requirements:
39
- - - "~>"
40
- - !ruby/object:Gem::Version
41
- version: '1.4'
42
- type: :development
43
- prerelease: false
44
- version_requirements: !ruby/object:Gem::Requirement
45
- requirements:
46
- - - "~>"
47
- - !ruby/object:Gem::Version
48
- version: '1.4'
49
- - !ruby/object:Gem::Dependency
50
- name: hoe-deveiate
51
- requirement: !ruby/object:Gem::Requirement
52
- requirements:
53
- - - "~>"
54
- - !ruby/object:Gem::Version
55
- version: '0.6'
56
- type: :development
57
- prerelease: false
58
- version_requirements: !ruby/object:Gem::Requirement
59
- requirements:
60
- - - "~>"
61
- - !ruby/object:Gem::Version
62
- version: '0.6'
63
- - !ruby/object:Gem::Dependency
64
- name: hoe-highline
15
+ name: rdoc
65
16
  requirement: !ruby/object:Gem::Requirement
66
17
  requirements:
67
18
  - - "~>"
68
19
  - !ruby/object:Gem::Version
69
- version: '0.2'
20
+ version: '4.0'
70
21
  type: :development
71
22
  prerelease: false
72
23
  version_requirements: !ruby/object:Gem::Requirement
73
24
  requirements:
74
25
  - - "~>"
75
26
  - !ruby/object:Gem::Version
76
- version: '0.2'
27
+ version: '4.0'
77
28
  - !ruby/object:Gem::Dependency
78
- name: rdoc
29
+ name: rake-compiler
79
30
  requirement: !ruby/object:Gem::Requirement
80
31
  requirements:
81
32
  - - "~>"
82
33
  - !ruby/object:Gem::Version
83
- version: '4.0'
34
+ version: '0.9'
84
35
  type: :development
85
36
  prerelease: false
86
37
  version_requirements: !ruby/object:Gem::Requirement
87
38
  requirements:
88
39
  - - "~>"
89
40
  - !ruby/object:Gem::Version
90
- version: '4.0'
41
+ version: '0.9'
91
42
  - !ruby/object:Gem::Dependency
92
- name: rake-compiler
43
+ name: hoe
93
44
  requirement: !ruby/object:Gem::Requirement
94
45
  requirements:
95
46
  - - "~>"
96
47
  - !ruby/object:Gem::Version
97
- version: '0.9'
48
+ version: '3.12'
98
49
  type: :development
99
50
  prerelease: false
100
51
  version_requirements: !ruby/object:Gem::Requirement
101
52
  requirements:
102
53
  - - "~>"
103
54
  - !ruby/object:Gem::Version
104
- version: '0.9'
55
+ version: '3.12'
105
56
  - !ruby/object:Gem::Dependency
106
- name: hoe
57
+ name: hoe-deveiate
107
58
  requirement: !ruby/object:Gem::Requirement
108
59
  requirements:
109
60
  - - "~>"
110
61
  - !ruby/object:Gem::Version
111
- version: '3.12'
62
+ version: '0.6'
112
63
  type: :development
113
64
  prerelease: false
114
65
  version_requirements: !ruby/object:Gem::Requirement
115
66
  requirements:
116
67
  - - "~>"
117
68
  - !ruby/object:Gem::Version
118
- version: '3.12'
69
+ version: '0.6'
119
70
  - !ruby/object:Gem::Dependency
120
71
  name: hoe-bundler
121
72
  requirement: !ruby/object:Gem::Requirement