trains 0.0.3 → 0.0.5

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: 5967b89c0edf52539f69630d235c4e32b0a14a34e2739f593ca666e6ea451e02
4
- data.tar.gz: 95ef423ff42e64a346931ce84d1becd8d810fcb92b52e51bf9f628d84821e273
3
+ metadata.gz: e4c83b37c56def34baa1bd60260cecec154d1da870f2b43471994f60c2a7397e
4
+ data.tar.gz: 3075d23e3f460a9787a0c1184c05ece0bbe21ca8d676bfa8828bb8b5cd91c1ac
5
5
  SHA512:
6
- metadata.gz: 32e6e039363c647c6175a770636d4082edc081f525d8dba56628d47e1cf55e56218ca0b6b39969b9cf64b50e6216fcdcc5dc589d0abfeeffc01f224afc9b3aaa
7
- data.tar.gz: 5de86fe0d626f302865a2b9b6b8d4c41ea6fbf9ff20ddc7057ef06a71cca1324af3c226a016339eb78d8bc8da5c7c7a914d5e7828d8ca6b0965daf3537db8e15
6
+ metadata.gz: 47357749dc2a2effab891336c1c0d2e338474288b720dd01eac00173adba3b9ce41f5bbd06bafec55b2319e25b2faa128aab9805c4251009de0ac3617661ac2c
7
+ data.tar.gz: 7dd8d5c09dd6a6e84da47a74f805dc9b26cfad3943f98d433668bb2f8d4adb1d4f08a5607355e1c2e9a25cee91e59ff4b3016f087dad05f9a86e57fbfe01c7cc
data/.deepsource.toml CHANGED
@@ -2,6 +2,3 @@ version = 1
2
2
 
3
3
  [[analyzers]]
4
4
  name = "ruby"
5
-
6
- [[transformers]]
7
- name = "rubocop"
data/Gemfile.lock CHANGED
@@ -45,6 +45,7 @@ GEM
45
45
  zeitwerk (2.5.4)
46
46
 
47
47
  PLATFORMS
48
+ x86_64-darwin-21
48
49
  x86_64-linux
49
50
 
50
51
  DEPENDENCIES
