trains 0.0.18 → 0.1.0

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: 7a1893b50977fd1adda92c2268df81b65f47fa4218961835c11c5534274774db
4
- data.tar.gz: aa0c28905214fa2d776d144e3e58bfa952ad154b91a4f007e0f9d506e6fe723d
3
+ metadata.gz: 760e5b8af816d5480e1ba069af6b42c3af88ca0833322049a730345403ddc348
4
+ data.tar.gz: 77ee8712a8934224accf6d522623613e8e264d1de92bac6f58ace205f20cd12c
5
5
  SHA512:
6
- metadata.gz: 87bf0d7266a6347d452434b83f19f3798ed68f97b0be036baed26390442894ccf725a0e54bb233cbb25523b9864e9bbc3d246bae5341c489121e1ef80b7195b4
7
- data.tar.gz: 377afeb54297eca4feb98a5c482a348250319f7d61b84650fb33910c91faa86d1c9eade41c34b82cf217c9833ebc5e238af7cc04c86c53255e29480fa4e0d605
6
+ metadata.gz: 260b68afd11589fa470c4475cd759b521ccd0b82bd3ceb5668acbb7dffd63bcc348a45f72c889e1d2d1902740f5bd9aef6f4aa0cc5ba14032bb8f0242abbf6ca
7
+ data.tar.gz: f04a57a248c8c657e34866106273e06bb2eb1e5d2bbc282fe2762422704f11521f2d97ce12a73f4dfa8ada78725091c3e27bc75b5fb0695cf536eef322ce4252
@@ -1,5 +1,12 @@
1
1
  module Trains
2
2
  module DTO
3
- Model = Data.define(:name, :fields, :version)
3
+ Model = Data.define(
4
+ :name, :fields, :version, :renamed_columns, :removed_columns, :ignored_columns
5
+ ) do
6
+ def initialize(name:, fields:, version:, renamed_columns: [],
7
+ removed_columns: [], ignored_columns: [])
8
+ super(name:, fields:, version:, renamed_columns:, removed_columns:, ignored_columns:)
9
+ end
10
+ end
4
11
  end
5
12
  end
@@ -0,0 +1,5 @@
1
+ module Trains
2
+ module DTO
3
+ Rename = Data.define(:from, :to)
4
+ end
5
+ end
@@ -1,5 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Trains
2
4
  module Utils
5
+ # Combine multiple migrations into models
3
6
  module MigrationTailor
4
7
  def self.stitch(models = {}, migrations)
5
8
  migrations.each do |mig|
@@ -16,14 +19,66 @@ module Trains
16
19
  end
17
20
  when :add_column, :add_column_with_default, :add_reference
18
21
  models[mig.table_name].fields.push(*mig.fields)
22
+ when :ignore_column
23
+ models[mig.table_name].ignored_columns.push(*mig.fields.map(&:name))
19
24
  when :remove_column
20
25
  column =
21
26
  models[mig.table_name].fields.find do |field|
22
27
  field.name == mig.fields.first.name
23
28
  end
24
29
  models[mig.table_name].fields.delete(column)
30
+ models[mig.table_name].removed_columns.push(mig.fields.first.name)
31
+ when :rename_column
32
+ column =
33
+ models[mig.table_name].fields.find do |field|
34
+ field.name == mig.fields.first.name
35
+ end
36
+ models[mig.table_name].fields.push(
37
+ Trains::DTO::Field.new(
38
+ name: mig.fields.first.type.to_sym,
39
+ type: column.type
40
+ )
41
+ )
42
+ models[mig.table_name].fields.delete(column)
43
+ models[mig.table_name].renamed_columns.push(
44
+ Trains::DTO::Rename.new(
45
+ from: mig.fields.first.name.to_sym, to: mig.fields.first.type.to_sym
46
+ )
47
+ )
25
48
  when :change_table
