breathing 0.0.7 → 0.0.8

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: 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