data/README.md CHANGED
@@ -10,8 +10,8 @@ A gem that statically analyses your Rails app and extracts information about its
10
10
  1. [Installation](#installation)
11
11
  2. [Usage](#usage)
12
12
  3. [Features](#features)
13
- 3.1 [Create Model definitions from migrations](#create-model-definitions-from-migrations)
14
- 3.2 [Create controller definitions from files](#create-controller-definitions-from-files)
13
+ 1. [Create Model definitions from migrations](#create-model-definitions-from-migrations)
14
+ 2. [Create controller definitions from files](#create-controller-definitions-from-files)
15
15
  4. [Development](#development)
16
16
  5. [Contributing](#contributing)
17
17
  6. [License](#license)
@@ -1,13 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Trains
2
4
  module DTO
3
- App = Struct.new(
4
- 'App',
5
- :name,
6
- :controllers,
7
- :models,
8
- :migrations,
9
- :helpers,
10
- keyword_init: true
11
- )
5
+ App =
6
+ Data.define(:name, :controllers, :models, :helpers, :routes)
12
7
  end
13
8
  end
@@ -1,7 +1,7 @@
1
- require 'set'
1
+ require "set"
2
2
 
3
3
  module Trains
4
4
  module DTO
5
- Controller = Struct.new('Controller', :name, :method_list, keyword_init: true)
5
+ Controller = Data.define(:name, :method_list)
6
6
  end
7
7
  end
@@ -1,5 +1,5 @@
1
1
  module Trains
2
2
  module DTO
3
- Field = Struct.new(:name, :type)
3
+ Field = Data.define(:name, :type)
4
4
  end
5
5
  end
@@ -1,5 +1,5 @@
1
1
  module Trains
2
2
  module DTO
3
- Method = Struct.new('Method', :name, :source, :visibility, keyword_init: true)
3
+ Method = Data.define(:name)
4
4
  end
5
5
  end
@@ -0,0 +1,5 @@
1
+ module Trains
2
+ module DTO
3
+ Migration = Data.define(:table_name, :modifier, :fields, :version)
4
+ end
5
+ end
@@ -1,5 +1,5 @@
1
1
  module Trains
2
2
  module DTO
3
- Model = Struct.new(:name, :fields, :version)
3
+ Model = Data.define(:name, :fields, :version)
4
4
  end
5
5
  end
@@ -0,0 +1,5 @@
1
+ module Trains
2
+ module DTO
3
+ Route = Data.define(:method, :param, :options)
4
+ end
5
+ end
@@ -3,21 +3,16 @@ module Trains
3
3
  class Scanner
4
4
  include Utils
5
5
 
6
- attr_accessor :models, :controllers, :helpers, :migrations
7
-
8
- def initialize(folder)
6
+ def initialize(folder, options = {})
9
7
  @root_folder = folder
10
- @nodes = []
11
- @models = []
12
- @controllers = []
13
- @helpers = []
14
- @dir = Dir.new(File.expand_path(folder))
15
- Dir.chdir @dir
8
+ @models = {}
9
+ @controllers = {}
10
+ @helpers = {}
11
+ @dir = File.expand_path(folder)
12
+ @options = options
16
13
  end
17
14
 
18
15
  def scan
19
- # @nodes = get_tree(@dir)
20
-
21
16
  # Check if @folder is a Rails directory before beginning analysis
22
17
  rails_dir_result = RailsDir.check @dir
23
18
  case rails_dir_result
@@ -32,62 +27,85 @@ module Trains
32
27
  )
33
28
  end
34
29
 
35
- @migrations = Set[*get_migrations]
36
- @controllers = Set[*get_controllers]
37
- # @helpers = get_helpers
38
- # @models = get_models
30
+ @models = generate_models unless @options[:models] == false
31
+ @controllers = get_controllers unless @options[:controllers] == false
32
+ @routes = get_routes.to_set unless @options[:routes] == false
33
+ # TODO: @helpers = get_helpers
39
34
 
40
35
  # Create instance of Trains::DTO::App
41
36
  DTO::App.new(
42
37
  name: nil,
43
38
  controllers: @controllers,
44
39
  models: @models,
45
- migrations: @migrations,
46
- helpers: @helpers
40
+ helpers: @helpers,
41
+ routes: @routes
47
42
  )
48
43
  end
49
44
 
50
- # Build central ASTStore
51
- def build_ast_store
52
- all_files = Dir.glob(File.join(@root_folder, '**', '*.rb'))
53
- Parallel.each(all_files) do |file_path|
54
- ASTStore.instance.set(
55
- file_path,
56
- RuboCop::AST::ProcessedSource.from_file(file_path, RUBY_VERSION.to_f)
57
- )
58
- end
45
+ private
46
+
47
+ # Generate models from either db/schema.rb
48
+ # else stitch together migrations to create models
49
+ def generate_models
50
+ return get_models if File.exist?(File.join(@dir, 'db', 'schema.rb'))
51
+
52
+ migrations = get_migrations
53
+ Utils::MigrationTailor.stitch(migrations)
59
54
  end
60
55
 
61
- def get_models; end
56
+ def get_routes
57
+ route_file = [File.join(@dir, 'config', 'routes.rb')]
62
58
 
63
- def get_helpers
64
- app_folder = @nodes[:children].find { |node| node[:path].include? 'app' }
65
- helpers_folder =
66
- app_folder[:children].find { |node| node[:path].include? 'app/helpers' }
67
- helpers =
68
- helpers_folder[:children].filter do |node|
69
- node[:path].end_with? '_helper.rb'
70
- end
59
+ routes_results = parse_util(route_file, Visitor::Route)
60
+ routes_results
61
+ .select { |result| result.error.nil? }
62
+ .map(&:data)
63
+ .flatten
64
+ end
65
+
66
+ def get_models
67
+ result_hash = {}
68
+ schema_file = [File.join(@dir, 'db', 'schema.rb')]
69
+ models_results = parse_util(schema_file, Visitor::Schema)
71
70
 
72
- @helpers = parse_util(helpers, Visitor::Helper)
71
+ models_results
72
+ .select { |result| result.error.nil? }
73
+ .map(&:data)
74
+ .flatten
75
+ .each { |model| result_hash[model.name] = model }
76
+
77
+ result_hash
73
78
  end
74
79
 
80
+ def get_helpers; end
81
+
75
82
  def get_gemfile; end
76
83
 
77
84
  def get_controllers
85
+ result_hash = {}
78
86
  controllers =
79
87
  Dir.glob(File.join(@dir, 'app', 'controllers', '**', '*_controller.rb'))
88
+ controller_results = parse_util(controllers, Visitor::Controller)
89
+
90
+ controller_results
91
+ .select { |result| result.error.nil? }
92
+ .map(&:data)
93
+ .flatten
94
+ .each { |controller| result_hash[controller.name] = controller }
80
95
 
81
- parse_util(controllers, Visitor::Controller)
96
+ result_hash
82
97
  end
83
98
 
84
99
  def get_migrations
85
100
  migrations = Dir.glob(File.join(@dir, 'db', 'migrate', '**', '*.rb'))
101
+ migration_results = parse_util(migrations, Visitor::Migration)
86
102
 
87
- parse_util(migrations, Visitor::Migration)
103
+ migration_results
104
+ .select { |result| result.error.nil? }
105
+ .map(&:data)
88
106
  end
89
107
 
90
- def parse_util(file_nodes, klass)
108
+ def parse_util(file_nodes, visitor_class)
91
109
  unless file_nodes.class.include? Enumerable
92
110
  return(
93
111
  Result.new(
@@ -100,40 +118,22 @@ module Trains
100
118
  )
101
119
  end
102
120
 
103
- begin
104
- Parallel.map(file_nodes) do |node|
105
- processed_source =
106
- RuboCop::AST::ProcessedSource.from_file(node, RUBY_VERSION.to_f)
107
- visitor = klass.new
108
- visitor.process(processed_source.ast)
109
- visitor.result
110
- end
111
- rescue StandardError => e
112
- puts e.backtrace
113
- Result.new(data: nil, error: e)
114
- end
115
- end
116
-
117
- def get_tree(node, prefix = '')
118
- path = File.join(prefix, node)
119
- obj = { path: nil }
121
+ Parallel.map(file_nodes) do |node|
122
+ processed_source =
123
+ RuboCop::AST::ProcessedSource.from_file(node, RUBY_VERSION.to_f)
124
+ visitor = visitor_class.new
125
+ visitor.process(processed_source.ast)
120
126
 
121
- # puts "DEBUG: #{path} #{ FastIgnore.new.allowed? path }"
122
- if path != @dir.to_path &&
123
- FastIgnore.new.allowed?(path, directory: false) == false
124
- return nil
125
- end
126
-
127
- if Dir.exist? path
128
- children = []
129
- Dir.each_child path do |child|
130
- child_node = get_tree(child, path)
131
- children.append(child_node) unless child_node.nil?
127
+ Result.new(data: visitor.result, error: nil)
128
+ rescue StandardError => e
129
+ puts "An error occurred while parsing #{node}. Use debug option to view backtrace. Skipping file..."
130
+ if @options[:debug]
131
+ puts e.message
132
+ puts e.backtrace
132
133
  end
133
- obj[:children] = children
134
- end
135
134
 
136
- obj
135
+ Result.new(data: nil, error: e)
136
+ end
137
137
  end
138
138
  end
139
139
  end
@@ -0,0 +1,43 @@
1
+ module Trains
2
+ module Utils
3
+ module MigrationTailor
4
+ def self.stitch(migrations)
5
+ models = {}
6
+
7
+ migrations.each do |mig|
8
+ case mig.modifier
9
+ when :create_table
10
+ models[mig.table_name] = {}
11
+ models[mig.table_name] = Trains::DTO::Model.new(
12
+ name: mig.table_name,
13
+ fields: mig.fields,
14
+ version: mig.version
15
+ )
16
+ when :add_column
17
+ models[mig.table_name].fields.push(*mig.fields)
18
+ when :remove_column
19
+ column =
20
+ models[mig.table_name].fields.find do |field|
21
+ field.name == mig.fields.first.name
22
+ end
23
+ models[mig.table_name].fields.delete(column)
24
+ when :change_table
25
+ # TODO: handle renaming columns
26
+ when :change_column
27
+ # get column
28
+ column =
29
+ models[mig.table_name].fields.find do |field|
30
+ field.name == mig.fields.first.name
31
+ end
32
+ # replace it with new column object
33
+ models[mig.table_name].fields.delete(column)
34
+
35
+ models[mig.table_name].fields << mig.fields.first
36
+ end
37
+ end
38
+
39
+ models
40
+ end
41
+ end
42
+ end
43
+ end
@@ -3,9 +3,9 @@ module Trains
3
3
  class RailsDir
4
4
  # checks if supplied dir is in a Rails app dir
5
5
  def self.check(root_path)
6
- rails_bin = File.join(root_path, 'bin', 'rails')
6
+ rails_bin = File.join(root_path, "bin", "rails")
7
7
 
8
- Result.new(File.exist?(rails_bin), nil)
8
+ Result.new(data: File.exist?(rails_bin), error: nil)
9
9
  end
10
10
  end
11
11
  end
@@ -1,5 +1,5 @@
1
1
  module Trains
2
2
  module Utils
3
- Result = Struct.new('Result', :data, :error)
3
+ Result = Struct.new("Result", :data, :error, keyword_init: true)
4
4
  end
5
5
  end
@@ -1,3 +1,3 @@
1
1
  module Trains
2
- VERSION = '0.0.3'
2
+ VERSION = '0.0.5'
3
3
  end
@@ -1,5 +1,5 @@
1
- require_relative '../dto/controller'
2
- require_relative '../dto/method'
1
+ require_relative "../dto/controller"
2
+ require_relative "../dto/method"
3
3
 
4
4
  module Trains
5
5
  module Visitor
@@ -12,31 +12,33 @@ module Trains
12
12
  end
13
13
 
14
14
  def on_class(node)
15
- class_name = node.identifier.const_name
16
- parent_class = node.parent_class.const_name.to_sym
17
-
18
- is_controller =
19
- if parent_class.nil?
20
- true if class_name == :ApplicationController
21
- else
22
- parent_class == :"ActionController::Base"
23
- end
24
- return unless is_controller
15
+ class_name = node.identifier.const_name.to_s
16
+ parent_class = node.parent_class.const_name.to_s
17
+ return unless controller?(parent_class)
25
18
 
26
19
  @class_name = class_name
27
- end
28
-
29
- # List out all controller methods
30
- def on_def(node)
31
- method_name = node.method_name
32
- @method_list.append(
33
- DTO::Method.new(name: method_name.to_s, visibility: nil, source: nil)
34
- )
20
+ parse_body(node.body) unless node.body.nil?
35
21
  end
36
22
 
37
23
  def result
38
24
  DTO::Controller.new(name: @class_name, method_list: @method_list.uniq)
39
25
  end
26
+
27
+ private
28
+
29
+ def parse_body(body)
30
+ body.each_child_node do |child|
31
+ @method_list << parse_method(child) if child.type == :def
32
+ end
33
+ end
34
+
35
+ def controller?(parent_class)
36
+ %w[ActionController::Base ApplicationController].include? parent_class
37
+ end
38
+
39
+ def parse_method(node)
40
+ DTO::Method.new(name: node.method_name.to_s)
41
+ end
40
42
  end
41
43
  end
42
44
  end
@@ -1,14 +1,15 @@
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? ...)'
7
+ def_node_matcher :send_node?, "(send nil? ...)"
8
8
  attr_reader :is_migration, :model
9
9
 
10
10
  def initialize
11
11
  @model = nil
12
+ @table_modifier = nil
12
13
  @table_name = nil
13
14
  @is_class = false
14
15
  @is_migration = false
@@ -19,7 +20,7 @@ module Trains
19
20
  end
20
21
 
21
22
  def on_class(node)
22
- unless node.parent_class.source.include? 'ActiveRecord::Migration'
23
+ unless node.parent_class.source.include? "ActiveRecord::Migration"
23
24
  return
24
25
  end
25
26
 
@@ -29,6 +30,17 @@ module Trains
29
30
  process_node(node.body)
30
31
  end
31
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
+ )
40
+ end
41
+
42
+ private
43
+
32
44
  def extract_version(class_const)
33
45
  match = class_const.match(/\d+.\d+/)
34
46
  return nil if match.nil?
@@ -37,44 +49,72 @@ module Trains
37
49
  end
38
50
 
39
51
  def process_node(node)
40
- process_def_node(node) if node.def_type?
52
+ return unless node.def_type?
53
+
54
+ process_def_node(node)
41
55
  end
42
56
 
43
57
  def process_def_node(node)
44
58
  allowed_method_names = %i[change up down]
45
- allowed_table_modifiers = %i[create_table update_column]
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
46
68
 
47
69
  method_name = node.method_name
48
70
  return unless allowed_method_names.include? method_name
49
-
50
- table_modifier = node.body.children[0].method_name
71
+ return if node.body.nil?
72
+
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
82
+ end
51
83
  return unless allowed_table_modifiers.include? table_modifier
52
84
 
53
- raw_table_name = node.body.children[0].children[0].children[2].value.to_s
54
- @table_name = raw_table_name.singularize.camelize
85
+ @table_modifier = table_modifier
55
86
 
56
- node.body.children[0].children[2].each_child_node do |child|
57
- process_migration_field(child)
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
92
+
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
99
+
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))
58
103
  end
59
104
  end
60
105
 
61
106
  def process_migration_field(node)
62
107
  return unless node.send_type?
63
108
 
64
- if node.children.count < 3
65
- if node.children[1] == :timestamps
66
- @fields.append(DTO::Field.new(:created_at, :datetime))
67
- @fields.append(DTO::Field.new(:updated_at, :datetime))
68
- end
69
- elsif node.children.count >= 3
70
- type = node.children[1]
71
- value = node.children[2].value
72
- @fields.append(DTO::Field.new(value, type))
109
+ 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
73
113
  end
74
- end
75
114
 
76
- def result
77
- DTO::Model.new(@table_name, @fields, @migration_version)
115
+ type = node.children[1]
116
+ value = node.children[2].value unless node.children[2].hash_type?
117
+ @fields.append(DTO::Field.new(value, type))
78
118
  end
79
119
  end
80
120
  end
@@ -0,0 +1,79 @@
1
+ require_relative "../dto/route"
2
+
3
+ module Trains
4
+ module Visitor
5
+ class Route < Base
6
+ def_node_matcher :route_parent?, <<~PATTERN
7
+ (block (send (send (send
8
+ (const nil? :Rails) :application) :routes) :draw)
9
+ ...)
10
+ PATTERN
11
+
12
+ def_node_matcher :route_method?, <<~PATTERN
13
+ (send nil? %1 ...)
14
+ PATTERN
15
+
16
+ ALLOWED_VERBS = %i[get put post update delete resources scope]
17
+
18
+ def initialize
19
+ @route_list = []
20
+ end
21
+
22
+ def result
23
+ @route_list
24
+ end
25
+
26
+ def on_block(node)
27
+ return unless route_parent?(node)
28
+ return if node.body.nil?
29
+
30
+ node.body.each_child_node do |child|
31
+ ALLOWED_VERBS.each do |verb|
32
+ if route_method?(child, verb)
33
+ @route_list << parse_route(child, verb)
34
+ end
35
+ end
36
+ end
37
+ end
38
+
39
+ private
40
+
41
+ def parse_route(node, verb)
42
+ method = verb
43
+ param =
44
+ case node.arguments[0].type
45
+ when :sym, :str
46
+ node.arguments[0].value
47
+ end
48
+ options = parse_hash(node.arguments[1])
49
+ DTO::Route.new(method: method, param: param, options: options)
50
+ end
51
+
52
+ def parse_hash(node)
53
+ options = {}
54
+ return options unless node.type == :hash
55
+
56
+ node.each_pair { |key, value| options[key.value] = parse_value(value) }
57
+ rescue StandardError => e
58
+ puts node.parent
59
+ ensure
60
+ return options
61
+ end
62
+
63
+ def parse_value(node)
64
+ case node.type
65
+ when :hash
66
+ parse_hash(node)
67
+ when :array
68
+ node.values.map { |value| parse_value(value) }
69
+ when :send
70
+ if node.method_name == :redirect
71
+ { redirect: node.arguments.first.value }
72
+ end
73
+ else
74
+ node.value
75
+ end
76
+ end
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,88 @@
1
+ module Trains
2
+ module Visitor
3
+ # Visitor that parses DB migration and associates them with Rails models
4
+ class Schema < Base
5
+ def_node_matcher :versioned_schema?, <<~PATTERN
6
+ (block
7
+ (send (send (const (const nil? :ActiveRecord) :Schema) :[] (float ...)) :define ...)
8
+ ...)
9
+ PATTERN
10
+
11
+ def_node_matcher :unversioned_schema?, <<~PATTERN
12
+ (block
13
+ (send (const (const nil? :ActiveRecord) :Schema) :define ...)
14
+ ...)
15
+ PATTERN
16
+
17
+ def initialize
18
+ @models = []
19
+ @columns = []
20
+ @is_versioned = false
21
+ end
22
+
23
+ def on_block(node)
24
+ is_schema = versioned_schema?(node) || unversioned_schema?(node)
25
+ return unless is_schema
26
+
27
+ process_schema_body(node)
28
+ end
29
+
30
+ def result
31
+ @models
32
+ end
33
+
34
+ private
35
+
36
+ def each_table(ast)
37
+ case ast.body.type
38
+ when :begin
39
+ ast.body.children.each do |node|
40
+ next unless node.block_type? && node.method?(:create_table)
41
+
42
+ yield(node)
43
+ end
44
+ else
45
+ yield ast.body
46
+ end
47
+ end
48
+
49
+ def each_content(node, &block)
50
+ return enum_for(__method__, node) unless block
51
+
52
+ case node.body&.type
53
+ when :begin
54
+ node.body.children.each(&block)
55
+ else
56
+ yield(node.body)
57
+ end
58
+ end
59
+
60
+ def build_columns(node)
61
+ each_content(node)
62
+ .map do |child|
63
+ next unless child&.send_type?
64
+ next if child.method?(:index)
65
+
66
+ DTO::Field.new(
67
+ name: child.first_argument.str_content,
68
+ type: child.method_name
69
+ )
70
+ end
71
+ .compact
72
+ end
73
+
74
+ def process_schema_body(node)
75
+ each_table(node) do |table|
76
+ @table_name = table.send_node.first_argument.value
77
+ @columns = build_columns(table)
78
+
79
+ @models << DTO::Model.new(
80
+ name: @table_name.singularize.camelize,
81
+ fields: @columns,
82
+ version: nil
83
+ )
84
+ end
85
+ end
86
+ end
87
+ end
88
+ end
data/trains.gemspec CHANGED
@@ -36,4 +36,5 @@ Gem::Specification.new do |spec|
36
36
  spec.add_dependency 'parallel', '~> 1.22'
37
37
  spec.add_dependency 'rubocop-ast', '~> 1.16'
38
38
  spec.add_dependency 'zeitwerk', '~> 2.5'
39
+ spec.metadata['rubygems_mfa_required'] = 'true'
39
40
  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.3
4
+ version: 0.0.5
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-02-19 00:00:00.000000000 Z
11
+ date: 2023-04-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -76,7 +76,6 @@ files:
76
76
  - ".deepsource.toml"
77
77
  - ".rspec"
78
78
  - ".rubocop.yml"
79
- - ".ruby-version"
80
79
  - CHANGELOG.md
81
80
  - CODE_OF_CONDUCT.md
82
81
  - Gemfile
@@ -89,10 +88,12 @@ files:
89
88
  - lib/trains/dto/controller.rb
90
89
  - lib/trains/dto/field.rb
91
90
  - lib/trains/dto/method.rb
91
+ - lib/trains/dto/migration.rb
92
92
  - lib/trains/dto/model.rb
93
+ - lib/trains/dto/route.rb
93
94
  - lib/trains/scanner.rb
94
- - lib/trains/utils/ast_store.rb
95
95
  - lib/trains/utils/logger.rb
96
+ - lib/trains/utils/migration_tailor.rb
96
97
  - lib/trains/utils/rails_dir.rb
97
98
  - lib/trains/utils/result.rb
98
99
  - lib/trains/version.rb
@@ -100,6 +101,8 @@ files:
100
101
  - lib/trains/visitor/controller.rb
101
102
  - lib/trains/visitor/helper.rb
102
103
  - lib/trains/visitor/migration.rb
104
+ - lib/trains/visitor/route.rb
105
+ - lib/trains/visitor/schema.rb
103
106
  - trains.gemspec
104
107
  homepage: https://github.com/faraazahmad/trains
105
108
  licenses:
@@ -108,6 +111,7 @@ metadata:
108
111
  homepage_uri: https://github.com/faraazahmad/trains
109
112
  source_code_uri: https://github.com/faraazahmad/trains
110
113
  changelog_uri: https://github.com/faraazahmad/trains/blob/master/CHANGELOG.md
114
+ rubygems_mfa_required: 'true'
111
115
  post_install_message:
112
116
  rdoc_options: []
113
117
  require_paths:
data/.ruby-version DELETED
@@ -1 +0,0 @@
1
- 3.0.0
@@ -1,25 +0,0 @@
1
- require 'singleton'
2
-
3
- module Trains
4
- module Utils
5
- class ASTStore
6
- include Singleton
7
-
8
- def initialize
9
- @store = {}
10
- end
11
-
12
- def set(file_path, ast_object)
13
- @store[file_path] = ast_object
14
- end
15
-
16
- def get(file_path)
17
- unless @store.key? file_path
18
- set(file_path,
19
- RuboCop::AST::ProcessedSource.from_file(file_path, RUBY_VERSION.to_f))
20
- end
21
- @store[file_path]
22
- end
23
- end
24
- end
25
- end