trains 0.0.8 → 0.0.9
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 +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
|