trains 0.0.7 → 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 +93 -73
- 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
@@ -1,42 +1,41 @@
|
|
1
|
-
require
|
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?,
|
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
|
-
@
|
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)
|
23
|
-
unless node.parent_class.source.include?
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
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
|
82
71
|
end
|
83
|
-
|
72
|
+
when :block
|
73
|
+
@result = [*@result, *parse_block_migration(node)]
|
74
|
+
else
|
75
|
+
LOGGER.debug(node)
|
76
|
+
end
|
77
|
+
end
|
84
78
|
|
85
|
-
|
79
|
+
def parse_one_liner_migration(node)
|
80
|
+
return unless COLUMN_MODIFIERS.include?(node.method_name)
|
86
81
|
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
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
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
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
|
-
|
101
|
-
|
102
|
-
|
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
|
-
|
107
|
-
|
120
|
+
migrations
|
121
|
+
end
|
108
122
|
|
123
|
+
def parse_migration_field(node)
|
124
|
+
fields = []
|
109
125
|
if node.children[1] == :timestamps
|
110
|
-
|
111
|
-
|
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
|
-
|
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.
|
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
|