breathing 0.0.7 → 0.0.8

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1e0db4001a0d83c74be3f2adcf49f754ea0c39837ecb17c13e2fbf016dc73ad8
4
- data.tar.gz: 31cc6bd7ad4391573b64c909ea713dea43260a5b1e379405396e24f8bf29da18
3
+ metadata.gz: 61e525b923beadee13acfa8b5dc2708b88a3d4e4add63ea910d4ee3fd67d42e4
4
+ data.tar.gz: 4ab65c2f8a026145dc121641922204bcd373f3ef1f379ced10b6575f1229e0a9
5
5
  SHA512:
6
- metadata.gz: 802fb8542d7b310d40c8ca066c603416a5976f6729d4d4e6bcd4942b383a517ee75500c99503093b2d70226592d7fbc83aab14bd92930d84183255e7a1319b92
7
- data.tar.gz: 783595b5a3faa2d5934ba2cfe1b5baa95c37c6d1131ffadcbaf54cb3ba120642c5c93d9932081916710a5e48ef2e002ba2c7e1e7fff046d8a198e3bb43dbb30c
6
+ metadata.gz: c41a580a29c80ffeae3318a71153a6c6004a6a5f17bd02db91ecf3dbb8687dba7dd36318f5d3abbe4c86912a4103b4592aa9f6f4da446187deee072eaf84bccb
7
+ data.tar.gz: 5ffc9e9e41a1fa92ed44503b2df61dd6306fb2acff8ca390fc024eaa9468a1f65953d1de3c982e7d5a6e1b18f17a950f2c76075156a7af960ff8d84323d5c124
@@ -2,7 +2,7 @@ $:.push File.expand_path('lib', __dir__)
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = 'breathing'
5
- s.version = '0.0.7'
5
+ s.version = '0.0.8'
6
6
  s.platform = Gem::Platform::RUBY
7
7
  s.authors = ['Akira Kusumoto']
8
8
  s.email = ['akirakusumo10@gmail.com']
@@ -20,7 +20,7 @@ Gem::Specification.new do |s|
20
20
  s.executables = s.files.grep(%r{^exe/}) { |f| File.basename(f) }
21
21
  s.add_runtime_dependency 'thor'
22
22
 
23
- s.add_dependency 'activerecord', ['>= 5.0.0']
23
+ s.add_dependency 'activerecord', ['>= 6.0.0']
24
24
  s.add_dependency 'hairtrigger'
25
25
  s.add_dependency 'mysql2'
26
26
  s.add_dependency 'pg'
@@ -40,7 +40,6 @@ module Breathing
40
40
  header_color = 'ddedf3' # blue
41
41
  row.data_attributes.keys.each.with_index do |header_column, column_index|
42
42
  cell = sheet.add_cell(0, column_index, header_column)
43
- cell.change_font_bold(true)
44
43
  cell.change_fill(header_color)
45
44
 
46
45
  column_widths << header_column.size
@@ -8,9 +8,9 @@ module Breathing
8
8
 
9
9
  class Installer
10
10
  def install
11
- raise Breathing::UnsupportedError, "Version MySQL 5.6 is not supported." unless database_version_valid?
11
+ raise Breathing::UnsupportedError, "Version MySQL 5.6 is not supported." unless database_supported_version?
12
12
 
13
- create_log_table unless log_table_exists?
13
+ create_log_table
14
14
 
15
15
  models.each do |model|
16
16
  column_names = model.columns.map(&:name)
@@ -21,14 +21,13 @@ module Breathing
21
21
  end
22
22
 
23
23
  def uninstall
24
- drop_log_table if log_table_exists?
25
-
24
+ drop_log_table
26
25
  models.each { |model| Breathing::Trigger.new(model, log_table_name).drop }
27
26
  end
28
27
 
29
28
  private
30
29
 
31
- def database_version_valid?
30
+ def database_supported_version?
32
31
  connection = ActiveRecord::Base.connection
33
32
  connection.adapter_name == "PostgreSQL" || (connection.adapter_name == 'Mysql2' && connection.raw_connection.info[:version].to_f >= 5.7)
