active_record_mysql_repl 0.1.4 → 0.1.5

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: 1d60c9d4baca1fb49f423f128a5015c348e17301c593895afa9083c2ee47b495
4
- data.tar.gz: 4060d8523d63a3db240d6cd96cefcc6f1e0a0e3e4c2e35691d736005f86f90e3
3
+ metadata.gz: 5c3f840dac882b20496edf1781709416bf8e81f4ed801683892b6a54431cbd4c
4
+ data.tar.gz: 5f947005433e288cc043e0375849d1ff51e335b863e81fbf890cb66fc3056658
5
5
  SHA512:
6
- metadata.gz: 9fa3e154a372791095e0b6e4766e7a23d3a1c3f4f74fda84a0d4aeac33d2ef202080911a447c4a9ebe6b7a47eb09a9138630715e46b7bb482dbac5b1d2528fe3
7
- data.tar.gz: e8599c8c29441696533ace9baa75163a24a271cd8b74a67e7038af2ec8e16c540ef869029438344fe75aa2f455b8012d61459efa26046ebcf86987314ef66c2d
6
+ metadata.gz: ae1b915b0668004ac07f597da9fae0a9b35b0103699e7e224fcb3b25ce2924700818850de6fb70fc5ecc3fe6d99ead005c1471bcb7f89744f942567b3092c66d
7
+ data.tar.gz: 37091f71892c3cf3c1fdf62aed7202ab44f72ad5cb87bf1f2e8f99bff52c0f007434e226d565229f03ed312f42e9ce23d6d7b27904e72b27d272ea2c3d29cba3
data/README.md CHANGED
@@ -383,7 +383,6 @@ https://github.com/nogahighland/active_record_mysql_repl/blob/main/sample_config
383
383
  <details><summary>output:</summary>
384
384
 
385
385
  ```rb
386
-
387
386
  D, [2024-12-12T18:23:41.382606 #2816] DEBUG -- : Order Load (8.6ms) SELECT `orders`.* FROM `orders` ORDER BY `orders`.`id` DESC LIMIT 1
388
387
  D, [2024-12-12T18:23:41.389954 #2816] DEBUG -- : User Load (2.4ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = '1' LIMIT 1
389
388
  D, [2024-12-12T18:23:41.392060 #2816] DEBUG -- : UserProfile Load (1.8ms) SELECT `user_profiles`.* FROM `user_profiles` WHERE `user_profiles`.`id` = '1' LIMIT 1
@@ -397,22 +396,148 @@ D, [2024-12-12T18:23:41.392060 #2816] DEBUG -- : UserProfile Load (1.8ms) SEL
397
396
 
398
397
  ---
399
398
 
399
+ Even though `users.login_id` column exists, because the column is not an external key it should be ignored from the association.
400
+ The column is ignored because the custom association is defined here and `User#login` causes a `NoMethodError`
400
401
 
402
+ https://github.com/nogahighland/active_record_mysql_repl/blob/f52f04770425723f632220bb8031bf4b402020a6/sample_config/.army.sample/associations.sample.yml#L10-L13
401
403
 
402
404
  ```rb
403
- [10] test(main)> Order.last.item.brand
405
+ [1] test(main)> User.last.login
404
406
  ```
405
407
 
406
408
  <details><summary>output:</summary>
407
409
 
