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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 553d908187ec4b9cc7e3f06616e096e8a341061ec3a345bce5018c6e1578e4ae
4
- data.tar.gz: 2201e5acb6d148926f4602a885d3588cb902496b788d8565330c9ed3588e3243
3
+ metadata.gz: 2862732986e24d80f6fe47f3035e206cc033354767902260e7003c983b30ce3d
4
+ data.tar.gz: 0fd7fbb15a6e12d2bdc61f8753b0f9c7fbe85f9a2a43639089c166364255a27e
5
5
  SHA512:
6
- metadata.gz: e4b2ee11d9e1af06232169f886a3695f14e1d2c9418d4449706af4a872932f0efa408a43b3a4f3cd2237a133f3720adc1e94ad6e313facdefe917a401b154134
7
- data.tar.gz: dc2e1d251fc0cdc28d2cc340484eeae228039deab55fbca8b1c61988417d01ce5aa921a7a84367fd661f841e839718ea74048fb7738e740328bb0b969e3907a0
6
+ metadata.gz: 151eeb6f6a3c4a1494d40e8e231c6dcaa2b5f66673e59fbf26623d5054a74e514f3d02385b752f2d1cb20145c3ce06794286de3f34b3b11b002d4991419b7d10
7
+ data.tar.gz: 555e8794465a0f4ea87e05ebad167d3248e4263cb4a9de02736b3003fb06eb40f8fd20a88cda681e78f1803294d025a815c9fed80c1f00a62a0799b3bfb5d39e
@@ -1,3 +1,3 @@
1
1
  module Trains
2
- VERSION = '0.0.7'
2
+ VERSION = '0.0.9'.freeze
3
3
  end
@@ -1,42 +1,41 @@
1
- require "yaml"
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?, "(send nil? ...)"
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
- @model = nil
12
- @table_modifier = nil
13
- @table_name = nil
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? "ActiveRecord::Migration"
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
- process_node(node.body)
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
- allowed_method_names = %i[change up down]
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
- return unless allowed_method_names.include? method_name
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
- table_modifier =
74
- if node.body.children[0] == nil
75
- block_type_modifier = false
76
- # if table modifier is a one-liner method call
77
- node.body.children[1]
78
- elsif node.body.children[0].block_type?
79
- block_type_modifier = true
80
- # if table modifier is in a block
81
- node.body.children[0].method_name
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
- return unless allowed_table_modifiers.include? table_modifier
72
+ when :block
73
+ @result = [*@result, *parse_block_migration(node)]
74
+ else
75
+ LOGGER.debug(node)
76
+ end
77
+ end
84
78
 
85
- @table_modifier = table_modifier
79
+ def parse_one_liner_migration(node)
80
+ return unless COLUMN_MODIFIERS.include?(node.method_name)
86
81
 
87
- # Get the name of the table being modified
88
- if block_type_modifier
89
- raw_table_name =
90
- node.body.children[0].children[0].children[2].value.to_s
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
- node.body.children[0].children[2].each_child_node do |child|
94
- process_migration_field(child)
95
- end
96
- else
97
- raw_table_name = node.body.children[2].value.to_s
98
- @table_name = raw_table_name.singularize.camelize
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
- field_name = node.body.children[3]&.value
101
- field_type = node.body.children[4]&.value
102
- @fields.append(DTO::Field.new(field_name, field_type))
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
- def process_migration_field(node)
107
- return unless node.send_type?
120
+ migrations
121
+ end
108
122
 
123
+ def parse_migration_field(node)
124
+ fields = []
109
125
  if node.children[1] == :timestamps
110
- @fields.append(DTO::Field.new(:created_at, :datetime))
111
- @fields.append(DTO::Field.new(:updated_at, :datetime))
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
- @fields.append(DTO::Field.new(value, type))
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.7
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-05-22 00:00:00.000000000 Z
11
+ date: 2023-06-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport