database_leak_finder 0.0.2
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 +7 -0
- data/README.md +32 -0
- data/lib/database_leak_finder.rb +24 -0
- data/lib/database_leak_finder/finder.rb +33 -0
- data/lib/database_leak_finder/handler.rb +29 -0
- data/lib/database_leak_finder/logger.rb +23 -0
- data/lib/database_leak_finder/version.rb +3 -0
- metadata +133 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 654d5ed283dd00dbca47501ebfd87180d3b07a46
|
4
|
+
data.tar.gz: 1c9f861f039c88890d7e9dcdcabdce0eeb2902fb
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 3b14b5be68f8aed7af6ea3a86b86148d17d77ccd6372771f194ec50c3743222f6b40fc5b3a373b9149e057814a6e231f1b9d7791ab10e087eed0160ff5e73820
|
7
|
+
data.tar.gz: 39315f530d1388618689de20d68940ff233a1afec76bf005e48b550397e69d2a9d55bf7fae95c860c3133e4b876cac8302c402e903b2bec60a748dff1aed2160
|
data/README.md
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
# DatabaseLeakFinder [](https://circleci.com/gh/vitalinfo/database_leak_finder)
|
2
|
+
|
3
|
+
Easy way to find problem in specs with uncleared DB data
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Add the following to your Gemfile:
|
8
|
+
```ruby
|
9
|
+
gem 'database_leak_finder'
|
10
|
+
```
|
11
|
+
|
12
|
+
## Usage
|
13
|
+
|
14
|
+
Add this line to your `spec_helper.rb`
|
15
|
+
```ruby
|
16
|
+
config.include DatabaseLeakFinder
|
17
|
+
```
|
18
|
+
|
19
|
+
### Ignoring Tables
|
20
|
+
You may have some tables that you don't want to report.
|
21
|
+
|
22
|
+
Add this line to your `spec_helper.rb` before `config.include DatabaseLeakFinder`
|
23
|
+
```ruby
|
24
|
+
DatabaseLeakFinder.config(ignored_tables: [list of tables])
|
25
|
+
```
|
26
|
+
|
27
|
+
## Contributing
|
28
|
+
1. Fork it
|
29
|
+
2. Create your feature branch (git checkout -b my-new-feature)
|
30
|
+
3. Commit your changes (git commit -am 'Add some feature')
|
31
|
+
4. Push to the branch (git push origin my-new-feature)
|
32
|
+
5. Create new Pull Request
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'active_record'
|
2
|
+
require 'database_leak_finder/finder'
|
3
|
+
require 'database_leak_finder/handler'
|
4
|
+
require 'database_leak_finder/logger'
|
5
|
+
|
6
|
+
module DatabaseLeakFinder
|
7
|
+
class << self
|
8
|
+
def included(base)
|
9
|
+
base.after(:each) do |example|
|
10
|
+
DatabaseLeakFinder::Handler.log_example(example)
|
11
|
+
end
|
12
|
+
|
13
|
+
base.after(:all) do
|
14
|
+
DatabaseLeakFinder::Handler.find_leaks
|
15
|
+
end
|
16
|
+
|
17
|
+
DatabaseLeakFinder.config({}) unless DatabaseLeakFinder::Handler.options
|
18
|
+
end
|
19
|
+
|
20
|
+
def config(options)
|
21
|
+
DatabaseLeakFinder::Handler.config(options)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module DatabaseLeakFinder
|
2
|
+
class Finder
|
3
|
+
IGNORED_SYSTEM_TABLES = ['ar_internal_metadata', 'schema_migrations']
|
4
|
+
|
5
|
+
def initialize(options)
|
6
|
+
@ignored_tables = (options[:ignored_tables] || []) + IGNORED_SYSTEM_TABLES
|
7
|
+
end
|
8
|
+
|
9
|
+
def process
|
10
|
+
return [] unless ActiveRecord::Base.connected?
|
11
|
+
filtered_tables.each_with_object({}) do |table, result|
|
12
|
+
amount = count_for(table)
|
13
|
+
result[table] = amount unless amount.zero?
|
14
|
+
result
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
def count_for(table)
|
20
|
+
ActiveRecord::Base.connection.select_value("SELECT COUNT(*) FROM #{table}").to_i
|
21
|
+
rescue
|
22
|
+
raise StandardError, "An error occurred while try to count '#{table}'"
|
23
|
+
end
|
24
|
+
|
25
|
+
def filtered_tables
|
26
|
+
tables - @ignored_tables
|
27
|
+
end
|
28
|
+
|
29
|
+
def tables
|
30
|
+
ActiveRecord::Base.connection.data_sources
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module DatabaseLeakFinder
|
2
|
+
module Handler
|
3
|
+
class << self
|
4
|
+
attr_reader :options
|
5
|
+
|
6
|
+
def log_example(example)
|
7
|
+
@example = example
|
8
|
+
end
|
9
|
+
|
10
|
+
def find_leaks
|
11
|
+
leaks = finder.process
|
12
|
+
logger.log(@example, leaks) unless leaks.empty?
|
13
|
+
end
|
14
|
+
|
15
|
+
def config(options)
|
16
|
+
@options = options
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
def finder
|
21
|
+
@finder ||= DatabaseLeakFinder::Finder.new(@options)
|
22
|
+
end
|
23
|
+
|
24
|
+
def logger
|
25
|
+
@logger ||= DatabaseLeakFinder::Logger.new
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'highline'
|
2
|
+
|
3
|
+
module DatabaseLeakFinder
|
4
|
+
class Logger
|
5
|
+
def log(example, leaks)
|
6
|
+
puts <<-LOG.strip_heredoc
|
7
|
+
\n
|
8
|
+
#{HighLine.color('#### Leaking Spec', :red)}
|
9
|
+
The spec '#{HighLine.color(spec_path_for(example), :red, :underline)}' leaves the following rows in the database:
|
10
|
+
LOG
|
11
|
+
leaks.each(&method(:log_leak))
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
def spec_path_for(example)
|
16
|
+
example.metadata[:example_group][:file_path]
|
17
|
+
end
|
18
|
+
|
19
|
+
def log_leak(table, count)
|
20
|
+
puts " - #{HighLine.color(count.to_s, :red)} #{'row'.pluralize(count)} for the #{HighLine.color(table, :white, :underline)} table"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
metadata
ADDED
@@ -0,0 +1,133 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: database_leak_finder
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.2
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Vital Ryabchinskiy
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-08-16 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.10'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.10'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '10.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '10.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: sqlite3
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '1.3'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '1.3'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: activerecord
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 3.0.0
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 3.0.0
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rspec
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '3.0'
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '3.0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: highline
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '1.0'
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '1.0'
|
97
|
+
description: "'Easy way to find spec which doesn't clear database after execution"
|
98
|
+
email: vital.ryabchinskiy@gmail.com
|
99
|
+
executables: []
|
100
|
+
extensions: []
|
101
|
+
extra_rdoc_files: []
|
102
|
+
files:
|
103
|
+
- README.md
|
104
|
+
- lib/database_leak_finder.rb
|
105
|
+
- lib/database_leak_finder/finder.rb
|
106
|
+
- lib/database_leak_finder/handler.rb
|
107
|
+
- lib/database_leak_finder/logger.rb
|
108
|
+
- lib/database_leak_finder/version.rb
|
109
|
+
homepage: https://github.com/vitalinfo/database_leak_finder
|
110
|
+
licenses:
|
111
|
+
- MIT
|
112
|
+
metadata: {}
|
113
|
+
post_install_message:
|
114
|
+
rdoc_options: []
|
115
|
+
require_paths:
|
116
|
+
- lib
|
117
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
118
|
+
requirements:
|
119
|
+
- - ">="
|
120
|
+
- !ruby/object:Gem::Version
|
121
|
+
version: '0'
|
122
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
123
|
+
requirements:
|
124
|
+
- - ">="
|
125
|
+
- !ruby/object:Gem::Version
|
126
|
+
version: '0'
|
127
|
+
requirements: []
|
128
|
+
rubyforge_project:
|
129
|
+
rubygems_version: 2.5.1
|
130
|
+
signing_key:
|
131
|
+
specification_version: 4
|
132
|
+
summary: Find database leaks
|
133
|
+
test_files: []
|