408
410
  ```rb
409
- D, [2024-12-11T23:46:28.715219 #96076] DEBUG -- : Order Load (4.1ms) SELECT `orders`.* FROM `orders` ORDER BY `orders`.`id` DESC LIMIT 1
410
- D, [2024-12-11T23:46:28.717319 #96076] DEBUG -- : Item Load (1.7ms) SELECT `items`.* FROM `items` WHERE `items`.`id` = '1' LIMIT 1
411
- D, [2024-12-11T23:46:28.731254 #96076] DEBUG -- : Brand Load (3.1ms) SELECT `brands`.* FROM `brands` WHERE `brands`.`id` = '1' LIMIT 1
412
- #<Brand:0x000000012a411ab0> {
413
- :id => "1",
414
- :name => "brand1"
415
- }
411
+ D, [2024-12-12T22:17:49.291618 #37808] DEBUG -- : User Load (2.5ms) SELECT `users`.* FROM `users` ORDER BY `users`.`id` DESC LIMIT 1
412
+ NoMethodError: undefined method `login' for an instance of User
413
+ from /Users/hiroki.kishi/develop/private/active_record_mysql_repl/vendor/bundle/ruby/3.3.0/gems/activemodel-7.2.2/lib/active_model/attribute_methods.rb:512:in `method_missing'
414
+ ```
415
+
416
+ </details>
417
+
418
+ ---
419
+
420
+ You can use transaction by globally defined `transaction`.
421
+
422
+ ```rb
423
+ [7] test(main)> u2 = User.new(id:2, profile_id: up2, login_id: 'login2')
424
+ [9] test(main)> up2 = UserProfile.new(id:2, name: 'user2');
425
+ [10] test(main)> transaction { [u2, up2].map(&:save) }
426
+ ```
427
+
428
+ <details><summary>output:</summary>
429
+
430
+ ```sql
431
+ [9] test(main)> up2 = UserProfile.new(id:2, name: 'user2');
432
+ [10] test(main)> transaction { [u2, up2].map(&:save) }
433
+ D, [2024-12-12T22:25:32.266790 #37808] DEBUG -- : TRANSACTION (2.2ms) BEGIN
434
+ D, [2024-12-12T22:25:32.272857 #37808] DEBUG -- : User Create (8.3ms) INSERT INTO `users` (`id`, `login_id`) VALUES ('2', 'login2')
435
+ D, [2024-12-12T22:25:32.275213 #37808] DEBUG -- : UserProfile Create (2.1ms) INSERT INTO `user_profiles` (`id`, `name`) VALUES ('2', 'user2')
436
+ D, [2024-12-12T22:25:32.281765 #37808] DEBUG -- : TRANSACTION (6.4ms) COMMIT
437
+ [
438
+ [0] true,
439
+ [1] true
440
+ ]
441
+ ```
442
+
443
+ </details>
444
+
445
+ ---
446
+
447
+ The following example shows the following steps:
448
+
449
+ 1. Find the users with id 1 and 2
450
+ 2. Change the login_id of the users
451
+ 3. Show the changes
452
+ 4. Save the changes in a transaction
453
+
454
+ ```rb
455
+ [11] test(main)> u1, u2 = User.find([1, 2])
456
+ ```
457
+
458
+ <details><summary>Output:</summary>
459
+
460
+ ```rb
461
+ D, [2024-12-12T22:27:55.979311 #37808] DEBUG -- : User Load (11.7ms) SELECT `users`.* FROM `users` WHERE `users`.`id` IN ('1', '2')
462
+ [
463
+ [0] #<User:0x0000000144b325a0> {
464
+ :id => "1",
465
+ :login_id => "user1",
466
+ :profile_id => 1
467
+ },
468
+ [1] #<User:0x0000000144b32460> {
469
+ :id => "2",
470
+ :login_id => "login2",
471
+ :profile_id => nil
472
+ }
473
+ ]
474
+ ```
475
+
476
+ </details>
477
+
478
+ ```rb
479
+ [12] test(main)> [u1, u2].each { |u| u.login_id = "login_id#{u.id}" }
480
+ ```
481
+
482
+ <details><summary>Output:</summary>
483
+
484
+ ```rb
485
+ [
486
+ [0] #<User:0x0000000144b325a0> {
487
+ :id => "1",
488
+ :login_id => "login_id1",
489
+ :profile_id => 1
490
+ },
491
+ [1] #<User:0x0000000144b32460> {
492
+ :id => "2",
493
+ :login_id => "login_id2",
494
+ :profile_id => nil
495
+ }
496
+ ]
497
+ ```
498
+
499
+ </details>
500
+
501
+ ```rb
502
+ [13] test(main)> [u1, u2].map(&:changes)
503
+ ```
504
+
505
+ <details><summary>Output:</summary>
506
+
507
+ ```rb
508
+ [
509
+ [0] {
510
+ "login_id" => [
511
+ [0] "user1",
512
+ [1] "login_id1"
513
+ ]
514
+ },
515
+ [1] {
516
+ "login_id" => [
517
+ [0] "login2",
518
+ [1] "login_id2"
519
+ ]
520
+ }
521
+ ]
522
+ ```
523
+
524
+ </details>
525
+
526
+ ```rb
527
+ [14] test(main)> transaction { [u1, u2].map(&:save) }
528
+ ```
529
+
530
+ <details><summary>Output:</summary>
531
+
532
+ ```rb
533
+ D, [2024-12-12T22:29:14.179176 #37808] DEBUG -- : TRANSACTION (1.2ms) BEGIN
534
+ D, [2024-12-12T22:29:14.188392 #37808] DEBUG -- : User Update (9.1ms) UPDATE `users` SET `users`.`login_id` = 'login_id1' WHERE `users`.`id` = '1'
535
+ D, [2024-12-12T22:29:14.191429 #37808] DEBUG -- : User Update (2.6ms) UPDATE `users` SET `users`.`login_id` = 'login_id2' WHERE `users`.`id` = '2'
536
+ D, [2024-12-12T22:29:14.196802 #37808] DEBUG -- : TRANSACTION (5.2ms) COMMIT
537
+ [
538
+ [0] true,
539
+ [1] true
540
+ ]
416
541
  ```
