database_stalker 0.1.2 → 0.1.3

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
  SHA1:
3
- metadata.gz: 17057c858434c678b5bce9f6a0645f0ecc2ac02e
4
- data.tar.gz: 1fbd37277e38e96aba343154281f48c96cfb1706
3
+ metadata.gz: 7971413c47361657c7bf2e049c210f4308af2e0c
4
+ data.tar.gz: 346327937f09e485bcb5ce0610a9e67fab735cb3
5
5
  SHA512:
6
- metadata.gz: 6fd2553c35173b03ff83aa35ec5247b069d801527a2771720dba769cca7ffa45641dc2db7c353cc4a1b1757f237db215fc9687b42e39e8f3ca19a068ec5bac91
7
- data.tar.gz: fa7bae7622552804509119c7a1781d4b8ce08faba22e1b14e05725f6e9f9398e7ac5ab57b3084fd19566a19e695b00f5cb956e3c6a533bb6dba09c1a9112a2e0
6
+ metadata.gz: b54cde30f9f7842f90a5134efb81a6719cc1df5a8d9807bb6298833bcfd63aeddc01f52f4b0dff311ee59a589b369a916bc80de295429e1d548398f01e25df06
7
+ data.tar.gz: 9c506778ac4f519d1519512aa2fb3480ae79b248661e7a4a2c845fc8d7cab0c065106c609ed391783c5b0c65612229520272334f50748ee495521591c697f1d9
@@ -0,0 +1,46 @@
1
+ require 'database_stalker/util'
2
+
3
+ module DatabaseStalker
4
+ class LogStalker
5
+
6
+ def initialize(stalked_file_path, stalking_result_path)
7
+ @stalked_file_path = stalked_file_path
8
+ @stalking_result_path = stalking_result_path
9
+ end
10
+
11
+ def run
12
+ @runned_tails = Util.runned_tail_pids
13
+ spawn("tail -f -n 0 #{@stalked_file_path} > #{@stalking_result_path}")
14
+ wait_for_tail_process_runninng
15
+ end
16
+
17
+ def stop
18
+ wait_for_tail_process_output
19
+ current_runned_tails = Util.runned_tail_pids
20
+ (current_runned_tails - @runned_tails).each do |pid|
21
+ Process.kill('KILL', pid)
22
+ end
23
+ end
24
+
25
+ def result
26
+ result = []
27
+ File.open(@stalking_result_path) do |file|
28
+ file.each_line do |line|
29
+ result << line
30
+ end
31
+ end
32
+ result
33
+ end
34
+
35
+
36
+ private
37
+
38
+ def wait_for_tail_process_runninng
39
+ sleep(0.01)
40
+ end
41
+
42
+ def wait_for_tail_process_output
43
+ sleep(0.01)
44
+ end
45
+ end
46
+ end
@@ -1,15 +1,13 @@
1
1
  class DatabaseStalker::Parser
2
- def initialize(log_file)
3
- @log_file = log_file
2
+ def initialize(log)
3
+ @log = log
4
4
  end
5
5
 
6
6
  def table_names
7
7
  tables = []
