trains 0.0.8 → 0.0.9

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: be756e07f687c79e259385beb680f5749c54a880273be056ba83a717aa821887
4
- data.tar.gz: da3fc5403f7844919f9bfd3ac49ef37479e7f4149328e851d1b1e654353398af
3
+ metadata.gz: 2862732986e24d80f6fe47f3035e206cc033354767902260e7003c983b30ce3d
4
+ data.tar.gz: 0fd7fbb15a6e12d2bdc61f8753b0f9c7fbe85f9a2a43639089c166364255a27e
5
5
  SHA512:
6
- metadata.gz: 3a389ed84aedba71b13061c4233389d3008bd895a532f506a9f492a6d6aaa54ae96708d27f0e4cba9269f1666ef8f614c5ebf467a8bbf70c63595b449e2bcc0f
7
- data.tar.gz: be28d384e28be094161bcdb28105a4bef9dd2d7f86978936f554bf699a205c1953a88bd1de071c1005f2ec4d5c54e91bf6ace9e20f7f917bc8204b46ced1a431
6
+ metadata.gz: 151eeb6f6a3c4a1494d40e8e231c6dcaa2b5f66673e59fbf26623d5054a74e514f3d02385b752f2d1cb20145c3ce06794286de3f34b3b11b002d4991419b7d10
7
+ data.tar.gz: 555e8794465a0f4ea87e05ebad167d3248e4263cb4a9de02736b3003fb06eb40f8fd20a88cda681e78f1803294d025a815c9fed80c1f00a62a0799b3bfb5d39e
@@ -1,3 +1,3 @@
1
1
  module Trains
2
- VERSION = '0.0.8'
2
+ VERSION = '0.0.9'.freeze
3
3
  end
@@ -5,18 +5,26 @@ module Trains
5
5
  # Visitor that parses DB migration and associates them with Rails models
6
6
  class Migration < Base
7
7
  def_node_matcher :send_node?, '(send nil? ...)'
8
- attr_reader :is_migration, :model
9
-
8
+ attr_reader :is_migration, :model, :result
9
+
10
+ ALLOWED_METHOD_NAMES = %i[change up down].freeze
11
+ ALLOWED_TABLE_MODIFIERS = %i[
12
+ create_table
13
+ change_table
14
+ update_column
15
+ add_index
16
+ ].freeze
17
+ COLUMN_MODIFIERS = %i[
18
+ add_column
19
+ change_column
20
+ remove_column
21
+ ].freeze
22
+
23
+ # skipcq: RB-LI1087
10
24
  def initialize
11
- @model = nil
12
- @table_modifier = nil
13
- @table_name = nil
14
- @is_class = false
15
- @is_migration = false
16
- @class_name = nil
17
- @fields = []
18
-
19
- @scope = { class: nil, method: nil, send: nil }
25
+ @result = []
26
+ @migration_class = nil
27
+ @migration_version = nil
20
28
  end
21
29
 
22
30
  def on_class(node)
@@ -27,16 +35,7 @@ module Trains
27
35
  @migration_class = node.children.first.source
28
36
  @migration_version = extract_version(node.parent_class.source)
29
37
 
30
- process_node(node.body)
31
- end
32
-
33
- def result
34
- DTO::Migration.new(
35
- table_name: @table_name,
36
- modifier: @table_modifier,
37
- fields: @fields,
38
- version: @migration_version
39
- )
38
+ process_def_node(node.body)
40
39
  end
41
40
 
42
41
  private
@@ -48,75 +47,94 @@ module Trains
48
47
  match.to_s.to_f
49
48
  end
50
49
 
51
- def process_node(node)
52
- return unless node.def_type?
53
-
54
- process_def_node(node)
55
- end
56
-
57
50
  def process_def_node(node)
58
- allowed_method_names = %i[change up down]
59
- allowed_table_modifiers = %i[
60
- create_table
61
- change_table
62
- update_column
63
- add_column
64
- remove_column
65
- change_column
66
- add_index
67
- ]
68
- column_modifiers = %i[
69
- add_column
70
- change_column
71
- remove_column
72
- ]
51
+ return unless node.def_type?
73
52
 
74
53
  method_name = node.method_name
75
- return unless allowed_method_names.include? method_name
54
+ unless ALLOWED_METHOD_NAMES.include?(method_name) || COLUMN_MODIFIERS.include?(method_name)
55
+ return
56
+ end
76
57
  return if node.body.nil?