417
542
 
418
543
  </details>
@@ -600,7 +725,7 @@ D, [2024-12-11T23:49:22.406631 #96381] DEBUG -- : (1.3ms) select 1 as num
600
725
  You can define your own extension script. For example `.upcase_name` is defined on `UserProfile` by the sample extension which is specified in the `.army.sample.yml` file.
601
726
 
602
727
  - https://github.com/nogahighland/active_record_mysql_repl/blob/9f7c91774b176e1204ed434dad2867721982c660/sample_config/.army.sample.yml#L5
603
- - https://github.com/nogahighland/active_record_mysql_repl/blob/main/sample_config/.army.sample/extensions/hello.rb
728
+ - https://github.com/nogahighland/active_record_mysql_repl/blob/acaa44684ea4fd135225580431417d6ccd41a988/sample_config/.army.sample/extensions/hello.rb#L1-L9
604
729
 
605
730
  ```rb
606
731
  [3] test(main)> UserProfile.last.upcase_name
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'rails_erd/diagram/graphviz'
3
+ require "rails_erd/diagram/graphviz"
4
4
 
5
5
  module ActiveRecordMysqlRepl
6
6
  module Erd
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require 'pry'
4
- require 'colorize'
5
- require 'active_support'
6
- require 'active_support/core_ext'
7
- require 'fileutils'
3
+ require "pry"
4
+ require "colorize"
5
+ require "active_support"
6
+ require "active_support/core_ext"
7
+ require "fileutils"
8
8
 
9
9
  module ActiveRecordMysqlRepl
10
10
  module CLI
@@ -15,34 +15,34 @@ module ActiveRecordMysqlRepl
15
15
  return
16
16
  end
17
17
 
18
- if args[0] == '--zsh-completion'
18
+ if args[0] == "--zsh-completion"
19
19
  puts ZshCompletion.generate
20
20
  return
21
21
  end
22
22
 
23
23
  opts = CLI::Options.parse(args)
24
- army_config = Config.load(opts[:c] || File.join(Dir.home, '.army.yml'))
24
+ army_config = Config.load(opts[:c] || File.join(Dir.home, ".army.yml"))
25
25
 
26
26
  db_configs = Database::Configs.load(army_config.database_config)
27
27
  db_config_key = opts[:d]
28
28
  db_config = db_configs[db_config_key]
29
29
  return puts db_configs.keys unless db_config
30
30
 
31
- generate_erf = opts[:e] == 'erd'
31
+ generate_erf = opts[:e] == "erd"
32
32
 
33
33
  SSHTunnel.tunnel(db_config) do |port|
34
34
  Database::Connection.connect(db_config, port) do
35
35
  Database::Loader.load_tables(db_config_key, army_config, port)
36
36
 
37
37
  if generate_erf
38
- require 'rails_erd/diagram/graphviz'
38
+ require "rails_erd/diagram/graphviz"
39
39
  puts "Generating ERD for #{db_config_key}_erd.pdf".gray
40
40
  RailsERD::Diagram::Graphviz.create
41
- FileUtils.mv('erd.pdf', "#{db_config_key}_erd.pdf")
42
- return
41
+ FileUtils.mv("erd.pdf", "#{db_config_key}_erd.pdf")
42
+ next
43
43
  end
44
44
 
45
- require 'active_record_mysql_repl/extensions'
45
+ require "active_record_mysql_repl/extensions"
46
46
  if army_config.extensions_dir.present?
47
47
  puts "Loading custom extensions from #{army_config.extensions_dir}".gray
48
48
  Extensions.load_external(army_config.extensions_dir)
@@ -57,8 +57,8 @@ module ActiveRecordMysqlRepl
57
57
  end
58
58
 
59
59
  def self.clear_screen
60
- system('clear')
61
- system('cls')
60
+ system("clear")
61
+ system("cls")
62
62
  end
63
63
  end
64
64
  end
@@ -1,29 +1,29 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  COMPLETION = <<~COMPLETION
4
- #!/usr/bin/env bash
5
-
6
- function _army() {
7
- _arguments \
8
- '-c[path to .armyrc file]:.armyrc:_files' \
9
- '-d[Database name]:database:->database' \
10
- '-e[output erd]:output erd:->erd'
11
-
12
- case "$state" in
13
- database)
14
- slice=("${words[@]:1}")
15
- _values 'Database name' $(_database ${slice})
16
- ;;
17
- erd)
18
- _values 'Generate ERD' erd ''
19
- esac
20
- }
21
-
22
- function _database {
23
- army ${@}
24
- }
25
-
26
- compdef _army army
4
+ #!/usr/bin/env bash
5
+
6
+ function _army() {
7
+ _arguments \
8
+ '-c[path to .armyrc file]:.armyrc:_files' \
9
+ '-d[Database name]:database:->database' \
10
+ '-e[output erd]:output erd:->erd'
11
+
12
+ case "$state" in
13
+ database)
14
+ slice=("${words[@]:1}")
15
+ _values 'Database name' $(_database ${slice})
16
+ ;;
17
+ erd)
18
+ _values 'Generate ERD' erd ''
19
+ esac
20
+ }
21
+
22
+ function _database {
23
+ army ${@}
24
+ }
25
+
26
+ compdef _army army
27
27
  COMPLETION
28
28
 
29
29
  module ActiveRecordMysqlRepl
@@ -1,9 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'cli/options'
4
- require_relative 'cli/main'
5
- require_relative 'cli/zsh_completion'
6
- require_relative 'cli/erd'
3
+ require_relative "cli/options"
4
+ require_relative "cli/main"
5
+ require_relative "cli/zsh_completion"
6
+ require_relative "cli/erd"
7
7
 
8
8
  module ActiveRecordMysqlRepl
9
9
  module CLI; end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'yaml'
3
+ require "yaml"
4
4
 
5
5
  module ActiveRecordMysqlRepl
6
6
  class Config
@@ -9,7 +9,7 @@ module ActiveRecordMysqlRepl
9
9
  end
10
10
 
11
11
  def database_config
12
- raise 'database_config is not defined' unless @database_config
12
+ raise "database_config is not defined" unless @database_config
13
13
  File.join(@army_config_dir, @database_config)
14
14
  end
15
15
 
@@ -29,10 +29,10 @@ module ActiveRecordMysqlRepl
29
29
 
30
30
  def initialize(path, config)
31
31
  @army_config_dir = File.dirname(File.absolute_path(path))
32
- @database_config = config['database_config']
33
- @associations = config['associations']
34
- @extensions_dir = config['extensions_dir']
35
- @pryrc = config['pryrc']
32
+ @database_config = config["database_config"]
33
+ @associations = config["associations"]
34
+ @extensions_dir = config["extensions_dir"]
35
+ @pryrc = config["pryrc"]
36
36
  end
37
37
  end
38
38
  end
@@ -36,18 +36,18 @@ module ActiveRecordMysqlRepl
36
36
  columns.each do |column|
37
37
  next if association_setting.present? && association_settings.ignore_columns(table_name).include?(column.name)
38
38
 
39
- associatable = column.name.gsub(/_id$/, '') if column.name.end_with?('_id')
40
- next if associatable.blank? || associatable == 'class' # reserved word
39
+ associatable = column.name.gsub(/_id$/, "") if column.name.end_with?("_id")
40
+ next if associatable.blank? || associatable == "class" # reserved word
41
41
 
42
- if analyzed_tables.keys.include?(associatable.pluralize)
42
+ if analyzed_tables.key?(associatable.pluralize)
43
43
  table.belongs_to << associatable.singularize if associatable
44
44
  analyzed_tables[associatable.pluralize].has_many << table_name.pluralize
45
45
  else
46
- associatable_table_name = associatable.split('_').last
47
- if analyzed_tables.keys.include?(associatable_table_name.pluralize)
48
- table.belongs_to << { name: associatable, class_name: associatable_table_name.classify, foreign_key: :id }
46
+ associatable_table_name = associatable.split("_").last
47
+ table.belongs_to << if analyzed_tables.key?(associatable_table_name.pluralize)
48
+ {name: associatable, class_name: associatable_table_name.classify, foreign_key: :id}
49
49
  else
50
- table.belongs_to << { name: associatable, class_name: table_name.singularize.classify, foreign_key: :id }
50
+ {name: associatable, class_name: table_name.singularize.classify, foreign_key: :id}
51
51
  end
52
52
  end
53
53
  end
@@ -71,12 +71,12 @@ module ActiveRecordMysqlRepl
71
71
  end
72
72
 
73
73
  def [](table)
74
- table = (@association.keys - ['ignore_columns']) & [table]
74
+ table = (@association.keys - ["ignore_columns"]) & [table]
75
75
  @association[table.first] if table.present?
76
76
  end
77
77
 
78
78
  def ignore_columns(table)
79
- @association.fetch('ignore_columns', {}).fetch(table, [])
79
+ @association.fetch("ignore_columns", {}).fetch(table, [])
80
80
  end
81
81
  end
82
82
  end
@@ -27,7 +27,7 @@ module ActiveRecordMysqlRepl
27
27
  private
28
28
 
29
29
  class Config
30
- attr_reader *%i[
30
+ attr_reader(*%i[
31
31
  bastion
32
32
  ssh_user
33
33
  remote_host
@@ -36,7 +36,7 @@ module ActiveRecordMysqlRepl
36
36
  user
37
37
  password
38
38
  prompt_color
39
- ]
39
+ ])
40
40
 
41
41
  def initialize(config)
42
42
  @bastion = config["bastion"]
@@ -7,28 +7,26 @@ module ActiveRecordMysqlRepl
7
7
 
8
8
  def self.connect(db_config, port)
9
9
  conn = {
10
- adapter: 'mysql2',
11
- host: '127.0.0.1',
10
+ adapter: "mysql2",
11
+ host: "127.0.0.1",
12
12
  port: port,
13
13
  username: db_config.user,
14
14
  password: db_config.password,
15
- database: db_config.database,
15
+ database: db_config.database
16
16
  }
17
17
 
18
- ActiveRecord::Base.logger = Logger.new(STDOUT)
19
- conn = ActiveRecord::Base.establish_connection(conn)
18
+ ActiveRecord::Base.logger = Logger.new($stdout)
19
+ ActiveRecord::Base.establish_connection(conn)
20
20
 
21
21
  puts "Ensureing connection to #{db_config.database} on port 127.0.0.1:#{port}".gray
22
22
 
23
23
  tables = nil
24
- (1..MAX_RETRY-1).to_a.each do |time|
25
- begin
26
- tables = ActiveRecord::Base.connection.tables
27
- rescue => e
28
- puts "#{e}, Retry #{time}/#{MAX_RETRY}".red
29
- sleep time*time
30
- next
31
- end
24
+ (1..MAX_RETRY - 1).to_a.each do |time|
25
+ tables = ActiveRecord::Base.connection.tables
26
+ rescue => e
27
+ puts "#{e}, Retry #{time}/#{MAX_RETRY}".red
28
+ sleep time * time
29
+ next
32
30
  end
33
31
 
34
32
  if tables.blank?
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'json'
4
- require 'active_record'
5
- require 'active_support/all'
3
+ require "json"
4
+ require "active_record"
5
+ require "active_support/all"
6
6
 
7
7
  module ActiveRecordMysqlRepl
8
8
  module Database
@@ -13,13 +13,12 @@ module ActiveRecordMysqlRepl
13
13
  tables = ActiveRecord::Base.connection.tables
14
14
  association_settings = army_config.associations.present? ? Associations.load(army_config.associations) : {}
15
15
  association_setting = association_settings[db_config_key]
16
- analyzed_tables = begin
17
- if association_setting.present?
18
- Associations.analyze(tables, association_setting)
19
- else
20
- Associations.analyze(tables)
21
- end
22
- end
16
+ analyzed_tables = if association_setting.present?
17
+ Associations.analyze(tables, association_setting)
18
+ else
19
+ Associations.analyze(tables)
20
+ end
21
+
23
22
  skipped = []
24
23
  analyzed_tables.each do |analyzed_table|
25
24
  # defer model definition for tables with `has_many: :xxx, through: xxx` associations
@@ -1,9 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'database/configs'
4
- require_relative 'database/association'
5
- require_relative 'database/connection'
6
- require_relative 'database/loader'
3
+ require_relative "database/configs"
4
+ require_relative "database/association"
5
+ require_relative "database/connection"
6
+ require_relative "database/loader"
7
7
 
8
8
  module ActiveRecordMysqlRepl
9
9
  module Database; end
@@ -5,29 +5,28 @@ module ActiverecordMysqlRepl
5
5
  module ActiveRecord
6
6
  module Base
7
7
  def as(name = nil)
8
- self.reflect_on_all_associations(name).map(&:name)
8
+ reflect_on_all_associations(name).map(&:name)
9
9
  end
10
10
 
11
11
  def describe
12
12
  [
13
- "# #{self.table_name}",
14
- exec_sql("DESCRIBE #{self.table_name}").tab(:h),
15
- exec_sql("SHOW INDEX FROM #{self.table_name}").tab(:h)
13
+ "# #{table_name}",
14
+ exec_sql("DESCRIBE #{table_name}").tab(:h),
15
+ exec_sql("SHOW INDEX FROM #{table_name}").tab(:h)
16
16
  ].join("\n")
17
17
  end
18
18
 
19
- alias desc describe
20
- alias d describe
19
+ alias_method :desc, :describe
20
+ alias_method :d, :describe
21
21
 
22
22
  def show_ddl
23
- exec_sql("SHOW CREATE TABLE #{self.table_name}")[0]['Create Table']
23
+ exec_sql("SHOW CREATE TABLE #{table_name}")[0]["Create Table"]
24
24
  end
25
25
 
26
- alias ddl show_ddl
26
+ alias_method :ddl, :show_ddl
27
27
  end
28
28
 
29
29
  ::ActiveRecord::Base.extend(Base)
30
30
  end
31
31
  end
32
32
  end
33
-
@@ -26,4 +26,3 @@ module ActiverecordMysqlRepl
26
26
  Kernel.include(Global)
27
27
  end
28
28
  end
29
-
@@ -4,17 +4,20 @@ module ActiverecordMysqlRepl
4
4
  module Extensions
5
5
  module Hash
6
6
  def method_missing(name, *args)
7
- if (self.keys & [name, name.to_s]).present?
7
+ if (keys & [name, name.to_s]).present?
8
8
  self[name] || self[name.to_s]
9
- elsif name.to_s.end_with?('=') && self.keys.include?(name.to_s[0..-2])
9
+ elsif name.to_s.end_with?("=") && keys.include?(name.to_s[0..-2])
10
10
  name = name[0..-2]
11
- self[name] = args.first if self.key?(name)
12
- self[name.to_sym] = args.first if self.key?(name.to_sym)
11
+ self[name] = args.first if key?(name)
12
+ self[name.to_sym] = args.first if key?(name.to_sym)
13
13
  end
14
14
  end
15
15
 
16
+ def respond_to_missing?
17
+ true
18
+ end
19
+
16
20
  ::Hash.include(Hash)
17
21
  end
18
22
  end
19
23
  end
20
-
@@ -1,28 +1,28 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'terminal-table'
4
- require 'csv'
5
- require 'clipboard'
6
- require 'json'
3
+ require "terminal-table"
4
+ require "csv"
5
+ require "clipboard"
6
+ require "json"
7
7
 
8
8
  module ActiverecordMysqlRepl
9
9
  module Extensions
10
10
  module Object
11
11
  def tabulate(orientation = nil)
12
- arr = if self.is_a?(Array)
13
- self
14
- elsif self.is_a?(::ActiveRecord::Relation)
15
- self.to_a
16
- else
17
- [self]
18
- end
12
+ arr = if is_a?(Array)
13
+ self
14
+ elsif is_a?(::ActiveRecord::Relation)
15
+ to_a
16
+ else
17
+ [self]
18
+ end
19
19
 
20
20
  arr = arr.map do |e|
21
21
  if e.is_a?(::ActiveRecord::Base)
22
- values = e.attributes.transform_values do |v|
22
+ values = e.attributes.transform_values do |v|
23
23
  next JSON.pretty_generate(v) if v.is_a?(Enumerable) && v.size > 0
24
- next 'NULL' if v.nil?
25
- next '""' if v == ''
24
+ next "NULL" if v.nil?
25
+ next '""' if v == ""
26
26
  v.to_s
27
27
  end
28
28
  next values
@@ -34,17 +34,17 @@ module ActiverecordMysqlRepl
34
34
  raise "#{arr} contains Hashes with different keys".red unless arr.map(&:keys).uniq.size == 1
35
35
 
36
36
  orientation = case orientation
37
- when :vertical, :v
38
- :vertical
39
- when :horizontal, :h
40
- :horizontal
41
- else
42
- if arr.first.keys.size > 5
43
- :vertical
44
- else
45
- :horizontal
46
- end
47
- end
37
+ when :vertical, :v
38
+ :vertical
39
+ when :horizontal, :h
40
+ :horizontal
41
+ else
42
+ if arr.first.keys.size > 5
43
+ :vertical
44
+ else
45
+ :horizontal
46
+ end
47
+ end
48
48
 
49
49
  t = Terminal::Table.new
50
50
 
@@ -54,7 +54,7 @@ module ActiverecordMysqlRepl
54
54
  t.rows = arr.map(&:values)
55
55
 
56
56
  when :vertical
57
- t.headings = ['Name', 'Value']
57
+ t.headings = ["Name", "Value"]
58
58
  arr.each.with_index do |row, i|
59
59
  row.each { |col, val| t.add_row [col, val] }
60
60
  t.add_separator if i < arr.size - 1
@@ -64,25 +64,25 @@ module ActiverecordMysqlRepl
64
64
  t.to_s
65
65
  end
66
66
 
67
- alias tab tabulate
68
- alias table tabulate
69
- alias to_table tabulate
67
+ alias_method :tab, :tabulate
68
+ alias_method :table, :tabulate
69
+ alias_method :to_table, :tabulate
70
70
 
71
71
  def csv(orientation = nil)
72
- arr = if self.is_a?(Array)
73
- self
74
- elsif self.is_a?(::ActiveRecord::Relation)
75
- self.to_a
76
- else
77
- [self]
78
- end
72
+ arr = if is_a?(Array)
73
+ self
74
+ elsif is_a?(::ActiveRecord::Relation)
75
+ to_a
76
+ else
77
+ [self]
78
+ end
79
79
 
80
80
  arr = arr.map do |e|
81
81
  if e.is_a?(::ActiveRecord::Base)
82
- values = e.attributes.transform_values do |v|
82
+ values = e.attributes.transform_values do |v|
83
83
  next JSON.pretty_generate(v) if v.is_a?(Enumerable) && v.size > 0
84
- next 'NULL' if v.nil?
85
- next '""' if v == ''
84
+ next "NULL" if v.nil?
85
+ next '""' if v == ""
86
86
  v.to_s
87
87
  end
88
88
  next values
@@ -94,17 +94,17 @@ module ActiverecordMysqlRepl
94
94
  raise "#{arr} contains Hashes with different keys".red unless arr.map(&:keys).uniq.size == 1
95
95
 
96
96
  orientation = case orientation
97
- when :vertical, :v
98
- :vertical
99
- when :horizontal, :h
100
- :horizontal
101
- else
102
- if arr.first.keys.size > 5
103
- :vertical
104
- else
105
- :horizontal
106
- end
107
- end
97
+ when :vertical, :v
98
+ :vertical
99
+ when :horizontal, :h
100
+ :horizontal
101
+ else
102
+ if arr.first.keys.size > 5
103
+ :vertical
104
+ else
105
+ :horizontal
106
+ end
107
+ end
108
108
 
109
109
  CSV.generate do |csv|
110
110
  case orientation
@@ -121,11 +121,11 @@ module ActiverecordMysqlRepl
121
121
  end
122
122
 
123
123
  def copy
124
- Clipboard.copy(self.to_s)
124
+ Clipboard.copy(to_s)
125
125
  end
126
- alias cp copy
126
+ alias_method :cp, :copy
127
127
 
128
- alias j to_json
128
+ alias_method :j, :to_json
129
129
 
130
130
  def jp
131
131
  JSON.pretty_generate(JSON.parse(to_json))
@@ -135,4 +135,3 @@ module ActiverecordMysqlRepl
135
135
 
136
136
  ::Object.include(Extensions::Object)
137
137
  end
138
-
@@ -13,11 +13,11 @@ module ActiverecordMysqlRepl
13
13
  end
14
14
 
15
15
  model.column_names.each do |column|
16
- define_method("#{model.table_name.singularize}_by_#{column}") do
16
+ define_method(:"#{model.table_name.singularize}_by_#{column}") do
17
17
  model.where(column => self)
18
18
  end
19
19
 
20
- define_method("#{model.table_name.singularize}_#{column}_like") do
20
+ define_method(:"#{model.table_name.singularize}_#{column}_like") do
21
21
  model.where("#{column} like ?", "%#{self}%")
22
22
  end
23
23
  end
@@ -29,4 +29,3 @@ module ActiverecordMysqlRepl
29
29
  Enumerable.include Tabler
30
30
  end
31
31
  end
32
-
@@ -1,10 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'extensions/object'
4
- require_relative 'extensions/global'
5
- require_relative 'extensions/active_record'
6
- require_relative 'extensions/hash'
7
- require_relative 'extensions/tabler'
3
+ require_relative "extensions/object"
4
+ require_relative "extensions/global"
5
+ require_relative "extensions/active_record"
6
+ require_relative "extensions/hash"
7
+ require_relative "extensions/tabler"
8
8
 
9
9
  module ActiveRecordMysqlRepl
10
10
  module Extensions
@@ -15,4 +15,3 @@ module ActiveRecordMysqlRepl
15
15
  end
16
16
  end
17
17
  end
18
-
@@ -1,14 +1,16 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'net/ssh'
4
- require 'net/ssh/gateway'
3
+ require "net/ssh"
4
+ require "net/ssh/gateway"
5
5
 
6
6
  module ActiveRecordMysqlRepl
7
7
  module SSHTunnel
8
8
  EPHEMERAL_PORT = 0
9
9
 
10
10
  def self.tunnel(db_config)
11
- return yield(db_config.port) if block_given? unless db_config.bastion
11
+ unless db_config.bastion
12
+ return yield(db_config.port) if block_given?
13
+ end
12
14
 
13
15
  puts "Establishing ssh tunnel to #{db_config.remote_host}:#{db_config.port} via #{db_config.ssh_user}#{db_config.bastion}".gray
14
16
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ActiveRecordMysqlRepl
4
- VERSION = "0.1.4"
4
+ VERSION = "0.1.5"
5
5
  end
@@ -1,11 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "active_record_mysql_repl/version"
4
- require_relative 'active_record_mysql_repl/config'
5
- require_relative 'active_record_mysql_repl/cli'
6
- require_relative 'active_record_mysql_repl/database'
7
- require_relative 'active_record_mysql_repl/ssh_tunnel'
8
- require_relative 'active_record_mysql_repl/version'
4
+ require_relative "active_record_mysql_repl/config"
5
+ require_relative "active_record_mysql_repl/cli"
6
+ require_relative "active_record_mysql_repl/database"
7
+ require_relative "active_record_mysql_repl/ssh_tunnel"
9
8
  # extensions should be loaded after database connection is established
10
9
  # require_relative 'active_record_mysql_repl/extensions'
11
10
 
@@ -8,6 +8,6 @@ test:
8
8
  class_name: UserProfile
9
9
 
10
10
  ignore_columns:
11
- user:
11
+ users:
12
12
  - login_id
13
13
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_record_mysql_repl
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Hiroki Kishi
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-12-12 00:00:00.000000000 Z
11
+ date: 2024-12-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: byebug
@@ -38,6 +38,20 @@ dependencies:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: 0.50.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: standard
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: activerecord
43
57
  requirement: !ruby/object:Gem::Requirement