pgtk 0.2.2 → 0.3.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 43d3924569fc077b07d4db33232357d4d761af2cb81ccdad35d80ef7aae042b7
4
- data.tar.gz: 02473caa0bc03c9138afda1213cc128819d72f4e464f9589a17e0f1a940f4dd2
3
+ metadata.gz: 0a9ed47e9a89eea192bf6ee2734fc45549044a73ec9bc4add20ac30c2e692014
4
+ data.tar.gz: b13bb7742969615d67aa8b3d340042c8fdc2dc5a8360c5c092a6f775c4887edc
5
5
  SHA512:
6
- metadata.gz: 1a1796c83e25523b9113591ce9edfc4bd2078c23b3338a417cb2519be34a420545dd8b5fffb3d6fc2f6a351b89d3ca566b758efecb3d51513a3a25836ccbb287
7
- data.tar.gz: 13f8ef96a5e44c8230fc7cffc7c3e785a8fdc028d7e897c31e0834217ae3f2b037a9feae704ab466f585f83dd8acb28233c5cd44a72dcce10925a2370d804a3e
6
+ metadata.gz: 1ce328f09d0ae039cc6819a162bd5a14af315cf1ddb05eccb416d3deca13d9d59f64cefe28ac32b204912ec6768cbd2f78d2bb0f66cb9c70ab247757ddfa9895
7
+ data.tar.gz: c4a7a8f75b4eb86ce149538374cc43120601243894bc3e6ce35417e34bcb46010cd632b54e9ee81a3a44e8948386ffa988079078f6a103453080c7910f0b23cd
data/.rultor.yml CHANGED
@@ -27,8 +27,8 @@ architect:
27
27
  merge:
28
28
  script: |-
29
29
  bundle install
30
- rake
31
- pdd
30
+ bundle exec rake
31
+ pdd -f /dev/null
32
32
  deploy:
33
33
  script: |-
34
34
  echo "There is nothing to deploy"
data/README.md CHANGED
@@ -10,7 +10,9 @@
10
10
  [![PDD status](http://www.0pdd.com/svg?name=yegor256/pgtk)](http://www.0pdd.com/p?name=yegor256/pgtk)
11
11
  [![Gem Version](https://badge.fury.io/rb/pgtk.svg)](http://badge.fury.io/rb/pgtk)
12
12
  [![Maintainability](https://api.codeclimate.com/v1/badges/3a5bebac001e5288b00d/maintainability)](https://codeclimate.com/github/yegor256/pgtk/maintainability)
13
+
13
14
  [![Test Coverage](https://img.shields.io/codecov/c/github/yegor256/pgtk.svg)](https://codecov.io/github/yegor256/pgtk?branch=master)
15
+ [![Hits-of-Code](https://hitsofcode.com/github/yegor256/pgtk)](https://hitsofcode.com/view/github/yegor256/pgtk)
14
16
 
15
17
  This small Ruby gem helps you integrate PostgreSQL with your Ruby
16
18
  web app, through [Liquibase](https://www.liquibase.org/). It also adds a simple connection pool
@@ -90,15 +92,12 @@ pgsql.start(5) # Start it with five simultaneous connections
90
92
  name = pgsql.exec('SELECT name FROM user WHERE id = $1', [id])[0]['name']
91
93
  ```
92
94
 
93
- You may also use it if you need direct access to the connection,
94
- for example in order to run a set of requests in a transaction:
95
+ You may also use it if you need to run a transaction:
95
96
 
96
97
  ```ruby
97
- pgsql.connect do |c|
98
- c.transaction do |conn|
99
- conn.exec_params('DELETE FROM user WHERE id = $1', [id])
100
- conn.exec_params('INSERT INTO user (name, phone) VALUES ($1, $2)', [name, phone])
101
- end
98
+ pgsql.transaction do |t|
99
+ t.exec('DELETE FROM user WHERE id = $1', [id])
100
+ t.exec('INSERT INTO user (name, phone) VALUES ($1, $2)', [name, phone])
102
101
  end
103
102
  ```
104
103
 
@@ -114,7 +113,7 @@ module Minitest
114
113
  class Test
115
114
  def test_pgsql
116
115
  config = YAML.load_file('target/pgsql-config.yml')
117
- @test_pgsql ||= Pgtk::Pool.new(
116
+ @@test_pgsql ||= Pgtk::Pool.new(
118
117
  host: config['pgsql']['host'],
119
118
  port: config['pgsql']['port'],
120
119
  dbname: config['pgsql']['dbname'],
data/lib/pgtk/pool.rb CHANGED
@@ -32,7 +32,6 @@ class Pgtk::Pool
32
32
  def initialize(host: 'localhost', port:, dbname:, user:, password:)
33
33
  @host = host
34
34
  @port = port
35
- @port = port
36
35
  @dbname = dbname
37
36
  @user = user
38
37
  @password = password
@@ -91,7 +90,40 @@ class Pgtk::Pool
91
90
  # here: https://www.rubydoc.info/gems/pg/0.17.1/PG%2FConnection:exec_params
92
91
  def exec(query, args = [], result = 0)
93
92
  connect do |c|
94
- c.exec_params(query, args, result) do |res|
93
+ t = Txn.new(c)
94
+ if block_given?
95
+ t.exec(query, args, result) do |res|
96
+ yield res
97
+ end
98
+ else
99
+ t.exec(query, args, result)
100
+ end
101
+ end
102
+ end
103
+
104
+ # Run a transaction. The block has to be provided. It will receive
105
+ # a temporary object, which implements method +exec+, which works
106
+ # exactly like the method +exec+ of class +Pool+, for example:
107
+ #
108
+ # pgsql.transaction do |t|
109
+ # t.exec('DELETE FROM user WHERE id = $1', [id])
110
+ # t.exec('INSERT INTO user (name) VALUES ($1)', [name])
111
+ # end
112
+ def transaction
113
+ connect do |c|
114
+ t = Txn.new(c)
115
+ yield t
116
+ end
117
+ end
118
+
119
+ # A temporary class to execute a single SQL request.
120
+ class Txn
121
+ def initialize(conn)
122
+ @conn = conn
123
+ end
124
+
125
+ def exec(query, args = [], result = 0)
126
+ @conn.exec_params(query, args, result) do |res|
95
127
  if block_given?
96
128
  yield res
97
129
  else
@@ -103,15 +135,8 @@ class Pgtk::Pool
103
135
  end
104
136
  end
105
137
 
106
- # Get a connection from the pool and let us work with it. The block
107
- # has to be provided, for example:
108
- #
109
- # pgsql.connect do |c|
110
- # c.transaction do |conn|
111
- # conn.exec_params('DELETE FROM user WHERE id = $1', [id])
112
- # conn.exec_params('INSERT INTO user (name) VALUES ($1)', [name])
113
- # end
114
- # end
138
+ private
139
+
115
140
  def connect
116
141
  conn = @pool.pop
117
142
  begin
data/lib/pgtk/version.rb CHANGED
@@ -28,5 +28,5 @@ require_relative '../pgtk'
28
28
  # License:: MIT
29
29
  module Pgtk
30
30
  # Current version of the library.
31
- VERSION = '0.2.2'
31
+ VERSION = '0.3.0'
32
32
  end
@@ -45,7 +45,7 @@ class TestLiquibaseTask < Minitest::Test
45
45
  Rake::Task['pgsql2'].invoke
46
46
  Pgtk::LiquibaseTask.new(:liquibase2) do |t|
47
47
  t.master = File.join(__dir__, '../test-resources/master.xml')
48
- t.yaml = ['file-is-absent', File.join(dir, 'cfg.yml')]
48
+ t.yaml = ['file-is-absent', File.join(dir, 'cfg.yml'), 'another']
49
49
  t.quiet = true
50
50
  end
51
51
  Rake::Task['liquibase2'].invoke
data/test/test_pool.rb CHANGED
@@ -34,8 +34,34 @@ require_relative '../lib/pgtk/pool'
34
34
  # License:: MIT
35
35
  class TestPool < Minitest::Test
36
36
  def test_basic
37
+ bootstrap do |pool|
38
+ id = pool.exec(
39
+ 'INSERT INTO book (title) VALUES ($1) RETURNING id',
40
+ ['Elegant Objects']
41
+ )[0]['id'].to_i
42
+ assert(id.positive?)
43
+ end
44
+ end
45
+
46
+ def test_transaction
47
+ bootstrap do |pool|
48
+ id = pool.transaction do |t|
49
+ t.exec('DELETE FROM book')
50
+ t.exec(
51
+ 'INSERT INTO book (title) VALUES ($1) RETURNING id',
52
+ ['Object Thinking']
53
+ )[0]['id'].to_i
54
+ end
55
+ assert(id.positive?)
56
+ end
57
+ end
58
+
59
+ private
60
+
61
+ def bootstrap
37
62
  Dir.mktmpdir 'test' do |dir|
38
- Pgtk::PgsqlTask.new(:pgsql1) do |t|
63
+ id = rand(100..999)
64
+ Pgtk::PgsqlTask.new("pgsql#{id}") do |t|
39
65
  t.dir = File.join(dir, 'pgsql')
40
66
  t.user = 'hello'
41
67
  t.password = 'A B C привет ! & | !'
@@ -43,13 +69,13 @@ class TestPool < Minitest::Test
43
69
  t.yaml = File.join(dir, 'cfg.yml')
44
70
  t.quiet = true
45
71
  end
46
- Rake::Task['pgsql1'].invoke
47
- Pgtk::LiquibaseTask.new(:liquibase1) do |t|
72
+ Rake::Task["pgsql#{id}"].invoke
73
+ Pgtk::LiquibaseTask.new("liquibase#{id}") do |t|
48
74
  t.master = File.join(__dir__, '../test-resources/master.xml')
49
75
  t.yaml = File.join(dir, 'cfg.yml')
50
76
  t.quiet = true
51
77
  end
52
- Rake::Task['liquibase1'].invoke
78
+ Rake::Task["liquibase#{id}"].invoke
53
79
  yaml = YAML.load_file(File.join(dir, 'cfg.yml'))
54
80
  pool = Pgtk::Pool.new(
55
81
  port: yaml['pgsql']['port'],
@@ -58,11 +84,7 @@ class TestPool < Minitest::Test
58
84
  password: yaml['pgsql']['password']
59
85
  )
60
86
  pool.start(1)
61
- id = pool.exec(
62
- 'INSERT INTO book (title) VALUES ($1) RETURNING id',
63
- ['Elegant Objects']
64
- )[0]['id'].to_i
65
- assert(id.positive?)
87
+ yield pool
66
88
  end
67
89
  end
68
90
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pgtk
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yegor Bugayenko
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-04-16 00:00:00.000000000 Z
11
+ date: 2019-04-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: backtrace