77
58
 
78
- table_modifier =
79
- # if table modifier is a one-liner method call
80
- if node.body.children[0].nil?
81
- node.body.children[1]
82
- elsif node.body.children[0].block_type?
83
- # if table modifier is in a block
84
- node.body.children[0].method_name
85
- elsif node.body.children[0].send_type?
86
- node.body.children[0].method_name
59
+ case node.body.type
60
+ when :send
61
+ @result << parse_one_liner_migration(node.body)
62
+ when :begin
63
+ if node.body.children.map(&:type).include?(:block)
64
+ migration = parse_block_migration(node)
65
+ @result = [*@result, *migration] if migration
66
+ else
67
+ node.body.each_descendant(:send) do |send_node|
68
+ migration = parse_one_liner_migration(send_node)
69
+ @result << migration if migration
70
+ end
87
71
  end
88
- return unless allowed_table_modifiers.include? table_modifier
72
+ when :block
73
+ @result = [*@result, *parse_block_migration(node)]
74
+ else
75
+ LOGGER.debug(node)
76
+ end
77
+ end
89
78
 
90
- @table_modifier = table_modifier
79
+ def parse_one_liner_migration(node)
80
+ return unless COLUMN_MODIFIERS.include?(node.method_name)
91
81
 
92
- node.each_descendant(:send) do |send_node|
93
- if allowed_table_modifiers.include?(send_node.method_name)
94
- raw_table_name = send_node.arguments[0]
95
- @table_name = raw_table_name.value.to_s.singularize.camelize
96
- if column_modifiers.include?(send_node.method_name)
97
- @fields.append(DTO::Field.new(send_node.arguments[1].value,
98
- send_node.arguments[2]&.value))
99
- end
82
+ arguments = node.arguments
83
+ table_name = arguments[0].value.to_s.singularize.camelize
84
+ column_name = arguments[1].value
85
+ type = arguments[2].value unless node.method_name == :remove_column
100
86
 
101
- next
102
- end
87
+ DTO::Migration.new(
88
+ table_name,
89
+ node.method_name,
90
+ [DTO::Field.new(column_name, type)],
91
+ @migration_version
92
+ )
93
+ end
94
+
95
+ def parse_block_migration(node)
96
+ migrations = []
97
+ # Visit every send_node that performs DDL tasks
98
+ node.each_descendant do |ddl_node|
99
+ fields = []
103
100
 
104
- next if allowed_table_modifiers.include?(send_node.method_name)
101
+ if ddl_node.block_type?
102
+ next unless ALLOWED_TABLE_MODIFIERS.include?(ddl_node.method_name)
105
103
 
106
- parse_migration_field(send_node)
104
+ table_name = ddl_node.send_node.arguments[0].value.to_s.singularize.camelize
105
+ ddl_node.body.each_descendant(:send) do |send_node|
106
+ fields = [*fields, *parse_migration_field(send_node)]
107
+ end
108
+
109
+ migrations << DTO::Migration.new(
110
+ table_name,
111
+ ddl_node.method_name,
112
+ fields,
113
+ @migration_version
114
+ )
115
+ elsif ddl_node.send_type?
116
+ migrations = [*migrations, *parse_one_liner_migration(ddl_node)]
117
+ end
107
118
  end
119
+
120
+ migrations
108
121
  end
109
122
 
110
123
  def parse_migration_field(node)
124
+ fields = []
111
125
  if node.children[1] == :timestamps
112
- @fields.append(DTO::Field.new(:created_at, :datetime))
113
- @fields.append(DTO::Field.new(:updated_at, :datetime))
114
- return
126
+ fields << DTO::Field.new(:created_at, :datetime)
127
+ fields << DTO::Field.new(:updated_at, :datetime)
128
+ return fields
115
129
  end
116
130
 
131
+ return [] if node.arguments.nil? || node.arguments.empty?
132
+
117
133
  type = node.children[1]
118
134
  value = node.children[2].value unless node.children[2].hash_type?
119
- @fields.append(DTO::Field.new(value, type))
135
+ fields << DTO::Field.new(value, type)
136
+
137
+ fields
120
138
  end
121
139
  end
122
140
  end
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.8
4
+ version: 0.0.9
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-05-23 00:00:00.000000000 Z
11
+ date: 2023-06-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport