pg_helper 0.1.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/.document +5 -0
- data/Gemfile +12 -0
- data/Gemfile.lock +97 -0
- data/Rakefile +38 -0
- data/VERSION +1 -0
- data/autotest/discover.rb +1 -0
- data/init.rb +1 -0
- data/lib/pg_helper/query_helper.rb +100 -0
- data/lib/pg_helper.rb +7 -0
- data/spec/lib/pg_helper_spec.rb +229 -0
- data/spec/spec_helper.rb +8 -0
- metadata +274 -0
data/.document
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,97 @@
|
|
1
|
+
GEM
|
2
|
+
remote: http://rubygems.org/
|
3
|
+
specs:
|
4
|
+
Saikuro (1.1.0)
|
5
|
+
ZenTest (4.5.0)
|
6
|
+
abstract (1.0.0)
|
7
|
+
activesupport (3.0.5)
|
8
|
+
arrayfields (4.7.4)
|
9
|
+
chronic (0.3.0)
|
10
|
+
churn (0.0.13)
|
11
|
+
chronic (>= 0.2.3)
|
12
|
+
hirb
|
13
|
+
json_pure
|
14
|
+
main
|
15
|
+
ruby_parser (~> 2.0.4)
|
16
|
+
sexp_processor (~> 3.0.3)
|
17
|
+
colored (1.2)
|
18
|
+
diff-lcs (1.1.2)
|
19
|
+
erubis (2.6.6)
|
20
|
+
abstract (>= 1.0.0)
|
21
|
+
fattr (2.2.0)
|
22
|
+
flay (1.4.2)
|
23
|
+
ruby_parser (~> 2.0)
|
24
|
+
sexp_processor (~> 3.0)
|
25
|
+
flog (2.5.1)
|
26
|
+
ruby_parser (~> 2.0)
|
27
|
+
sexp_processor (~> 3.0)
|
28
|
+
git (1.2.5)
|
29
|
+
haml (3.0.25)
|
30
|
+
hirb (0.4.0)
|
31
|
+
i18n (0.5.0)
|
32
|
+
jeweler (1.5.2)
|
33
|
+
bundler (~> 1.0.0)
|
34
|
+
git (>= 1.2.5)
|
35
|
+
rake
|
36
|
+
json_pure (1.5.1)
|
37
|
+
main (4.4.0)
|
38
|
+
arrayfields (>= 4.7.4)
|
39
|
+
fattr (>= 2.1.0)
|
40
|
+
metric_fu (2.1.1)
|
41
|
+
Saikuro (>= 1.1.0)
|
42
|
+
activesupport (>= 2.0.0)
|
43
|
+
chronic (~> 0.3.0)
|
44
|
+
churn (>= 0.0.7)
|
45
|
+
flay (>= 1.2.1)
|
46
|
+
flog (>= 2.3.0)
|
47
|
+
rails_best_practices (>= 0.6.4)
|
48
|
+
rcov (>= 0.8.3.3)
|
49
|
+
reek (>= 1.2.6)
|
50
|
+
roodi (>= 2.1.0)
|
51
|
+
syntax
|
52
|
+
pg (0.10.1)
|
53
|
+
rails_best_practices (0.7.2)
|
54
|
+
activesupport
|
55
|
+
colored (~> 1.2)
|
56
|
+
erubis (~> 2.6.6)
|
57
|
+
haml (~> 3.0.18)
|
58
|
+
i18n
|
59
|
+
ruby-progressbar (~> 0.0.9)
|
60
|
+
ruby_parser (~> 2.0.4)
|
61
|
+
rake (0.8.7)
|
62
|
+
rcov (0.9.9)
|
63
|
+
reek (1.2.8)
|
64
|
+
ruby2ruby (~> 1.2)
|
65
|
+
ruby_parser (~> 2.0)
|
66
|
+
sexp_processor (~> 3.0)
|
67
|
+
roodi (2.1.0)
|
68
|
+
ruby_parser
|
69
|
+
rspec (2.5.0)
|
70
|
+
rspec-core (~> 2.5.0)
|
71
|
+
rspec-expectations (~> 2.5.0)
|
72
|
+
rspec-mocks (~> 2.5.0)
|
73
|
+
rspec-core (2.5.1)
|
74
|
+
rspec-expectations (2.5.0)
|
75
|
+
diff-lcs (~> 1.1.2)
|
76
|
+
rspec-mocks (2.5.0)
|
77
|
+
ruby-progressbar (0.0.9)
|
78
|
+
ruby2ruby (1.2.5)
|
79
|
+
ruby_parser (~> 2.0)
|
80
|
+
sexp_processor (~> 3.0)
|
81
|
+
ruby_parser (2.0.6)
|
82
|
+
sexp_processor (~> 3.0)
|
83
|
+
sexp_processor (3.0.5)
|
84
|
+
syntax (1.0.0)
|
85
|
+
wirble (0.1.3)
|
86
|
+
|
87
|
+
PLATFORMS
|
88
|
+
ruby
|
89
|
+
|
90
|
+
DEPENDENCIES
|
91
|
+
ZenTest
|
92
|
+
jeweler
|
93
|
+
metric_fu
|
94
|
+
pg
|
95
|
+
rake
|
96
|
+
rspec
|
97
|
+
wirble
|
data/Rakefile
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'bundler/setup'
|
3
|
+
|
4
|
+
ENV['RAILS_ENV'] ||= 'development'
|
5
|
+
|
6
|
+
Bundler.require(:default, ENV['RAILS_ENV'])
|
7
|
+
|
8
|
+
require 'lib/pg_helper'
|
9
|
+
|
10
|
+
require 'rake'
|
11
|
+
require 'rspec/core/rake_task'
|
12
|
+
|
13
|
+
RSpec::Core::RakeTask.new(:spec) do |t|
|
14
|
+
t.rspec_opts = ["--color"]
|
15
|
+
end
|
16
|
+
task :default => :spec
|
17
|
+
|
18
|
+
require 'jeweler'
|
19
|
+
Jeweler::Tasks.new do |gem|
|
20
|
+
# gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
|
21
|
+
gem.name = "pg_helper"
|
22
|
+
gem.homepage = "http://github.com/webervin/pg_helper"
|
23
|
+
gem.license = "MIT"
|
24
|
+
gem.summary = "Tiny wraper for 'pg' gem"
|
25
|
+
gem.description = "Makes even easier to use postgresql without activerecord"
|
26
|
+
gem.email = "webervin@gmail.com"
|
27
|
+
gem.authors = ["Ervin"]
|
28
|
+
# Include your dependencies below. Runtime dependencies are required when using your gem,
|
29
|
+
# and development dependencies are only needed for development (ie running rake tasks, tests, etc)
|
30
|
+
gem.add_runtime_dependency 'pg', '~> 0.10'
|
31
|
+
gem.add_development_dependency 'rspec'
|
32
|
+
gem.add_development_dependency 'rake'
|
33
|
+
gem.add_development_dependency 'wirble'
|
34
|
+
gem.add_development_dependency 'metric_fu'
|
35
|
+
gem.add_development_dependency 'ZenTest'
|
36
|
+
gem.add_development_dependency 'jeweler'
|
37
|
+
end
|
38
|
+
Jeweler::RubygemsDotOrgTasks.new
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.1.0
|
@@ -0,0 +1 @@
|
|
1
|
+
Autotest.add_discovery { "rspec2" }
|
data/init.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'pg_helper'
|
@@ -0,0 +1,100 @@
|
|
1
|
+
|
2
|
+
module PgHelper
|
3
|
+
class PgHelperErrorInvalidColumnCount < PGError; end
|
4
|
+
class PgHelperErrorInvalidRowCount < PGError; end
|
5
|
+
class PgHelperErrorNestedTransactionNotAllowed < PGError; end
|
6
|
+
class PgHelperErrorRollback < PGError; end
|
7
|
+
class PgHelperErrorInvalidOutsideTransaction < PGError; end
|
8
|
+
class PgHelperErrorParamsMustBeArrayOfStrings < PGError; end
|
9
|
+
|
10
|
+
class QueryHelper
|
11
|
+
attr_accessor :connection_params, :pg_connection
|
12
|
+
|
13
|
+
def initialize(params)
|
14
|
+
@connection_params = params
|
15
|
+
reconnect
|
16
|
+
end
|
17
|
+
|
18
|
+
def value(query, params = [])
|
19
|
+
exec(query, params) do |pg_result|
|
20
|
+
verify_single_cell!(pg_result)
|
21
|
+
pg_result.getvalue(0,0)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def get_column(query, params = [])
|
26
|
+
exec(query, params) do |pg_result|
|
27
|
+
require_single_column!(pg_result)
|
28
|
+
pg_result.column_values(0)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def modify(query, params = [])
|
33
|
+
exec(query, params) do |pg_result|
|
34
|
+
pg_result.cmd_tuples
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def transaction(&block)
|
39
|
+
verify_transaction_possible!(&block)
|
40
|
+
perform_transaction(&block)
|
41
|
+
end
|
42
|
+
|
43
|
+
def rollback!
|
44
|
+
raise PgHelperErrorInvalidOutsideTransaction if connection_idle?
|
45
|
+
raise PgHelperErrorRollback.new
|
46
|
+
end
|
47
|
+
|
48
|
+
protected
|
49
|
+
|
50
|
+
def connection_idle?
|
51
|
+
PGconn::PQTRANS_IDLE == @pg_connection.transaction_status
|
52
|
+
end
|
53
|
+
|
54
|
+
def require_single_row!(pg_result)
|
55
|
+
raise PgHelperErrorInvalidRowCount.new if pg_result.ntuples != 1
|
56
|
+
end
|
57
|
+
|
58
|
+
def require_single_column!(pg_result)
|
59
|
+
raise PgHelperErrorInvalidColumnCount.new if pg_result.nfields != 1
|
60
|
+
end
|
61
|
+
|
62
|
+
def exec(query, params=[], &block)
|
63
|
+
check_query_params(params)
|
64
|
+
pg_result = nil
|
65
|
+
begin
|
66
|
+
pg_result = @pg_connection.exec(query, params)
|
67
|
+
block.call(pg_result)
|
68
|
+
ensure
|
69
|
+
pg_result && pg_result.clear
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def check_query_params(params)
|
74
|
+
raise PgHelperErrorParamsMustBeArrayOfStrings.new unless params.is_a?(Array)
|
75
|
+
end
|
76
|
+
def reconnect
|
77
|
+
@pg_connection = PGconn.open(@connection_params)
|
78
|
+
end
|
79
|
+
|
80
|
+
def perform_transaction(&block)
|
81
|
+
@pg_connection.transaction do
|
82
|
+
begin
|
83
|
+
block.call(self)
|
84
|
+
rescue PgHelperErrorRollback
|
85
|
+
true
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def verify_transaction_possible!(&block)
|
91
|
+
raise PgHelperErrorNestedTransactionNotAllowed.new unless connection_idle?
|
92
|
+
raise ArgumentError.new('missing block') unless block_given?
|
93
|
+
end
|
94
|
+
|
95
|
+
def verify_single_cell!(pg_result)
|
96
|
+
require_single_row!(pg_result)
|
97
|
+
require_single_column!(pg_result)
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
data/lib/pg_helper.rb
ADDED
@@ -0,0 +1,229 @@
|
|
1
|
+
require File.expand_path('../../spec_helper', __FILE__)
|
2
|
+
include PgHelper
|
3
|
+
describe QueryHelper do
|
4
|
+
describe 'connection params' do
|
5
|
+
let(:params) {
|
6
|
+
{
|
7
|
+
:host => 'my host',
|
8
|
+
:port => 1234,
|
9
|
+
:username => 'my user',
|
10
|
+
:password => 'my password',
|
11
|
+
:database => 'my base'
|
12
|
+
}
|
13
|
+
}
|
14
|
+
|
15
|
+
it 'are stored upon initializetion' do
|
16
|
+
PGconn.stub!(:open => true)
|
17
|
+
QueryHelper.new(params).connection_params.should == params
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'are passed to pgconn' do
|
21
|
+
mock(:conn).tap do |conn|
|
22
|
+
PGconn.should_receive(:open).with(params).and_return(conn)
|
23
|
+
QueryHelper.new(params).pg_connection.should == conn
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def build_result(params={})
|
29
|
+
mock(:result,
|
30
|
+
{
|
31
|
+
:nfields => 1,
|
32
|
+
:ntuples => 1
|
33
|
+
}.merge(params)
|
34
|
+
).as_null_object
|
35
|
+
end
|
36
|
+
|
37
|
+
def mock_result(params = {}, *args)
|
38
|
+
build_result(params).tap do |result_mock|
|
39
|
+
if args.empty?
|
40
|
+
pg_helper.pg_connection.should_receive(:exec).and_return(result_mock)
|
41
|
+
else
|
42
|
+
pg_helper.pg_connection.should_receive(:exec).with(*args).and_return(result_mock)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
let(:pg_helper) { QueryHelper.new({:database => 'postgres'})}
|
48
|
+
|
49
|
+
describe 'single value' do
|
50
|
+
it 'is returned as string' do
|
51
|
+
pg_helper.value('select 1').should == '1'
|
52
|
+
end
|
53
|
+
|
54
|
+
it 'raises error if gets non array as params' do
|
55
|
+
lambda {
|
56
|
+
pg_helper.value('select 1', 'bar')
|
57
|
+
}.should raise_error(PgHelperErrorParamsMustBeArrayOfStrings)
|
58
|
+
end
|
59
|
+
|
60
|
+
it 'allows to pass params to query' do
|
61
|
+
param = ["foo; > 'bar'"]
|
62
|
+
pg_helper.value('select $1::text', param).should == "foo; > 'bar'"
|
63
|
+
end
|
64
|
+
|
65
|
+
it 'raises error if more than 1 row returned' do
|
66
|
+
lambda {
|
67
|
+
pg_helper.value('select 1, 2')
|
68
|
+
}.should raise_error(PgHelperErrorInvalidColumnCount)
|
69
|
+
end
|
70
|
+
|
71
|
+
it 'raises error if more than 1 row returned' do
|
72
|
+
lambda {
|
73
|
+
pg_helper.value('select 1 union select 2')
|
74
|
+
}.should raise_error(PgHelperErrorInvalidRowCount)
|
75
|
+
end
|
76
|
+
|
77
|
+
it 'clears pg result on success' do
|
78
|
+
mock_result.should_receive(:clear)
|
79
|
+
pg_helper.value('foo')
|
80
|
+
end
|
81
|
+
|
82
|
+
it 'clears pg result on failure' do
|
83
|
+
lambda {
|
84
|
+
mock_result({:nfields => 2}).should_receive(:clear)
|
85
|
+
pg_helper.value('foo')
|
86
|
+
}
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
describe 'array of column values' do
|
91
|
+
it 'returns values of column as array of stirngs' do
|
92
|
+
pg_helper.get_column( 'select 1 union (select 2 union select 3)').should == ['1','2','3']
|
93
|
+
end
|
94
|
+
|
95
|
+
it 'raises error if gets non array as params' do
|
96
|
+
lambda {
|
97
|
+
pg_helper.get_column('select 1', 'bar')
|
98
|
+
}.should raise_error(PgHelperErrorParamsMustBeArrayOfStrings)
|
99
|
+
end
|
100
|
+
|
101
|
+
it 'allows to pass params to query' do
|
102
|
+
param = ['foo', ";'bar'"]
|
103
|
+
pg_helper.get_column('select $1::text as str union select $2::text as str order by str', param).should == [";'bar'", 'foo']
|
104
|
+
end
|
105
|
+
|
106
|
+
it 'raises error if more than one column returned' do
|
107
|
+
lambda {
|
108
|
+
pg_helper.get_column('select 1, 2')
|
109
|
+
}.should raise_error(PgHelperErrorInvalidColumnCount)
|
110
|
+
end
|
111
|
+
|
112
|
+
it 'clears pg result on success' do
|
113
|
+
mock_result.should_receive(:clear)
|
114
|
+
pg_helper.get_column('foo')
|
115
|
+
end
|
116
|
+
|
117
|
+
it 'clears pg result on failure' do
|
118
|
+
lambda {
|
119
|
+
mock_result({:nfields => 2}).should_receive(:clear)
|
120
|
+
pg_helper.get_column('foo')
|
121
|
+
}
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
describe 'executing operation' do
|
126
|
+
it 'returns number of rows changed by query' do
|
127
|
+
pg_helper.modify('select 1').should == 0
|
128
|
+
end
|
129
|
+
|
130
|
+
it 'uses cmd_tuples of pg_result internally' do
|
131
|
+
mock(:value).tap do |value|
|
132
|
+
mock_result(:cmd_tuples => value)
|
133
|
+
pg_helper.modify('foo').should == value
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
it 'raises error if gets non array as params' do
|
138
|
+
lambda {
|
139
|
+
pg_helper.modify('select 1', 'bar')
|
140
|
+
}.should raise_error(PgHelperErrorParamsMustBeArrayOfStrings)
|
141
|
+
end
|
142
|
+
|
143
|
+
it 'allows to pass params to query' do
|
144
|
+
sql = 'update foo set test_text = $1::text'
|
145
|
+
mock(:value).tap do |result|
|
146
|
+
mock_result({:cmd_tuples => result}, sql, ['foo'])
|
147
|
+
pg_helper.modify(sql, ["foo"]).should == result
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
|
152
|
+
it 'clears pg result on success' do
|
153
|
+
mock_result.should_receive(:clear)
|
154
|
+
pg_helper.modify('foo')
|
155
|
+
end
|
156
|
+
|
157
|
+
it 'clears pg result on failure' do
|
158
|
+
lambda {
|
159
|
+
mock_result.tap do |result|
|
160
|
+
result.should_receive(:cmd_tuples).and_raise(Exception)
|
161
|
+
result.should_receive(:clear)
|
162
|
+
end
|
163
|
+
pg_helper.modify('foo')
|
164
|
+
}
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
describe 'transaction' do
|
169
|
+
it 'raises error if no block given' do
|
170
|
+
lambda { pg_helper.transaction}.should raise_error(ArgumentError)
|
171
|
+
end
|
172
|
+
|
173
|
+
it 'allows to rollback' do
|
174
|
+
pg_helper.transaction do |t|
|
175
|
+
t.rollback!
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
179
|
+
it 'does not allow rollback if not in transaction' do
|
180
|
+
lambda {pg_helper.rollback!}.should raise_error(PgHelperErrorInvalidOutsideTransaction)
|
181
|
+
end
|
182
|
+
|
183
|
+
|
184
|
+
describe 'using temporary table' do
|
185
|
+
let(:test_table_name){'pg_helper_test_'+Time.now.to_i.to_s}
|
186
|
+
|
187
|
+
before(:all) do
|
188
|
+
sql = <<SQL
|
189
|
+
CREATE TEMP TABLE #{test_table_name}
|
190
|
+
(
|
191
|
+
test_text text
|
192
|
+
)
|
193
|
+
SQL
|
194
|
+
pg_helper.modify(sql)
|
195
|
+
end
|
196
|
+
|
197
|
+
before(:each) do
|
198
|
+
pg_helper.modify("delete from #{test_table_name}")
|
199
|
+
end
|
200
|
+
|
201
|
+
it 'will rollback on failure' do
|
202
|
+
lambda {
|
203
|
+
pg_helper.transaction do |t|
|
204
|
+
t.modify( "INSERT INTO #{test_table_name} VALUES ('one'), ('two'), ('three')" )
|
205
|
+
t.value("SELECT COUNT(*) FROM #{test_table_name}").should == '3'
|
206
|
+
raise Exception.new('roll it back')
|
207
|
+
end
|
208
|
+
}.should raise_error('roll it back')
|
209
|
+
pg_helper.value("SELECT COUNT(*) FROM #{test_table_name}").should == '0'
|
210
|
+
end
|
211
|
+
|
212
|
+
it 'will commit in the end' do
|
213
|
+
pg_helper.transaction do |t|
|
214
|
+
t.modify("INSERT INTO #{test_table_name} VALUES ('pass')")
|
215
|
+
t.modify("INSERT INTO #{test_table_name} VALUES ('correct')")
|
216
|
+
end
|
217
|
+
pg_helper.get_column("SELECT test_text FROM #{test_table_name} order by test_text").should == ["correct", "pass"]
|
218
|
+
end
|
219
|
+
end
|
220
|
+
|
221
|
+
it 'will not allow nested transaction' do
|
222
|
+
lambda {
|
223
|
+
pg_helper.transaction do |trans|
|
224
|
+
trans.transaction {nil}
|
225
|
+
end
|
226
|
+
}.should raise_error(PgHelperErrorNestedTransactionNotAllowed)
|
227
|
+
end
|
228
|
+
end
|
229
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,274 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: pg_helper
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 27
|
5
|
+
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
- 0
|
10
|
+
version: 0.1.0
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Ervin
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2011-03-21 00:00:00 +02:00
|
19
|
+
default_executable:
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: pg
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 3
|
30
|
+
segments:
|
31
|
+
- 0
|
32
|
+
version: "0"
|
33
|
+
type: :runtime
|
34
|
+
version_requirements: *id001
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
name: rake
|
37
|
+
prerelease: false
|
38
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ">="
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
hash: 3
|
44
|
+
segments:
|
45
|
+
- 0
|
46
|
+
version: "0"
|
47
|
+
type: :development
|
48
|
+
version_requirements: *id002
|
49
|
+
- !ruby/object:Gem::Dependency
|
50
|
+
name: rspec
|
51
|
+
prerelease: false
|
52
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
53
|
+
none: false
|
54
|
+
requirements:
|
55
|
+
- - ">="
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
hash: 3
|
58
|
+
segments:
|
59
|
+
- 0
|
60
|
+
version: "0"
|
61
|
+
type: :development
|
62
|
+
version_requirements: *id003
|
63
|
+
- !ruby/object:Gem::Dependency
|
64
|
+
name: wirble
|
65
|
+
prerelease: false
|
66
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
67
|
+
none: false
|
68
|
+
requirements:
|
69
|
+
- - ">="
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
hash: 3
|
72
|
+
segments:
|
73
|
+
- 0
|
74
|
+
version: "0"
|
75
|
+
type: :development
|
76
|
+
version_requirements: *id004
|
77
|
+
- !ruby/object:Gem::Dependency
|
78
|
+
name: metric_fu
|
79
|
+
prerelease: false
|
80
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ">="
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
hash: 3
|
86
|
+
segments:
|
87
|
+
- 0
|
88
|
+
version: "0"
|
89
|
+
type: :development
|
90
|
+
version_requirements: *id005
|
91
|
+
- !ruby/object:Gem::Dependency
|
92
|
+
name: ZenTest
|
93
|
+
prerelease: false
|
94
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
95
|
+
none: false
|
96
|
+
requirements:
|
97
|
+
- - ">="
|
98
|
+
- !ruby/object:Gem::Version
|
99
|
+
hash: 3
|
100
|
+
segments:
|
101
|
+
- 0
|
102
|
+
version: "0"
|
103
|
+
type: :development
|
104
|
+
version_requirements: *id006
|
105
|
+
- !ruby/object:Gem::Dependency
|
106
|
+
name: jeweler
|
107
|
+
prerelease: false
|
108
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
109
|
+
none: false
|
110
|
+
requirements:
|
111
|
+
- - ">="
|
112
|
+
- !ruby/object:Gem::Version
|
113
|
+
hash: 3
|
114
|
+
segments:
|
115
|
+
- 0
|
116
|
+
version: "0"
|
117
|
+
type: :development
|
118
|
+
version_requirements: *id007
|
119
|
+
- !ruby/object:Gem::Dependency
|
120
|
+
name: pg
|
121
|
+
prerelease: false
|
122
|
+
requirement: &id008 !ruby/object:Gem::Requirement
|
123
|
+
none: false
|
124
|
+
requirements:
|
125
|
+
- - ~>
|
126
|
+
- !ruby/object:Gem::Version
|
127
|
+
hash: 31
|
128
|
+
segments:
|
129
|
+
- 0
|
130
|
+
- 10
|
131
|
+
version: "0.10"
|
132
|
+
type: :runtime
|
133
|
+
version_requirements: *id008
|
134
|
+
- !ruby/object:Gem::Dependency
|
135
|
+
name: rspec
|
136
|
+
prerelease: false
|
137
|
+
requirement: &id009 !ruby/object:Gem::Requirement
|
138
|
+
none: false
|
139
|
+
requirements:
|
140
|
+
- - ">="
|
141
|
+
- !ruby/object:Gem::Version
|
142
|
+
hash: 3
|
143
|
+
segments:
|
144
|
+
- 0
|
145
|
+
version: "0"
|
146
|
+
type: :development
|
147
|
+
version_requirements: *id009
|
148
|
+
- !ruby/object:Gem::Dependency
|
149
|
+
name: rake
|
150
|
+
prerelease: false
|
151
|
+
requirement: &id010 !ruby/object:Gem::Requirement
|
152
|
+
none: false
|
153
|
+
requirements:
|
154
|
+
- - ">="
|
155
|
+
- !ruby/object:Gem::Version
|
156
|
+
hash: 3
|
157
|
+
segments:
|
158
|
+
- 0
|
159
|
+
version: "0"
|
160
|
+
type: :development
|
161
|
+
version_requirements: *id010
|
162
|
+
- !ruby/object:Gem::Dependency
|
163
|
+
name: wirble
|
164
|
+
prerelease: false
|
165
|
+
requirement: &id011 !ruby/object:Gem::Requirement
|
166
|
+
none: false
|
167
|
+
requirements:
|
168
|
+
- - ">="
|
169
|
+
- !ruby/object:Gem::Version
|
170
|
+
hash: 3
|
171
|
+
segments:
|
172
|
+
- 0
|
173
|
+
version: "0"
|
174
|
+
type: :development
|
175
|
+
version_requirements: *id011
|
176
|
+
- !ruby/object:Gem::Dependency
|
177
|
+
name: metric_fu
|
178
|
+
prerelease: false
|
179
|
+
requirement: &id012 !ruby/object:Gem::Requirement
|
180
|
+
none: false
|
181
|
+
requirements:
|
182
|
+
- - ">="
|
183
|
+
- !ruby/object:Gem::Version
|
184
|
+
hash: 3
|
185
|
+
segments:
|
186
|
+
- 0
|
187
|
+
version: "0"
|
188
|
+
type: :development
|
189
|
+
version_requirements: *id012
|
190
|
+
- !ruby/object:Gem::Dependency
|
191
|
+
name: ZenTest
|
192
|
+
prerelease: false
|
193
|
+
requirement: &id013 !ruby/object:Gem::Requirement
|
194
|
+
none: false
|
195
|
+
requirements:
|
196
|
+
- - ">="
|
197
|
+
- !ruby/object:Gem::Version
|
198
|
+
hash: 3
|
199
|
+
segments:
|
200
|
+
- 0
|
201
|
+
version: "0"
|
202
|
+
type: :development
|
203
|
+
version_requirements: *id013
|
204
|
+
- !ruby/object:Gem::Dependency
|
205
|
+
name: jeweler
|
206
|
+
prerelease: false
|
207
|
+
requirement: &id014 !ruby/object:Gem::Requirement
|
208
|
+
none: false
|
209
|
+
requirements:
|
210
|
+
- - ">="
|
211
|
+
- !ruby/object:Gem::Version
|
212
|
+
hash: 3
|
213
|
+
segments:
|
214
|
+
- 0
|
215
|
+
version: "0"
|
216
|
+
type: :development
|
217
|
+
version_requirements: *id014
|
218
|
+
description: Makes even easier to use postgresql without activerecord
|
219
|
+
email: webervin@gmail.com
|
220
|
+
executables: []
|
221
|
+
|
222
|
+
extensions: []
|
223
|
+
|
224
|
+
extra_rdoc_files: []
|
225
|
+
|
226
|
+
files:
|
227
|
+
- .document
|
228
|
+
- Gemfile
|
229
|
+
- Gemfile.lock
|
230
|
+
- Rakefile
|
231
|
+
- VERSION
|
232
|
+
- autotest/discover.rb
|
233
|
+
- init.rb
|
234
|
+
- lib/pg_helper.rb
|
235
|
+
- lib/pg_helper/query_helper.rb
|
236
|
+
- spec/lib/pg_helper_spec.rb
|
237
|
+
- spec/spec_helper.rb
|
238
|
+
has_rdoc: true
|
239
|
+
homepage: http://github.com/webervin/pg_helper
|
240
|
+
licenses:
|
241
|
+
- MIT
|
242
|
+
post_install_message:
|
243
|
+
rdoc_options: []
|
244
|
+
|
245
|
+
require_paths:
|
246
|
+
- lib
|
247
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
248
|
+
none: false
|
249
|
+
requirements:
|
250
|
+
- - ">="
|
251
|
+
- !ruby/object:Gem::Version
|
252
|
+
hash: 3
|
253
|
+
segments:
|
254
|
+
- 0
|
255
|
+
version: "0"
|
256
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
257
|
+
none: false
|
258
|
+
requirements:
|
259
|
+
- - ">="
|
260
|
+
- !ruby/object:Gem::Version
|
261
|
+
hash: 3
|
262
|
+
segments:
|
263
|
+
- 0
|
264
|
+
version: "0"
|
265
|
+
requirements: []
|
266
|
+
|
267
|
+
rubyforge_project:
|
268
|
+
rubygems_version: 1.5.2
|
269
|
+
signing_key:
|
270
|
+
specification_version: 3
|
271
|
+
summary: Tiny wraper for 'pg' gem
|
272
|
+
test_files:
|
273
|
+
- spec/lib/pg_helper_spec.rb
|
274
|
+
- spec/spec_helper.rb
|