trains 0.0.8 → 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: be756e07f687c79e259385beb680f5749c54a880273be056ba83a717aa821887
4
- data.tar.gz: da3fc5403f7844919f9bfd3ac49ef37479e7f4149328e851d1b1e654353398af
3
+ metadata.gz: 2862732986e24d80f6fe47f3035e206cc033354767902260e7003c983b30ce3d
4
+ data.tar.gz: 0fd7fbb15a6e12d2bdc61f8753b0f9c7fbe85f9a2a43639089c166364255a27e
5
5
  SHA512:
6
- metadata.gz: 3a389ed84aedba71b13061c4233389d3008bd895a532f506a9f492a6d6aaa54ae96708d27f0e4cba9269f1666ef8f614c5ebf467a8bbf70c63595b449e2bcc0f
7
- data.tar.gz: be28d384e28be094161bcdb28105a4bef9dd2d7f86978936f554bf699a205c1953a88bd1de071c1005f2ec4d5c54e91bf6ace9e20f7f917bc8204b46ced1a431
6
+ metadata.gz: 151eeb6f6a3c4a1494d40e8e231c6dcaa2b5f66673e59fbf26623d5054a74e514f3d02385b752f2d1cb20145c3ce06794286de3f34b3b11b002d4991419b7d10
7
+ data.tar.gz: 555e8794465a0f4ea87e05ebad167d3248e4263cb4a9de02736b3003fb06eb40f8fd20a88cda681e78f1803294d025a815c9fed80c1f00a62a0799b3bfb5d39e
@@ -1,3 +1,3 @@
1
1
  module Trains
2
- VERSION = '0.0.8'
2
+ VERSION = '0.0.9'.freeze
3
3
  end
@@ -5,18 +5,26 @@ module Trains
5
5
  # Visitor that parses DB migration and associates them with Rails models
6
6
  class Migration < Base
7
7
  def_node_matcher :send_node?, '(send nil? ...)'
8
- attr_reader :is_migration, :model
9
-
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)
@@ -27,16 +35,7 @@ module Trains
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,75 +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
- add_index
67
- ]
68
- column_modifiers = %i[
69
- add_column
70
- change_column
71
- remove_column
72
- ]
51
+ return unless node.def_type?
73
52
 
74
53
  method_name = node.method_name
75
- 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
76
57
  return if node.body.nil?
77
58
 
78
- table_modifier =
79
- # if table modifier is a one-liner method call
80
- if node.body.children[0].nil?
81
- node.body.children[1]
82
- elsif node.body.children[0].block_type?
83
- # if table modifier is in a block
84
- node.body.children[0].method_name
85
- elsif node.body.children[0].send_type?
86
- 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
87
71
  end
88
- 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
89
78
 
90
- @table_modifier = table_modifier
79
+ def parse_one_liner_migration(node)
80
+ return unless COLUMN_MODIFIERS.include?(node.method_name)
91
81
 
92
- node.each_descendant(:send) do |send_node|
93
- if allowed_table_modifiers.include?(send_node.method_name)
94
- raw_table_name = send_node.arguments[0]
95
- @table_name = raw_table_name.value.to_s.singularize.camelize
96
- if column_modifiers.include?(send_node.method_name)
97
- @fields.append(DTO::Field.new(send_node.arguments[1].value,
98
- send_node.arguments[2]&.value))
99
- end
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
100
86
 
101
- next
102
- end
87
+ DTO::Migration.new(
88
+ table_name,
89
+ node.method_name,
90
+ [DTO::Field.new(column_name, type)],
91
+ @migration_version
92
+ )
93
+ end
94
+
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 = []
103
100
 
104
- next if allowed_table_modifiers.include?(send_node.method_name)
101
+ if ddl_node.block_type?
102
+ next unless ALLOWED_TABLE_MODIFIERS.include?(ddl_node.method_name)
105
103
 
106
- parse_migration_field(send_node)
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
107
118
  end
119
+
120
+ migrations
108
121
  end
109
122
 
110
123
  def parse_migration_field(node)
124
+ fields = []
111
125
  if node.children[1] == :timestamps
112
- @fields.append(DTO::Field.new(:created_at, :datetime))
113
- @fields.append(DTO::Field.new(:updated_at, :datetime))
114
- return
126
+ fields << DTO::Field.new(:created_at, :datetime)
127
+ fields << DTO::Field.new(:updated_at, :datetime)
128
+ return fields
115
129
  end
116
130
 
131
+ return [] if node.arguments.nil? || node.arguments.empty?
132
+
117
133
  type = node.children[1]
118
134
  value = node.children[2].value unless node.children[2].hash_type?
119
- @fields.append(DTO::Field.new(value, type))
135
+ fields << DTO::Field.new(value, type)
136
+
137
+ fields
120
138
  end
121
139
  end
122
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.8
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-23 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