database_recorder 0.2.1 → 0.2.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +25 -5
- data/lib/database_recorder/config.rb +5 -3
- data/lib/database_recorder/core.rb +5 -2
- data/lib/database_recorder/rspec.rb +1 -1
- data/lib/database_recorder/storage/file.rb +5 -2
- data/lib/database_recorder/storage/redis.rb +2 -0
- data/lib/database_recorder/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 48d1f4f88105fa9ac49075181f90208ca051bec2273daaeaf77cca9ad2c1ed77
|
4
|
+
data.tar.gz: 9ef096a48a9a0dafd7bbab635a20805d4b5ec0f06710d9b596554a1f03016c8e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 177da34267bb1fb58fb1b99e68d68430f8d36822facffb9fcd42e2e024176bbfc7be4d57ef807ce834bf1522151255c1614e5a9bb73833d86b70eb502aac0a30
|
7
|
+
data.tar.gz: 43d907dd4dc7902280bb379a4ae20dadca9c89712e62a188be7609795efd0c87db968c0b938e303e1f3e38bf44e23d34ed91be567169e118b42b3c00bd7e212e
|
data/README.md
CHANGED
@@ -6,7 +6,7 @@
|
|
6
6
|
[![Specs PostgreSQL](https://github.com/blocknotes/database_recorder/actions/workflows/specs_postgres.yml/badge.svg)](https://github.com/blocknotes/database_recorder/actions/workflows/specs_postgres.yml)
|
7
7
|
|
8
8
|
Record database queries for testing and development purposes.
|
9
|
-
|
9
|
+
Store queries information on files or Redis.
|
10
10
|
|
11
11
|
Main features:
|
12
12
|
- store the history of the queries of a test when it run (for monitoring);
|
@@ -15,10 +15,16 @@ Main features:
|
|
15
15
|
|
16
16
|
Sample output: [test.yml](extra/sample.yml)
|
17
17
|
|
18
|
+
Creating an environment variable to enable it with RSpec:
|
19
|
+
|
20
|
+
![image1](extra/image1.png)
|
21
|
+
|
18
22
|
## Install
|
19
23
|
|
24
|
+
### With RSpec
|
25
|
+
|
20
26
|
- Add to your Gemfile: `gem 'database_recorder', require: false` (:development, :test groups recommended)
|
21
|
-
-
|
27
|
+
- Add in **rails_helper.rb**:
|
22
28
|
|
23
29
|
```rb
|
24
30
|
require 'database_recorder'
|
@@ -49,9 +55,20 @@ RSpec.configure do |config|
|
|
49
55
|
end
|
50
56
|
```
|
51
57
|
|
52
|
-
|
58
|
+
### With plain Ruby
|
53
59
|
|
54
|
-
|
60
|
+
```rb
|
61
|
+
DatabaseRecorder::Config.db_driver = :pg
|
62
|
+
DatabaseRecorder::Core.setup
|
63
|
+
DatabaseRecorder::Recording.new(options: { name: 'pg_file' }).tap do |recording|
|
64
|
+
pp recording.start do
|
65
|
+
PG.connect(DB_CONFIG).exec("INSERT INTO tags(name, created_at, updated_at) VALUES('tag1', NOW(), NOW())")
|
66
|
+
PG.connect(DB_CONFIG).exec("SELECT * FROM tags")
|
67
|
+
end
|
68
|
+
end
|
69
|
+
```
|
70
|
+
|
71
|
+
Please check more [examples](examples).
|
55
72
|
|
56
73
|
## Config
|
57
74
|
|
@@ -61,7 +78,10 @@ Add to your _spec_helper.rb_:
|
|
61
78
|
# Database driver to use: :active_record | :mysql2 | :pg
|
62
79
|
DatabaseRecorder::Config.db_driver = :pg
|
63
80
|
|
64
|
-
#
|
81
|
+
# Log queries format (default: '[DB] %sql [%name]')
|
82
|
+
DatabaseRecorder::Config.log_format = '>>> %name -- %sql'
|
83
|
+
|
84
|
+
# To print/log the queries while executing the specs: false | true | :color
|
65
85
|
DatabaseRecorder::Config.print_queries = true
|
66
86
|
|
67
87
|
# Replay the recordings intercepting the queries
|
@@ -8,6 +8,7 @@ module DatabaseRecorder
|
|
8
8
|
include Singleton
|
9
9
|
|
10
10
|
DEFAULT_DB_DRIVER = :active_record
|
11
|
+
DEFAULT_LOG_FORMAT = '[DB] %sql [%name]'
|
11
12
|
DEFAULT_STORAGE = DatabaseRecorder::Storage::File
|
12
13
|
|
13
14
|
DB_DRIVER_VALUES = %i[active_record mysql2 pg].freeze
|
@@ -17,16 +18,17 @@ module DatabaseRecorder
|
|
17
18
|
redis: DatabaseRecorder::Storage::Redis
|
18
19
|
}.freeze
|
19
20
|
|
20
|
-
attr_accessor :db_driver, :print_queries, :replay_recordings, :storage, :storage_options
|
21
|
+
attr_accessor :db_driver, :log_format, :print_queries, :replay_recordings, :storage, :storage_options
|
21
22
|
|
22
23
|
class << self
|
23
24
|
extend Forwardable
|
24
25
|
|
25
|
-
def_delegators :instance, :db_driver, :
|
26
|
-
:storage_options, :storage_options=
|
26
|
+
def_delegators :instance, :db_driver, :log_format, :log_format=, :print_queries, :replay_recordings,
|
27
|
+
:replay_recordings=, :storage, :storage_options, :storage_options=
|
27
28
|
|
28
29
|
def load_defaults
|
29
30
|
instance.db_driver = DEFAULT_DB_DRIVER
|
31
|
+
instance.log_format = DEFAULT_LOG_FORMAT
|
30
32
|
instance.print_queries = false
|
31
33
|
instance.replay_recordings = false
|
32
34
|
instance.storage = DEFAULT_STORAGE
|
@@ -7,8 +7,11 @@ module DatabaseRecorder
|
|
7
7
|
def log_query(sql, source = nil)
|
8
8
|
log =
|
9
9
|
case DatabaseRecorder::Config.print_queries
|
10
|
-
when true
|
11
|
-
|
10
|
+
when true
|
11
|
+
DatabaseRecorder::Config.log_format.sub('%name', source.to_s).sub('%sql', sql)
|
12
|
+
when :color
|
13
|
+
code_ray_sql = CodeRay.scan(sql, :sql).term
|
14
|
+
DatabaseRecorder::Config.log_format.sub('%name', source.to_s).sub('%sql', code_ray_sql || '')
|
12
15
|
end
|
13
16
|
|
14
17
|
puts log if log
|
@@ -13,8 +13,8 @@ module DatabaseRecorder
|
|
13
13
|
config.around(:each, :dbr) do |example|
|
14
14
|
ref = (example.metadata[:scoped_id] || '').split(':')[-1]
|
15
15
|
options = {}
|
16
|
+
options[:name] = "#{example.full_description}__#{ref}"
|
16
17
|
options.merge!(example.metadata[:dbr]) if example.metadata[:dbr].is_a?(Hash)
|
17
|
-
options.merge!(example: example, name: "#{example.full_description}__#{ref}")
|
18
18
|
Recording.new(options: options).tap do |recording|
|
19
19
|
recording.metadata = { example: example.id, started_at: Time.now }
|
20
20
|
result = recording.start { example.run }
|
@@ -1,5 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'fileutils'
|
4
|
+
require 'yaml'
|
5
|
+
|
3
6
|
module DatabaseRecorder
|
4
7
|
module Storage
|
5
8
|
class File < Base
|
@@ -21,7 +24,7 @@ module DatabaseRecorder
|
|
21
24
|
data[:metadata] = @recording.metadata unless @recording.metadata.empty?
|
22
25
|
data[:queries] = @recording.queries if @recording.queries.any?
|
23
26
|
data[:entities] = @recording.entities if @recording.entities.any?
|
24
|
-
serialized_data = Core.string_keys_recursive(data)
|
27
|
+
serialized_data = ::YAML.dump(Core.string_keys_recursive(data))
|
25
28
|
::File.write(storage_path, serialized_data)
|
26
29
|
true
|
27
30
|
end
|
@@ -30,7 +33,7 @@ module DatabaseRecorder
|
|
30
33
|
@storage_path ||= begin
|
31
34
|
name = normalize_name(@name)
|
32
35
|
path = @options[:recordings_path] || 'spec/dbr'
|
33
|
-
FileUtils.mkdir_p(path)
|
36
|
+
::FileUtils.mkdir_p(path)
|
34
37
|
"#{path}/#{name}.yml"
|
35
38
|
end
|
36
39
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: database_recorder
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mattia Roccoberton
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-04-
|
11
|
+
date: 2022-04-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: coderay
|