trains 0.0.7 → 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: 553d908187ec4b9cc7e3f06616e096e8a341061ec3a345bce5018c6e1578e4ae
4
- data.tar.gz: 2201e5acb6d148926f4602a885d3588cb902496b788d8565330c9ed3588e3243
3
+ metadata.gz: 2862732986e24d80f6fe47f3035e206cc033354767902260e7003c983b30ce3d
4
+ data.tar.gz: 0fd7fbb15a6e12d2bdc61f8753b0f9c7fbe85f9a2a43639089c166364255a27e
5
5
  SHA512:
6
- metadata.gz: e4b2ee11d9e1af06232169f886a3695f14e1d2c9418d4449706af4a872932f0efa408a43b3a4f3cd2237a133f3720adc1e94ad6e313facdefe917a401b154134
7
- data.tar.gz: dc2e1d251fc0cdc28d2cc340484eeae228039deab55fbca8b1c61988417d01ce5aa921a7a84367fd661f841e839718ea74048fb7738e740328bb0b969e3907a0
6
+ metadata.gz: 151eeb6f6a3c4a1494d40e8e231c6dcaa2b5f66673e59fbf26623d5054a74e514f3d02385b752f2d1cb20145c3ce06794286de3f34b3b11b002d4991419b7d10
7
+ data.tar.gz: 555e8794465a0f4ea87e05ebad167d3248e4263cb4a9de02736b3003fb06eb40f8fd20a88cda681e78f1803294d025a815c9fed80c1f00a62a0799b3bfb5d39e
@@ -1,3 +1,3 @@
1
1
  module Trains
2
- VERSION = '0.0.7'
2
+ VERSION = '0.0.9'.freeze
3
3
  end
@@ -1,42 +1,41 @@
1
- require "yaml"
1
+ require 'yaml'
2
2
 
3
3
  module Trains
4
4
  module Visitor
5
5
  # Visitor that parses DB migration and associates them with Rails models
6
6
  class Migration < Base
7
- def_node_matcher :send_node?, "(send nil? ...)"
8
- attr_reader :is_migration, :model
9
-
7
+ def_node_matcher :send_node?, '(send nil? ...)'
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)
23
- unless node.parent_class.source.include? "ActiveRecord::Migration"
31
+ unless node.parent_class.source.include? 'ActiveRecord::Migration'
24
32
  return
25
33
  end
26
34
 
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,73 +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
- ]
67
- block_type_modifier = false
51
+ return unless node.def_type?
68
52
 
69
53
  method_name = node.method_name
70
- 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
71
57
  return if node.body.nil?
72
58
 
73
- table_modifier =
74
- if node.body.children[0] == nil
75
- block_type_modifier = false
76
- # if table modifier is a one-liner method call
77
- node.body.children[1]
78
- elsif node.body.children[0].block_type?
79
- block_type_modifier = true
80
- # if table modifier is in a block
81
- 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
82
71
  end
83
- 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
84
78
 
85
- @table_modifier = table_modifier
79
+ def parse_one_liner_migration(node)
80
+ return unless COLUMN_MODIFIERS.include?(node.method_name)
86
81
 
87
- # Get the name of the table being modified
88
- if block_type_modifier
89
- raw_table_name =
90
- node.body.children[0].children[0].children[2].value.to_s
91
- @table_name = raw_table_name.singularize.camelize
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
92
86
 
93
- node.body.children[0].children[2].each_child_node do |child|
94
- process_migration_field(child)
95
- end
96
- else
97
- raw_table_name = node.body.children[2].value.to_s
98
- @table_name = raw_table_name.singularize.camelize
87
+ DTO::Migration.new(
88
+ table_name,
89
+ node.method_name,
90
+ [DTO::Field.new(column_name, type)],
91
+ @migration_version
92
+ )
93
+ end
99
94
 
100
- field_name = node.body.children[3]&.value
101
- field_type = node.body.children[4]&.value
102
- @fields.append(DTO::Field.new(field_name, field_type))
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 = []
100
+
101
+ if ddl_node.block_type?
102
+ next unless ALLOWED_TABLE_MODIFIERS.include?(ddl_node.method_name)
103
+
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
103
118
  end
104
- end
105
119
 
106
- def process_migration_field(node)
107
- return unless node.send_type?
120
+ migrations
121
+ end
108
122
 
123
+ def parse_migration_field(node)
124
+ fields = []
109
125
  if node.children[1] == :timestamps
110
- @fields.append(DTO::Field.new(:created_at, :datetime))
111
- @fields.append(DTO::Field.new(:updated_at, :datetime))
112
- return
126
+ fields << DTO::Field.new(:created_at, :datetime)
127
+ fields << DTO::Field.new(:updated_at, :datetime)
128
+ return fields
113
129
  end
114
130
 
131
+ return [] if node.arguments.nil? || node.arguments.empty?
132
+
115
133
  type = node.children[1]
116
134
  value = node.children[2].value unless node.children[2].hash_type?
117
- @fields.append(DTO::Field.new(value, type))
135
+ fields << DTO::Field.new(value, type)
136
+
137
+ fields
118
138
  end
119
139
  end
120
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.7
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-22 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