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 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