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 +4 -4
- data/lib/trains/version.rb +1 -1
- data/lib/trains/visitor/migration.rb +88 -70
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2862732986e24d80f6fe47f3035e206cc033354767902260e7003c983b30ce3d
|
4
|
+
data.tar.gz: 0fd7fbb15a6e12d2bdc61f8753b0f9c7fbe85f9a2a43639089c166364255a27e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 151eeb6f6a3c4a1494d40e8e231c6dcaa2b5f66673e59fbf26623d5054a74e514f3d02385b752f2d1cb20145c3ce06794286de3f34b3b11b002d4991419b7d10
|
7
|
+
data.tar.gz: 555e8794465a0f4ea87e05ebad167d3248e4263cb4a9de02736b3003fb06eb40f8fd20a88cda681e78f1803294d025a815c9fed80c1f00a62a0799b3bfb5d39e
|
data/lib/trains/version.rb
CHANGED
@@ -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
|
-
@
|
12
|
-
@
|
13
|
-
@
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
node.body.
|
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
|
-
|
72
|
+
when :block
|
73
|
+
@result = [*@result, *parse_block_migration(node)]
|
74
|
+
else
|
75
|
+
LOGGER.debug(node)
|
76
|
+
end
|
77
|
+
end
|
89
78
|
|
90
|
-
|
79
|
+
def parse_one_liner_migration(node)
|
80
|
+
return unless COLUMN_MODIFIERS.include?(node.method_name)
|
91
81
|
|
92
|
-
node.
|
93
|
-
|
94
|
-
|
95
|
-
|
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
|
-
|
102
|
-
|
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
|
-
|
101
|
+
if ddl_node.block_type?
|
102
|
+
next unless ALLOWED_TABLE_MODIFIERS.include?(ddl_node.method_name)
|
105
103
|
|
106
|
-
|
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
|
-
|
113
|
-
|
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
|
-
|
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.
|
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-
|
11
|
+
date: 2023-06-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|