34
33
  end
@@ -39,26 +38,22 @@ module Breathing
39
38
 
40
39
  def create_log_table(table_name: log_table_name)
41
40
  ActiveRecord::Schema.define version: 0 do
42
- create_table table_name, force: false do |t|
43
- t.string :action, null: false
44
- t.string :table_name, null: false
45
- t.string :transaction_id, null: false
46
- t.json :before_data, null: false
47
- t.json :after_data, null: false
48
- t.datetime :created_at, null: false, index: true
41
+ create_table table_name, if_not_exists: true do |t|
42
+ t.datetime :created_at, null: false, index: true
43
+ t.string :action, null: false
44
+ t.string :table_name, null: false
45
+ t.string :transaction_id, null: false
46
+ t.json :before_data, null: false
47
+ t.json :after_data, null: false
48
+
49
49
  t.index %w[table_name transaction_id]
50
50
  end
51
51
  end
52
52
  end
53
53
 
54
54
  def drop_log_table
55
- sql = "DROP TABLE #{log_table_name}"
56
- puts sql
57
- ActiveRecord::Base.connection.execute(sql)
58
- end
59
-
60
- def log_table_exists?
61
- ActiveRecord::Base.connection.table_exists?(log_table_name)
55
+ puts "DROP TABLE #{log_table_name}"
56
+ ActiveRecord::Base.connection.drop_table(log_table_name, if_exists: true)
62
57
  end
63
58
 
64
59
  def models
@@ -11,59 +11,25 @@ module Breathing
11
11
  end
12
12
 
13
13
  def create
14
- trigger_name = "#{log_table_name}_insert_#{model.table_name}"
15
-
16
- unless exists?(trigger_name)
17
- puts "CREATE TRIGGER #{trigger_name}"
14
+ exists_trigger_names = ActiveRecord::Base.connection.triggers.keys
18
15
 
19
- ActiveRecord::Base.connection.create_trigger(trigger_name).on(model.table_name).after(:insert) do
20
- <<-SQL
21
- INSERT INTO #{log_table_name} (action, table_name, transaction_id, before_data, after_data, created_at)
22
- VALUES ('INSERT', '#{model.table_name}', NEW.id,
23
- '{}',
24
- #{row_to_json(model.columns, 'NEW')},
25
- CURRENT_TIMESTAMP);
26
- SQL
27
- end
28
- end
16
+ trigger_name = "#{log_table_name}_insert_#{model.table_name}"
17
+ create_insert_trigger(trigger_name, model) if exists_trigger_names.exclude?(trigger_name)
29
18
 
30
19
  trigger_name = "#{log_table_name}_update_#{model.table_name}"
31
- unless exists?(trigger_name)
32
- puts "CREATE TRIGGER #{trigger_name}"
33
-
34
- ActiveRecord::Base.connection.create_trigger(trigger_name).on(model.table_name).before(:update).of(:updated_at) do
35
- <<-SQL
36
- INSERT INTO #{log_table_name} (action, table_name, transaction_id, before_data, after_data, created_at)
37
- VALUES ('UPDATE', '#{model.table_name}', NEW.id,
38
- #{row_to_json(model.columns, 'OLD')},
39
- #{row_to_json(model.columns, 'NEW')},
40
- CURRENT_TIMESTAMP);
41
- SQL
42
- end
43
- end
20
+ create_update_trigger(trigger_name, model) if exists_trigger_names.exclude?(trigger_name)
44
21
 
45
22
  trigger_name = "#{log_table_name}_delete_#{model.table_name}"
46
- unless exists?(trigger_name)
47
- puts "CREATE TRIGGER #{trigger_name}"
48
- ActiveRecord::Base.connection.create_trigger(trigger_name).on(model.table_name).after(:delete) do
49
- <<-SQL
50
- INSERT INTO #{log_table_name} (action, table_name, transaction_id, before_data, after_data, created_at)
51
- VALUES ('DELETE', '#{model.table_name}', OLD.id,
52
- #{row_to_json(model.columns, 'OLD')},
53
- '{}',
54
- CURRENT_TIMESTAMP);
55
- SQL
56
- end
57
- end
23
+ create_delete_trigger(trigger_name, model) if exists_trigger_names.exclude?(trigger_name)
58
24
  end
