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 ADDED
@@ -0,0 +1,5 @@
1
+ lib/**/*.rb
2
+ bin/*
3
+ -
4
+ features/**/*.feature
5
+ LICENSE.txt
data/Gemfile ADDED
@@ -0,0 +1,12 @@
1
+ source :rubygems
2
+
3
+ gem 'pg'
4
+
5
+ group :development, :test do
6
+ gem 'rake'
7
+ gem 'rspec'
8
+ gem 'wirble'
9
+ gem 'metric_fu'
10
+ gem 'ZenTest'
11
+ gem 'jeweler'
12
+ end
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,7 @@
1
+
2
+ require 'rubygems'
3
+ require 'pg'
4
+
5
+ # require all of the library files
6
+ # note, you may need to specify these explicitly if there are any load order dependencies
7
+ require 'pg_helper/query_helper.rb'
@@ -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
@@ -0,0 +1,8 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+
4
+ ENV['RAILS_ENV'] ||= 'development'
5
+
6
+ Bundler.require(:default, ENV['RAILS_ENV'])
7
+
8
+ require File.expand_path('../../lib/pg_helper', __FILE__)
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