8
- File.open(@log_file, 'r') do |f|
9
- f.each_line do |line|
10
- matched = line.match(/INSERT\ INTO\ `(.+)` \(/)
11
- tables << matched[1] unless matched.nil?
12
- end
8
+ @log.each do |line|
9
+ matched = line.match(/INSERT\ INTO\ `(.+)` \(/)
10
+ tables << matched[1] unless matched.nil?
13
11
  end
14
12
  tables.uniq
15
13
  end
@@ -0,0 +1,18 @@
1
+ module DatabaseStalker::Util
2
+
3
+ module_function
4
+
5
+ def runned_tail_pids
6
+ pids = ''
7
+ IO.popen("ps x | grep 'tail -f -n 0' | grep -v grep | awk '{print $1}'") do |io|
8
+ while true
9
+ buffer = io.gets
10
+ break if buffer.nil?
11
+ pids += buffer
12
+ end
13
+ end
14
+ pids.split("\n").map do |pid|
15
+ pid.to_i
16
+ end
17
+ end
18
+ end
@@ -1,3 +1,3 @@
1
1
  module DatabaseStalker
2
- VERSION = "0.1.2"
2
+ VERSION = "0.1.3"
3
3
  end
@@ -1,25 +1,62 @@
1
- require "database_stalker/version"
2
- require "database_stalker/parser"
1
+ require 'database_stalker/version'
2
+ require 'database_stalker/parser'
3
+ require 'database_stalker/log_stalker'
3
4
 
4
5
  module DatabaseStalker
5
6
 
6
7
  DEFAULT_LOG_FILE = 'log/test.log'
7
8
  DEFAULT_TABLE_LOG_FILE = 'log/table_names.log'
9
+ DEFAULT_STALKING_LOG_FILE = 'log/stalking_log.log'
10
+ DEFAULT_STALKING_LOG_PER_TEST_FILE = 'log/stalking_log_per_test.log'
11
+ DEFAULT_STALKING_LOG_PER_TEST_TEMPORARY_FILE = 'log/stalking_log_per_test_temporary.log'
8
12
 
9
13
  class << self
10
14
 
11
- def start(log_file: DEFAULT_LOG_FILE, table_log_file: DEFAULT_TABLE_LOG_FILE)
12
- clean_up_file(log_file) if File.exist?(log_file)
13
- Process.fork do
15
+ def set_up(
16
+ test_log: DEFAULT_LOG_FILE,
17
+ table_log: DEFAULT_TABLE_LOG_FILE,
18
+ stalking_log: DEFAULT_STALKING_LOG_FILE,
19
+ stalking_log_per_test: DEFAULT_STALKING_LOG_PER_TEST_FILE,
20
+ stalking_log_per_test_temporary: DEFAULT_STALKING_LOG_PER_TEST_TEMPORARY_FILE)
21
+ @test_log = test_log
22
+ @table_log = table_log
23
+ @stalking_log = stalking_log
24
+ @stalking_log_per_test = stalking_log_per_test
25
+ @stalking_log_per_test_temporary = stalking_log_per_test_temporary
26
+ File.delete(@stalking_log_per_test_temporary) if File.exist?(@stalking_log_per_test_temporary)
27
+ FileUtils.touch(@stalking_log_per_test_temporary)
28
+ end
29
+
30
+ def stalk
31
+ fork do
32
+ log_stalker = LogStalker.new(@test_log, @stalking_log)
33
+ log_stalker.run
14
34
  watch_test_process
15
- save_stalked_tables(log_file, table_log_file)
35
+ log_stalker.stop
36
+ used_log = []
37
+ File.open(@stalking_log_per_test_temporary, 'r') do |f|
38
+ f.each_line do |line|
39
+ used_log << line
40
+ end
41
+ end
42
+ all_log = log_stalker.result
43
+ parser = Parser.new(all_log.slice(used_log.size .. all_log.size - 1))
44
+ File.open(@table_log, 'w') do |file|
45
+ parser.table_names.each do |table_name|
46
+ file.write("#{table_name}\n")
47
+ end
48
+ end
16
49
  end
50
+ wait_for_log_stalker
17
51
  end
18
52
 
19
- def read_table_names(table_log_file: DEFAULT_TABLE_LOG_FILE)
20
- return [] if not File.exist?(table_log_file)
53
+ def wait_for_log_stalker
54
+ sleep(0.1)
55
+ end
56
+
57
+ def table_names
21
58
  result = []
22
- File.open(table_log_file, 'r') do |f|
59
+ File.open(@table_log, 'r') do |f|
23
60
  f.each_line do |line|
24
61
  result << line.strip
25
62
  end
@@ -27,17 +64,23 @@ module DatabaseStalker
27
64
  result
28
65
  end
29
66
 
30
- def clean_up_file(file)
31
- File.open(file,'w'){ |f| f = nil }
67
+ def stalk_per_test
68
+ @log_stalker = LogStalker.new(@test_log, @stalking_log_per_test)
69
+ @log_stalker.run
70
+ end
71
+
72
+ def table_names_per_test
73
+ @log_stalker.stop
74
+ appended_log = @log_stalker.result
75
+ parser = Parser.new(appended_log)
76
+ parser.table_names
32
77
  end
33
78
 
34
- def save_stalked_tables(log_file, table_log_file)
35
- File.open(table_log_file, 'w') do |f|
36
- if File.exist?(log_file)
37
- parser = Parser.new(log_file)
38
- parser.table_names.each { |table| f.puts table }
39
- else
40
- f = nil
79
+ def notify_table_deletion
80
+ File.open(@stalking_log_per_test_temporary, 'a') do |file|
81
+ appended_log = @log_stalker.result
82
+ appended_log.each do |line|
83
+ file.puts("#{line}")
41
84
  end
42
85
  end
43
86
  end
@@ -49,5 +92,5 @@ module DatabaseStalker
49
92
  end
50
93
  end
51
94
 
52
- private_class_method :save_stalked_tables, :watch_test_process, :clean_up_file
95
+ private_class_method :watch_test_process, :wait_for_log_stalker
53
96
  end
@@ -2,10 +2,15 @@ require 'spec_helper'
2
2
  require 'database_stalker'
3
3
 
4
4
  describe 'use database_stakler' do
5
+
5
6
  it do
6
- DatabaseStalker.start('./log/test.log', './spec/tables.log')
7
+ DatabaseStalker.set_up
8
+ DatabaseStalker.stalk
9
+ DatabaseStalker.stalk_per_test
7
10
  Sample1.create!
8
11
  Sample2.create!
12
+ DatabaseStalker.table_names_per_test
13
+ DatabaseStalker.notify_table_deletion
9
14
  Sample3.create!
10
15
  end
11
16
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: database_stalker
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - tetsutaroendo
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-11-13 00:00:00.000000000 Z
11
+ date: 2017-11-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -73,7 +73,9 @@ files:
73
73
  - bin/setup
74
74
  - database_stalker.gemspec
75
75
  - lib/database_stalker.rb
76
+ - lib/database_stalker/log_stalker.rb
76
77
  - lib/database_stalker/parser.rb
78
+ - lib/database_stalker/util.rb
77
79
  - lib/database_stalker/version.rb
78
80
  - rails_test/.gitignore
79
81
  - rails_test/.rspec