59
25
 
60
26
  def drop
61
- %w[insert update delete].each do |action|
62
- trigger_name = "#{log_table_name}_#{action}_#{model.table_name}"
27
+ trigger_names = %w[insert update delete].map { |action| "#{log_table_name}_#{action}_#{model.table_name}" }
63
28
 
29
+ trigger_names.each do |trigger_name|
64
30
  begin
65
31
  sql = "DROP TRIGGER IF EXISTS #{trigger_name}"
66
- if ActiveRecord::Base.connection.adapter_name == "PostgreSQL"
32
+ if postgresql?
67
33
  sql << " ON #{model.table_name} CASCADE;"
68
34
  sql << " DROP FUNCTION IF EXISTS #{trigger_name} CASCADE;"
69
35
  end
@@ -77,12 +43,50 @@ module Breathing
77
43
 
78
44
  private
79
45
 
80
- def exists?(trigger_name)
81
- ActiveRecord::Base.connection.triggers.keys.include?(trigger_name)
46
+ def postgresql?
47
+ ActiveRecord::Base.connection.adapter_name == 'PostgreSQL'
48
+ end
49
+
50
+ def create_trigger(name)
51
+ puts "CREATE TRIGGER #{name}"
52
+ ActiveRecord::Base.connection.create_trigger(name) # hairtrigger gem
53
+ end
54
+
55
+ def create_insert_trigger(trigger_name, model)
56
+ create_trigger(trigger_name).on(model.table_name).after(:insert) do
57
+ <<-SQL
58
+ INSERT INTO #{log_table_name} (created_at, action, table_name, transaction_id, before_data, after_data)
59
+ VALUES (CURRENT_TIMESTAMP, 'INSERT', '#{model.table_name}', NEW.id,
60
+ '{}',
61
+ #{row_to_json(model.columns, 'NEW')});
62
+ SQL
63
+ end
64
+ end
65
+
66
+ def create_update_trigger(trigger_name, model)
67
+ create_trigger(trigger_name).on(model.table_name).before(:update).of(:updated_at) do
68
+ <<-SQL
69
+ INSERT INTO #{log_table_name} (created_at, action, table_name, transaction_id, before_data, after_data)
70
+ VALUES (CURRENT_TIMESTAMP, 'UPDATE', '#{model.table_name}', NEW.id,
71
+ #{row_to_json(model.columns, 'OLD')},
72
+ #{row_to_json(model.columns, 'NEW')});
73
+ SQL
74
+ end
75
+ end
76
+
77
+ def create_delete_trigger(trigger_name, model)
78
+ create_trigger(trigger_name).on(model.table_name).after(:delete) do
79
+ <<-SQL
80
+ INSERT INTO #{log_table_name} (created_at, action, table_name, transaction_id, before_data, after_data)
81
+ VALUES (CURRENT_TIMESTAMP, 'DELETE', '#{model.table_name}', OLD.id,
82
+ #{row_to_json(model.columns, 'OLD')},
83
+ '{}');
84
+ SQL
85
+ end
82
86
  end
83
87
 
84
88
  def row_to_json(columns, state)
85
- if ActiveRecord::Base.connection.adapter_name == "PostgreSQL"
89
+ if postgresql?
86
90
  "row_to_json(#{state}.*)"
87
91
  else
88
92
  json_object_values = columns.each.with_object([]) do |column, array|
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: breathing
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.7
4
+ version: 0.0.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Akira Kusumoto
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-12-21 00:00:00.000000000 Z
11
+ date: 2020-12-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: 5.0.0
33
+ version: 6.0.0
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: 5.0.0
40
+ version: 6.0.0
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: hairtrigger
43
43
  requirement: !ruby/object:Gem::Requirement