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.
- checksums.yaml +4 -4
- data/ChangeLog +368 -316
- data/History.rdoc +16 -0
- data/README.rdoc +1 -1
- data/Rakefile.cross +5 -0
- data/ext/extconf.rb +4 -1
- data/ext/pg.c +2 -2
- data/ext/pg.h +10 -0
- data/ext/pg_connection.c +11 -39
- data/ext/pg_result.c +3 -3
- data/ext/pg_text_decoder.c +6 -9
- data/ext/pg_text_encoder.c +36 -39
- data/ext/pg_type_map_by_mri_type.c +1 -1
- data/ext/pg_type_map_in_ruby.c +3 -6
- data/ext/util.c +1 -1
- data/ext/util.h +1 -1
- data/lib/2.0/pg_ext.so +0 -0
- data/lib/2.1/pg_ext.so +0 -0
- data/lib/2.2/pg_ext.so +0 -0
- data/lib/pg.rb +1 -1
- data/lib/pg/connection.rb +37 -27
- data/lib/pg/text_decoder.rb +2 -2
- data/lib/x64-mingw32/libpq.dll +0 -0
- data/spec/pg/connection_spec.rb +82 -6
- data/spec/pg/type_spec.rb +53 -30
- metadata +15 -64
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- metadata.gz.sig +0 -2
data/lib/2.0/pg_ext.so
CHANGED
Binary file
|
data/lib/2.1/pg_ext.so
CHANGED
Binary file
|
data/lib/2.2/pg_ext.so
CHANGED
Binary file
|
data/lib/pg.rb
CHANGED
data/lib/pg/connection.rb
CHANGED
@@ -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
|
-
|
38
|
-
|
39
|
-
|
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
|
-
|
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
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
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
|
-
|
66
|
-
|
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
|
-
|
69
|
-
|
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
|
-
|
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
|
#
|
data/lib/pg/text_decoder.rb
CHANGED
@@ -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}
|
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
|
data/lib/x64-mingw32/libpq.dll
CHANGED
Binary file
|
data/spec/pg/connection_spec.rb
CHANGED
@@ -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
|
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
|
|
data/spec/pg/type_spec.rb
CHANGED
@@ -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.
|
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:
|
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
|
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
|
27
|
+
version: '4.0'
|
77
28
|
- !ruby/object:Gem::Dependency
|
78
|
-
name:
|
29
|
+
name: rake-compiler
|
79
30
|
requirement: !ruby/object:Gem::Requirement
|
80
31
|
requirements:
|
81
32
|
- - "~>"
|
82
33
|
- !ruby/object:Gem::Version
|
83
|
-
version: '
|
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: '
|
41
|
+
version: '0.9'
|
91
42
|
- !ruby/object:Gem::Dependency
|
92
|
-
name:
|
43
|
+
name: hoe
|
93
44
|
requirement: !ruby/object:Gem::Requirement
|
94
45
|
requirements:
|
95
46
|
- - "~>"
|
96
47
|
- !ruby/object:Gem::Version
|
97
|
-
version: '
|
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: '
|
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: '
|
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: '
|
69
|
+
version: '0.6'
|
119
70
|
- !ruby/object:Gem::Dependency
|
120
71
|
name: hoe-bundler
|
121
72
|
requirement: !ruby/object:Gem::Requirement
|