trains 0.0.9 → 0.0.10
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/scanner.rb +1 -1
- data/lib/trains/utils/args.rb +11 -1
- data/lib/trains/utils/logger.rb +12 -4
- data/lib/trains/utils/migration_tailor.rb +5 -2
- data/lib/trains/version.rb +1 -1
- data/lib/trains/visitor/migration.rb +77 -22
- data/lib/trains/visitor/route.rb +1 -2
- 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: 706372a84f876f65aec9c638d6ad2c17dd6255f6dbc942bccbe1f0f81b86e069
|
4
|
+
data.tar.gz: 431b9033167ed91a657dd00ca806c16c1c3df454f74ec276eb7e79baf8407adf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a9b1de71a3735c43afee1f793ad0af94e9d8d7d0fced82023c3927d52e2821cf730b997ae7eeab53816208c11320ed4168c381d3d5fa18d0c1c8c8cb3f008006
|
7
|
+
data.tar.gz: c3eac1a413ece2f2ff937f642843aefb7188b63cd25c03d6f394a223b63a1ebb8c25c0a05e7d63c6c903d94687b2f59beb2eebed7b196c7f2e2405573a363075
|
data/lib/trains/scanner.rb
CHANGED
data/lib/trains/utils/args.rb
CHANGED
@@ -5,6 +5,8 @@ module Trains
|
|
5
5
|
# utility module to deal with parsing of arguments
|
6
6
|
module Args
|
7
7
|
def parse_args(node)
|
8
|
+
return if node.nil?
|
9
|
+
|
8
10
|
case node.type
|
9
11
|
when :hash
|
10
12
|
parse_hash(node)
|
@@ -19,6 +21,8 @@ module Trains
|
|
19
21
|
|
20
22
|
node.each_pair { |key, value| options[key.value] = parse_value(value) }
|
21
23
|
rescue StandardError => e
|
24
|
+
puts 'Error boi'
|
25
|
+
puts e
|
22
26
|
puts node.parent
|
23
27
|
ensure
|
24
28
|
return options
|
@@ -34,7 +38,13 @@ module Trains
|
|
34
38
|
if node.method_name == :redirect
|
35
39
|
{ redirect: node.arguments.first.value }
|
36
40
|
end
|
37
|
-
|
41
|
+
# skipcq: RB-LI1006
|
42
|
+
when :true
|
43
|
+
true
|
44
|
+
# skipcq: RB-LI1006
|
45
|
+
when :false
|
46
|
+
false
|
47
|
+
when :sym, :str, :integer
|
38
48
|
node.value
|
39
49
|
end
|
40
50
|
end
|
data/lib/trains/utils/logger.rb
CHANGED
@@ -1,6 +1,14 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Trains
|
4
|
+
module Utils
|
5
|
+
# Module with logging basics
|
6
|
+
module Logger
|
7
|
+
def self.debug(log)
|
8
|
+
puts '[DEBUG]:'
|
9
|
+
# skipcq: RB-RB-LI1008
|
10
|
+
pp log
|
11
|
+
end
|
12
|
+
end
|
5
13
|
end
|
6
14
|
end
|
@@ -6,14 +6,14 @@ module Trains
|
|
6
6
|
|
7
7
|
migrations.each do |mig|
|
8
8
|
case mig.modifier
|
9
|
-
when :create_table
|
9
|
+
when :create_table, :create_join_table
|
10
10
|
models[mig.table_name] = {}
|
11
11
|
models[mig.table_name] = Trains::DTO::Model.new(
|
12
12
|
name: mig.table_name,
|
13
13
|
fields: mig.fields,
|
14
14
|
version: mig.version
|
15
15
|
)
|
16
|
-
when :add_column
|
16
|
+
when :add_column, :add_reference
|
17
17
|
models[mig.table_name].fields.push(*mig.fields)
|
18
18
|
when :remove_column
|
19
19
|
column =
|
@@ -34,6 +34,9 @@ module Trains
|
|
34
34
|
|
35
35
|
models[mig.table_name].fields << mig.fields.first
|
36
36
|
end
|
37
|
+
|
38
|
+
rescue NoMethodError
|
39
|
+
next
|
37
40
|
end
|
38
41
|
|
39
42
|
models
|
data/lib/trains/version.rb
CHANGED
@@ -4,19 +4,23 @@ 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
|
+
include Utils::Args
|
8
|
+
|
7
9
|
def_node_matcher :send_node?, '(send nil? ...)'
|
8
10
|
attr_reader :is_migration, :model, :result
|
9
11
|
|
10
|
-
ALLOWED_METHOD_NAMES = %i[change up
|
12
|
+
ALLOWED_METHOD_NAMES = %i[change up].freeze
|
11
13
|
ALLOWED_TABLE_MODIFIERS = %i[
|
12
14
|
create_table
|
15
|
+
create_join_table
|
13
16
|
change_table
|
17
|
+
safety_assured
|
14
18
|
update_column
|
15
|
-
add_index
|
16
19
|
].freeze
|
17
20
|
COLUMN_MODIFIERS = %i[
|
18
21
|
add_column
|
19
22
|
change_column
|
23
|
+
add_reference
|
20
24
|
remove_column
|
21
25
|
].freeze
|
22
26
|
|
@@ -35,7 +39,12 @@ module Trains
|
|
35
39
|
@migration_class = node.children.first.source
|
36
40
|
@migration_version = extract_version(node.parent_class.source)
|
37
41
|
|
38
|
-
|
42
|
+
node.each_descendant(:def) do |child_node|
|
43
|
+
next if child_node.body.nil?
|
44
|
+
next unless ALLOWED_METHOD_NAMES.include?(child_node.method_name)
|
45
|
+
|
46
|
+
process_migration(child_node)
|
47
|
+
end
|
39
48
|
end
|
40
49
|
|
41
50
|
private
|
@@ -47,21 +56,13 @@ module Trains
|
|
47
56
|
match.to_s.to_f
|
48
57
|
end
|
49
58
|
|
50
|
-
def
|
51
|
-
return unless node.def_type?
|
52
|
-
|
53
|
-
method_name = node.method_name
|
54
|
-
unless ALLOWED_METHOD_NAMES.include?(method_name) || COLUMN_MODIFIERS.include?(method_name)
|
55
|
-
return
|
56
|
-
end
|
57
|
-
return if node.body.nil?
|
58
|
-
|
59
|
+
def process_migration(node)
|
59
60
|
case node.body.type
|
60
61
|
when :send
|
61
62
|
@result << parse_one_liner_migration(node.body)
|
62
63
|
when :begin
|
63
64
|
if node.body.children.map(&:type).include?(:block)
|
64
|
-
migration = parse_block_migration(node)
|
65
|
+
migration = parse_block_migration(node.body)
|
65
66
|
@result = [*@result, *migration] if migration
|
66
67
|
else
|
67
68
|
node.body.each_descendant(:send) do |send_node|
|
@@ -71,8 +72,12 @@ module Trains
|
|
71
72
|
end
|
72
73
|
when :block
|
73
74
|
@result = [*@result, *parse_block_migration(node)]
|
75
|
+
when :if, :until
|
76
|
+
puts "Using unsupported logic within Rails migration: #{node.body.type}"
|
74
77
|
else
|
75
|
-
|
78
|
+
puts "[process_migration]: Unable to parse the following node:"
|
79
|
+
# skipcq: RB-RB-LI1008
|
80
|
+
pp node
|
76
81
|
end
|
77
82
|
end
|
78
83
|
|
@@ -82,7 +87,13 @@ module Trains
|
|
82
87
|
arguments = node.arguments
|
83
88
|
table_name = arguments[0].value.to_s.singularize.camelize
|
84
89
|
column_name = arguments[1].value
|
85
|
-
|
90
|
+
|
91
|
+
if node.method_name == :add_reference
|
92
|
+
type = :bigint
|
93
|
+
column_name = "#{arguments[1].value}_id".to_sym
|
94
|
+
else
|
95
|
+
type = arguments[2].value unless node.method_name == :remove_column
|
96
|
+
end
|
86
97
|
|
87
98
|
DTO::Migration.new(
|
88
99
|
table_name,
|
@@ -95,13 +106,38 @@ module Trains
|
|
95
106
|
def parse_block_migration(node)
|
96
107
|
migrations = []
|
97
108
|
# Visit every send_node that performs DDL tasks
|
98
|
-
node.
|
99
|
-
|
109
|
+
node.children.each do |ddl_node|
|
110
|
+
next if ddl_node.is_a?(Symbol)
|
100
111
|
|
101
|
-
|
112
|
+
fields = []
|
113
|
+
if ddl_node.is_a?(RuboCop::AST::BlockNode)
|
102
114
|
next unless ALLOWED_TABLE_MODIFIERS.include?(ddl_node.method_name)
|
103
115
|
|
116
|
+
if ddl_node.method_name == :safety_assured
|
117
|
+
ddl_node.each_descendant(:send) do |send_node|
|
118
|
+
migrations = [*migrations,
|
119
|
+
*parse_one_liner_migration(send_node)]
|
120
|
+
end
|
121
|
+
|
122
|
+
next
|
123
|
+
end
|
124
|
+
|
104
125
|
table_name = ddl_node.send_node.arguments[0].value.to_s.singularize.camelize
|
126
|
+
case ddl_node.method_name
|
127
|
+
when :create_join_table
|
128
|
+
field_one = ddl_node.send_node.arguments[0].value.to_s
|
129
|
+
field_two = ddl_node.send_node.arguments[1].value.to_s
|
130
|
+
|
131
|
+
table_name = field_one.camelize + field_two.camelize
|
132
|
+
|
133
|
+
fields << DTO::Field.new("#{field_one.singularize}_id".to_sym,
|
134
|
+
:bigint)
|
135
|
+
fields << DTO::Field.new("#{field_two.singularize}_id".to_sym,
|
136
|
+
:bigint)
|
137
|
+
when :create_table
|
138
|
+
fields << DTO::Field.new(:id, :bigint)
|
139
|
+
end
|
140
|
+
|
105
141
|
ddl_node.body.each_descendant(:send) do |send_node|
|
106
142
|
fields = [*fields, *parse_migration_field(send_node)]
|
107
143
|
end
|
@@ -112,7 +148,7 @@ module Trains
|
|
112
148
|
fields,
|
113
149
|
@migration_version
|
114
150
|
)
|
115
|
-
elsif ddl_node.
|
151
|
+
elsif ddl_node.is_a?(RuboCop::AST::SendNode)
|
116
152
|
migrations = [*migrations, *parse_one_liner_migration(ddl_node)]
|
117
153
|
end
|
118
154
|
end
|
@@ -122,6 +158,7 @@ module Trains
|
|
122
158
|
|
123
159
|
def parse_migration_field(node)
|
124
160
|
fields = []
|
161
|
+
# t.timestamps
|
125
162
|
if node.children[1] == :timestamps
|
126
163
|
fields << DTO::Field.new(:created_at, :datetime)
|
127
164
|
fields << DTO::Field.new(:updated_at, :datetime)
|
@@ -130,9 +167,27 @@ module Trains
|
|
130
167
|
|
131
168
|
return [] if node.arguments.nil? || node.arguments.empty?
|
132
169
|
|
133
|
-
|
134
|
-
|
135
|
-
|
170
|
+
# method used to create the column
|
171
|
+
# string is the col_method in t.string
|
172
|
+
col_method = node.children[1]
|
173
|
+
case col_method
|
174
|
+
when :column
|
175
|
+
# t.column col_name, col_type
|
176
|
+
type = node.children[3].value
|
177
|
+
value = node.children[2].value
|
178
|
+
fields << DTO::Field.new(value, type)
|
179
|
+
when :references, :belongs_to
|
180
|
+
# t.references
|
181
|
+
type = :bigint
|
182
|
+
value = "#{node.children[2].value}_id".to_sym
|
183
|
+
fields << DTO::Field.new(value, type)
|
184
|
+
when :index
|
185
|
+
else
|
186
|
+
# t.string, t.integer etc.
|
187
|
+
type = node.children[1]
|
188
|
+
value = parse_args(node.children[2])
|
189
|
+
fields << DTO::Field.new(value, type)
|
190
|
+
end
|
136
191
|
|
137
192
|
fields
|
138
193
|
end
|
data/lib/trains/visitor/route.rb
CHANGED
@@ -36,7 +36,6 @@ module Trains
|
|
36
36
|
end
|
37
37
|
end
|
38
38
|
end
|
39
|
-
|
40
39
|
end
|
41
40
|
|
42
41
|
private
|
@@ -48,7 +47,7 @@ module Trains
|
|
48
47
|
when :sym, :str
|
49
48
|
node.arguments[0].value
|
50
49
|
end
|
51
|
-
options =
|
50
|
+
options = parse_args(node.arguments[1]) || {}
|
52
51
|
DTO::Route.new(method:, param:, options:)
|
53
52
|
end
|
54
53
|
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.10
|
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-06-
|
11
|
+
date: 2023-06-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|