26
- # TODO: handle renaming columns
49
+ mig.fields.each do |field|
50
+ case field.type
51
+ when :remove
52
+ column =
53
+ models[mig.table_name].fields.find do |mod_field|
54
+ mod_field.name == field.name
55
+ end
56
+ models[mig.table_name].fields.delete(column)
57
+ models[mig.table_name].removed_columns.push(field.name)
58
+ when :rename
59
+ # find the field and store temporarily
60
+ column =
61
+ models[mig.table_name].fields.find do |mod_field|
62
+ mod_field.name == field.name[0]
63
+ end
64
+ # Create new field from temp with new name
65
+ models[mig.table_name].fields.push(
66
+ Trains::DTO::Field.new(
67
+ name: field.name[1].to_sym,
68
+ type: column.type
69
+ )
70
+ )
71
+ # Delete the field
72
+ models[mig.table_name].fields.delete(column)
73
+ models[mig.table_name].renamed_columns.push(
74
+ Trains::DTO::Rename.new(
75
+ from: field.name[0], to: field.name[1]
76
+ )
77
+ )
78
+ else
79
+ models[mig.table_name].fields.push(field)
80
+ end
81
+ end
27
82
  when :change_column
28
83
  # get column
29
84
  column =
@@ -34,6 +89,8 @@ module Trains
34
89
  models[mig.table_name].fields.delete(column)
35
90
 
36
91
  models[mig.table_name].fields << mig.fields.first
92
+ else
93
+ next
37
94
  end
38
95
 
39
96
  rescue NoMethodError
@@ -1,3 +1,3 @@
1
1
  module Trains
2
- VERSION = '0.0.18'.freeze
2
+ VERSION = '0.1.0'.freeze
3
3
  end
@@ -22,6 +22,7 @@ module Trains
22
22
  add_column_with_default
23
23
  change_column
24
24
  add_reference
25
+ rename_column
25
26
  remove_column
26
27
  ].freeze
27
28
 
@@ -181,7 +182,11 @@ module Trains
181
182
  # t.references
182
183
  type = :bigint
183
184
  value = "#{node.children[2].value}_id".to_sym
184
- fields << DTO::Field.new(value.to_sym, type)
185
+ fields << DTO::Field.new(value, type)
186
+ when :rename
187
+ type = :rename
188
+ value = node.children[2..3].map { |field| field.value.to_sym }
189
+ fields << DTO::Field.new(value, type)
185
190
  when :index
186
191
  else
187
192
  # t.string, t.integer etc.
@@ -9,6 +9,7 @@ module Trains
9
9
  belongs_to
10
10
  has_one
11
11
  has_and_belongs_to_many
12
+ ignored_columns=
12
13
  ].freeze
13
14
  MODEL_PARENT_CLASSES = %w[
14
15
  ApplicationRecord
@@ -32,10 +33,29 @@ module Trains
32
33
  def parse_model(node)
33
34
  return unless POSSIBLE_ASSOCIATIONS.include?(node.method_name)
34
35
 
36
+ if node.method_name == :ignored_columns=
37
+ return if node.arguments.nil?
38
+ return unless node.arguments.first.is_a? RuboCop::AST::ArrayNode
39
+
40
+ arguments = node.arguments.first.to_a
41
+ arguments = arguments.select do |child|
42
+ child.is_a?(RuboCop::AST::SymbolNode) || child.is_a?(RuboCop::AST::StrNode)
43
+ end.map(&:value)
44
+
45
+ @result << DTO::Migration.new(
46
+ @model_class,
47
+ :ignore_column,
48
+ [*arguments.map { |arg| DTO::Field.new(arg.to_sym, nil) }],
49
+ nil
50
+ )
51
+
52
+ return
53
+ end
54
+
35
55
  @result << DTO::Migration.new(
36
56
  @model_class,
37
57
  :add_column,
38
- [DTO::Field.new(node.arguments.first.value, :bigint)],
58
+ [DTO::Field.new(node.arguments.first.value.to_sym, :bigint)],
39
59
  nil
40
60
  )
41
61
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: trains
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.18
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Syed Faraaz Ahmad
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-07-31 00:00:00.000000000 Z
11
+ date: 2023-08-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -91,6 +91,7 @@ files:
91
91
  - lib/trains/dto/method.rb
92
92
  - lib/trains/dto/migration.rb
93
93
  - lib/trains/dto/model.rb
94
+ - lib/trains/dto/rename.rb
94
95
  - lib/trains/dto/route.rb
95
96
  - lib/trains/scanner.rb
96
97
  - lib/trains/utils/args.rb