trains 0.0.18 → 0.1.0

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