trains 0.0.9 → 0.0.10

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: 2862732986e24d80f6fe47f3035e206cc033354767902260e7003c983b30ce3d
4
- data.tar.gz: 0fd7fbb15a6e12d2bdc61f8753b0f9c7fbe85f9a2a43639089c166364255a27e
3
+ metadata.gz: 706372a84f876f65aec9c638d6ad2c17dd6255f6dbc942bccbe1f0f81b86e069
4
+ data.tar.gz: 431b9033167ed91a657dd00ca806c16c1c3df454f74ec276eb7e79baf8407adf
5
5
  SHA512:
6
- metadata.gz: 151eeb6f6a3c4a1494d40e8e231c6dcaa2b5f66673e59fbf26623d5054a74e514f3d02385b752f2d1cb20145c3ce06794286de3f34b3b11b002d4991419b7d10
7
- data.tar.gz: 555e8794465a0f4ea87e05ebad167d3248e4263cb4a9de02736b3003fb06eb40f8fd20a88cda681e78f1803294d025a815c9fed80c1f00a62a0799b3bfb5d39e
6
+ metadata.gz: a9b1de71a3735c43afee1f793ad0af94e9d8d7d0fced82023c3927d52e2821cf730b997ae7eeab53816208c11320ed4168c381d3d5fa18d0c1c8c8cb3f008006
7
+ data.tar.gz: c3eac1a413ece2f2ff937f642843aefb7188b63cd25c03d6f394a223b63a1ebb8c25c0a05e7d63c6c903d94687b2f59beb2eebed7b196c7f2e2405573a363075
@@ -49,7 +49,7 @@ module Trains
49
49
  def generate_models
50
50
  return get_models if File.exist?(File.join(@dir, 'db', 'schema.rb'))
51
51
 
52
- migrations = get_migrations
52
+ migrations = get_migrations.flatten.reject(&:nil?)
53
53
  Utils::MigrationTailor.stitch(migrations)
54
54
  end
55
55
 
@@ -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
- else
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
@@ -1,6 +1,14 @@
1
- module Logger
2
- def debug(log)
3
- puts '[DEBUG]:'.bold.blue
4
- pp log
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
@@ -1,3 +1,3 @@
1
1
  module Trains
2
- VERSION = '0.0.9'.freeze
2
+ VERSION = '0.0.10'.freeze
3
3
  end
@@ -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 down].freeze
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
- process_def_node(node.body)
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 process_def_node(node)
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
- LOGGER.debug(node)
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
- type = arguments[2].value unless node.method_name == :remove_column
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.each_descendant do |ddl_node|
99
- fields = []
109
+ node.children.each do |ddl_node|
110
+ next if ddl_node.is_a?(Symbol)
100
111
 
101
- if ddl_node.block_type?
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.send_type?
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
- type = node.children[1]
134
- value = node.children[2].value unless node.children[2].hash_type?
135
- fields << DTO::Field.new(value, type)
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
@@ -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 = parse_hash(node.arguments[1])
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.9
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-13 00:00:00.000000000 Z
11
+ date: 2023-06-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport