rbs_active_hash 1.2.2 → 1.3.1

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: 7cebfa0accc1277b5ec246b7aa963deef65a0c49722f194c0e1dc4125d4b9c08
4
- data.tar.gz: e15eef33012442f0bbe5e64552ac1b283d2fbd8bc814bd328bc60ebf5d69b6dd
3
+ metadata.gz: 49a4b12af2d15a13a338e2924494f4da8d3167301f3fa9bc66277bdf0185d326
4
+ data.tar.gz: 94eef0c6aafc8d0162541e51871ace002bdcd5b6f38f0203ef30eecfb19d666a
5
5
  SHA512:
6
- metadata.gz: 294b5c3741aa02f777ba1d487f27bf51776705daaa896b204005df904b1c5ac240dd3952279189382a5c042bfd784e9d532153e550cca6fa4d7aac22e554499d
7
- data.tar.gz: bef9cbbf9fdb93b5abb989782baa05d791b3e048b6b328046ca0158fdf78efc1a62d2e1fcbd4e6534168a16cd3bfc27aca2adc3944afe5ccfe6f71722296bd5b
6
+ metadata.gz: 2fc036b3bd3ce01452800e183f683e6dc7a6c720d07484414c5c6cc393f9b7b8d15cef8d3819ef1ef38173b449b9cfdd892db3764e0f5468e76461f35ef557c0
7
+ data.tar.gz: 437b7dec163d2a770d2f916727aac06e3b1c6d2d69cae56cc1c63d756fa87b4abb12025f1b9ee9d833ccca00677bca70e062321ce8cd911fbb2f37a5ddfcca67
data/.rubocop.yml CHANGED
@@ -25,8 +25,11 @@ Metrics/BlockLength:
25
25
  Metrics/ClassLength:
26
26
  Max: 200
27
27
 
28
+ Metrics/CyclomaticComplexity:
29
+ Max: 10
30
+
28
31
  Metrics/MethodLength:
29
- Max: 20
32
+ Max: 30
30
33
 
31
34
  Metrics/PerceivedComplexity:
32
35
  Max: 10
@@ -2,5 +2,8 @@
2
2
  "[ruby]": {
3
3
  "editor.defaultFormatter": "Shopify.ruby-lsp"
4
4
  },
5
- "rbs-helper.signature-directory": "sig"
5
+ "rbs-helper.signature-directory": "sig",
6
+ "cSpell.words": [
7
+ "Cyclomatic"
8
+ ]
6
9
  }
data/Gemfile.lock CHANGED
@@ -1,35 +1,34 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- rbs_active_hash (1.2.2)
4
+ rbs_active_hash (1.3.1)
5
5
  active_hash
6
6
  rbs
7
- rbs_rails
8
7
 
9
8
  GEM
10
9
  remote: https://rubygems.org/
11
10
  specs:
12
- actionpack (7.0.7)
13
- actionview (= 7.0.7)
14
- activesupport (= 7.0.7)
11
+ actionpack (7.0.7.2)
12
+ actionview (= 7.0.7.2)
13
+ activesupport (= 7.0.7.2)
15
14
  rack (~> 2.0, >= 2.2.4)
16
15
  rack-test (>= 0.6.3)
17
16
  rails-dom-testing (~> 2.0)
18
17
  rails-html-sanitizer (~> 1.0, >= 1.2.0)
19
- actionview (7.0.7)
20
- activesupport (= 7.0.7)
18
+ actionview (7.0.7.2)
19
+ activesupport (= 7.0.7.2)
21
20
  builder (~> 3.1)
22
21
  erubi (~> 1.4)
23
22
  rails-dom-testing (~> 2.0)
24
23
  rails-html-sanitizer (~> 1.1, >= 1.2.0)
25
24
  active_hash (3.2.0)
26
25
  activesupport (>= 5.0.0)
27
- activemodel (7.0.7)
28
- activesupport (= 7.0.7)
29
- activerecord (7.0.7)
30
- activemodel (= 7.0.7)
31
- activesupport (= 7.0.7)
32
- activesupport (7.0.7)
26
+ activemodel (7.0.7.2)
27
+ activesupport (= 7.0.7.2)
28
+ activerecord (7.0.7.2)
29
+ activemodel (= 7.0.7.2)
30
+ activesupport (= 7.0.7.2)
31
+ activesupport (7.0.7.2)
33
32
  concurrent-ruby (~> 1.0, >= 1.0.2)
34
33
  i18n (>= 1.6, < 2)
35
34
  minitest (>= 5.1)
@@ -80,9 +79,9 @@ GEM
80
79
  rails-html-sanitizer (1.6.0)
81
80
  loofah (~> 2.21)
82
81
  nokogiri (~> 1.14)
83
- railties (7.0.7)
84
- actionpack (= 7.0.7)
85
- activesupport (= 7.0.7)
82
+ railties (7.0.7.2)
83
+ actionpack (= 7.0.7.2)
84
+ activesupport (= 7.0.7.2)
86
85
  method_source
87
86
  rake (>= 12.2)
88
87
  thor (~> 1.0)
@@ -93,9 +92,6 @@ GEM
93
92
  rb-inotify (0.10.1)
94
93
  ffi (~> 1.0)
95
94
  rbs (3.1.3)
96
- rbs_rails (0.12.0)
97
- parser
98
- rbs (>= 1)
99
95
  regexp_parser (2.8.1)
100
96
  rexml (3.2.6)
101
97
  rspec (3.12.0)
@@ -114,7 +110,7 @@ GEM
114
110
  diff-lcs (>= 1.2.0, < 2.0)
115
111
  rspec-support (~> 3.12.0)
116
112
  rspec-support (3.12.0)
117
- rubocop (1.56.0)
113
+ rubocop (1.56.1)
118
114
  base64 (~> 0.1.1)
119
115
  json (~> 2.3)
120
116
  language_server-protocol (>= 3.17.0)
@@ -6,8 +6,10 @@ module RbsActiveHash
6
6
  class InstallGenerator < Rails::Generators::Base
7
7
  def create_raketask
8
8
  create_file "lib/tasks/rbs_active_hash.rake", <<~RUBY
9
+ # frozen_string_literal: true
10
+
9
11
  begin
10
- require 'rbs_active_hash/rake_task'
12
+ require "rbs_active_hash/rake_task"
11
13
 
12
14
  RbsActiveHash::RakeTask.new
13
15
  rescue LoadError
@@ -0,0 +1,114 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rbs"
4
+
5
+ module RbsActiveHash
6
+ module ActiveHash
7
+ module Parser
8
+ class AssociationDefinition < RBS::AST::Members::Include
9
+ end
10
+
11
+ class ScopeDefinition < RBS::AST::Members::Include
12
+ end
13
+
14
+ class RB < RBS::Prototype::RB
15
+ def process(node, decls:, comments:, context:)
16
+ case node.type
17
+ when :FCALL, :VCALL
18
+ case node.children.first
19
+ when :has_many, :has_one, :belongs_to
20
+ decls << AssociationDefinition.new(
21
+ name: RBS::TypeName.new(name: node.children.first, namespace: RBS::Namespace.root),
22
+ args: node.children[1],
23
+ annotations: [],
24
+ location: nil,
25
+ comment: nil
26
+ )
27
+ when :scope
28
+ decls << ScopeDefinition.new(
29
+ name: RBS::TypeName.new(name: node.children.first, namespace: RBS::Namespace.root),
30
+ args: node.children[1],
31
+ annotations: [],
32
+ location: nil,
33
+ comment: nil
34
+ )
35
+ else
36
+ super
37
+ end
38
+ else
39
+ super
40
+ end
41
+ end
42
+ end
43
+
44
+ class Parser
45
+ attr_reader :has_many, :has_one, :belongs_to, :scopes
46
+
47
+ def initialize
48
+ @has_many = []
49
+ @has_one = []
50
+ @belongs_to = []
51
+ @scopes = []
52
+ end
53
+
54
+ def parse(string, target)
55
+ parser = RB.new
56
+ parser.parse(string)
57
+ parser.decls.each do |decl|
58
+ process(decl, target)
59
+ end
60
+ end
61
+
62
+ def process(node, target)
63
+ case node
64
+ when RBS::AST::Declarations::Module, RBS::AST::Declarations::Class
65
+ name = node.name.split
66
+ if target[...name.size] == name
67
+ node.members.each do |member|
68
+ process(member, target[name.size...].to_a)
69
+ end
70
+ end
71
+ when AssociationDefinition
72
+ process_association_definition(node) if target.empty?
73
+ when ScopeDefinition
74
+ process_scope_definition(node) if target.empty?
75
+ end
76
+ end
77
+
78
+ def process_association_definition(node)
79
+ case node.name.name
80
+ when :has_many
81
+ association_id, args = node_to_literal(node.args)
82
+ @has_many << [association_id, args.to_h]
83
+ when :has_one
84
+ association_id, args = node_to_literal(node.args)
85
+ @has_one << [association_id, args.to_h]
86
+ when :belongs_to
87
+ association_id, args = node_to_literal(node.args)
88
+ @belongs_to << [association_id, args.to_h]
89
+ end
90
+ end
91
+
92
+ def process_scope_definition(node)
93
+ scope_id, args = node_to_literal(node.args)
94
+ @scopes << [scope_id, args.to_h]
95
+ end
96
+
97
+ def node_to_literal(node)
98
+ case node.type
99
+ when :LIST
100
+ node.children[...-1].map { |child| node_to_literal(child) }
101
+ when :LIT, :STR
102
+ node.children.first
103
+ when :HASH
104
+ Hash[*node_to_literal(node.children.first)]
105
+ when :LAMBDA
106
+ {} # Convert to empty hash because rbs_active_hash does not process lambda
107
+ else
108
+ node
109
+ end
110
+ end
111
+ end
112
+ end
113
+ end
114
+ end
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "rbs"
4
- require "rbs_rails/util"
5
4
  require "active_hash"
6
5
 
7
6
  module RbsActiveHash
@@ -15,15 +14,21 @@ module RbsActiveHash
15
14
  end
16
15
 
17
16
  class Generator
18
- attr_reader :klass, :klass_name
17
+ attr_reader :klass, :klass_name, :parser
19
18
 
20
19
  def initialize(klass)
21
20
  @klass = klass
22
- @klass_name = RbsRails::Util.module_name(klass)
21
+ @klass_name = klass.name || ""
22
+ @parser = ActiveHash::Parser::Parser.new
23
+
24
+ path, = Object.const_source_location(klass_name)
25
+ return unless path
26
+
27
+ @parser.parse(IO.read(path.to_s), klass_name.split("::").map(&:to_sym))
23
28
  end
24
29
 
25
30
  def generate
26
- if klass.ancestors.include? ::ActiveFile::Base
31
+ if klass < ::ActiveFile::Base
27
32
  begin
28
33
  klass.reload
29
34
  rescue StandardError
@@ -31,15 +36,23 @@ module RbsActiveHash
31
36
  end
32
37
  end
33
38
 
34
- RbsRails::Util.format_rbs klass_decl
39
+ format(klass_decl)
35
40
  end
36
41
 
37
42
  private
38
43
 
44
+ def format(rbs)
45
+ parsed = RBS::Parser.parse_signature(rbs)
46
+ StringIO.new.tap do |out|
47
+ RBS::Writer.new(out: out).write(parsed[1] + parsed[2])
48
+ end.string
49
+ end
50
+
39
51
  def klass_decl
40
52
  <<~RBS
41
53
  #{header}
42
54
  #{enum_decls}
55
+ #{scope_decls}
43
56
  #{association_decls}
44
57
  #{method_decls}
45
58
  #{footer}
@@ -55,7 +68,7 @@ module RbsActiveHash
55
68
  when Class
56
69
  # @type var superclass: Class
57
70
  superclass = _ = mod_object.superclass
58
- superclass_name = RbsRails::Util.module_name(superclass)
71
+ superclass_name = superclass.name || "Object"
59
72
 
60
73
  "class #{mod_name} < ::#{superclass_name}"
61
74
  when Module
@@ -98,14 +111,18 @@ module RbsActiveHash
98
111
  end
99
112
  end
100
113
 
101
- def association_decls
102
- return unless klass.ancestors.include? ::ActiveHash::Associations
114
+ def scope_decls
115
+ return if parser.scopes.empty?
103
116
 
104
- path, = Object.const_source_location(klass_name)
105
- return unless path
117
+ parser.scopes.map do |scope_id, _|
118
+ <<~RBS
119
+ def self.#{scope_id}: () -> ActiveHash::Relation[instance]
120
+ RBS
121
+ end.join("\n")
122
+ end
106
123
 
107
- parser = Associations::Parser.new
108
- parser.parse(IO.read(path.to_s), klass_name.split("::").map(&:to_sym))
124
+ def association_decls
125
+ return unless klass.ancestors.include? ::ActiveHash::Associations
109
126
 
110
127
  <<~RBS
111
128
  include ActiveHash::Associations
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RbsActiveHash
4
- VERSION = "1.2.2"
4
+ VERSION = "1.3.1"
5
5
  end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "rbs_active_hash/active_hash"
4
- require_relative "rbs_active_hash/associations"
4
+ require_relative "rbs_active_hash/active_hash/parser"
5
5
  require_relative "rbs_active_hash/version"
6
6
 
7
7
  module RbsActiveHash
@@ -29,7 +29,6 @@ Gem::Specification.new do |spec|
29
29
 
30
30
  spec.add_dependency "active_hash"
31
31
  spec.add_dependency "rbs"
32
- spec.add_dependency "rbs_rails"
33
32
 
34
33
  # For more information and examples about making a new gem, check out our
35
34
  # guide at: https://bundler.io/guides/creating_gem.html
@@ -2,7 +2,7 @@
2
2
  sources:
3
3
  - type: git
4
4
  name: ruby/gem_rbs_collection
5
- revision: a4c633634493ab7ae73219022f56acff56ab69af
5
+ revision: 5666e737d2b27a8425b4e3855c1a38cae54989f7
6
6
  remote: https://github.com/ruby/gem_rbs_collection.git
7
7
  repo_dir: gems
8
8
  path: ".gem_rbs_collection"
@@ -16,7 +16,7 @@ gems:
16
16
  source:
17
17
  type: git
18
18
  name: ruby/gem_rbs_collection
19
- revision: a4c633634493ab7ae73219022f56acff56ab69af
19
+ revision: 306d1aec19defeb177e217d8aad9812a52bcd5eb
20
20
  remote: https://github.com/ruby/gem_rbs_collection.git
21
21
  repo_dir: gems
22
22
  - name: actionview
@@ -24,7 +24,7 @@ gems:
24
24
  source:
25
25
  type: git
26
26
  name: ruby/gem_rbs_collection
27
- revision: a4c633634493ab7ae73219022f56acff56ab69af
27
+ revision: 306d1aec19defeb177e217d8aad9812a52bcd5eb
28
28
  remote: https://github.com/ruby/gem_rbs_collection.git
29
29
  repo_dir: gems
30
30
  - name: active_hash
@@ -32,7 +32,7 @@ gems:
32
32
  source:
33
33
  type: git
34
34
  name: ruby/gem_rbs_collection
35
- revision: a4c633634493ab7ae73219022f56acff56ab69af
35
+ revision: 306d1aec19defeb177e217d8aad9812a52bcd5eb
36
36
  remote: https://github.com/ruby/gem_rbs_collection.git
37
37
  repo_dir: gems
38
38
  - name: activemodel
@@ -40,7 +40,7 @@ gems:
40
40
  source:
41
41
  type: git
42
42
  name: ruby/gem_rbs_collection
43
- revision: a4c633634493ab7ae73219022f56acff56ab69af
43
+ revision: 306d1aec19defeb177e217d8aad9812a52bcd5eb
44
44
  remote: https://github.com/ruby/gem_rbs_collection.git
45
45
  repo_dir: gems
46
46
  - name: activerecord
@@ -48,7 +48,7 @@ gems:
48
48
  source:
49
49
  type: git
50
50
  name: ruby/gem_rbs_collection
51
- revision: a4c633634493ab7ae73219022f56acff56ab69af
51
+ revision: 306d1aec19defeb177e217d8aad9812a52bcd5eb
52
52
  remote: https://github.com/ruby/gem_rbs_collection.git
53
53
  repo_dir: gems
54
54
  - name: activesupport
@@ -56,7 +56,7 @@ gems:
56
56
  source:
57
57
  type: git
58
58
  name: ruby/gem_rbs_collection
59
- revision: a4c633634493ab7ae73219022f56acff56ab69af
59
+ revision: 306d1aec19defeb177e217d8aad9812a52bcd5eb
60
60
  remote: https://github.com/ruby/gem_rbs_collection.git
61
61
  repo_dir: gems
62
62
  - name: ast
@@ -64,7 +64,7 @@ gems:
64
64
  source:
65
65
  type: git
66
66
  name: ruby/gem_rbs_collection
67
- revision: a4c633634493ab7ae73219022f56acff56ab69af
67
+ revision: 306d1aec19defeb177e217d8aad9812a52bcd5eb
68
68
  remote: https://github.com/ruby/gem_rbs_collection.git
69
69
  repo_dir: gems
70
70
  - name: base64
@@ -80,7 +80,7 @@ gems:
80
80
  source:
81
81
  type: git
82
82
  name: ruby/gem_rbs_collection
83
- revision: a4c633634493ab7ae73219022f56acff56ab69af
83
+ revision: 306d1aec19defeb177e217d8aad9812a52bcd5eb
84
84
  remote: https://github.com/ruby/gem_rbs_collection.git
85
85
  repo_dir: gems
86
86
  - name: date
@@ -92,7 +92,7 @@ gems:
92
92
  source:
93
93
  type: git
94
94
  name: ruby/gem_rbs_collection
95
- revision: a4c633634493ab7ae73219022f56acff56ab69af
95
+ revision: 306d1aec19defeb177e217d8aad9812a52bcd5eb
96
96
  remote: https://github.com/ruby/gem_rbs_collection.git
97
97
  repo_dir: gems
98
98
  - name: json
@@ -120,7 +120,7 @@ gems:
120
120
  source:
121
121
  type: git
122
122
  name: ruby/gem_rbs_collection
123
- revision: a4c633634493ab7ae73219022f56acff56ab69af
123
+ revision: 306d1aec19defeb177e217d8aad9812a52bcd5eb
124
124
  remote: https://github.com/ruby/gem_rbs_collection.git
125
125
  repo_dir: gems
126
126
  - name: optparse
@@ -132,7 +132,7 @@ gems:
132
132
  source:
133
133
  type: git
134
134
  name: ruby/gem_rbs_collection
135
- revision: a4c633634493ab7ae73219022f56acff56ab69af
135
+ revision: 306d1aec19defeb177e217d8aad9812a52bcd5eb
136
136
  remote: https://github.com/ruby/gem_rbs_collection.git
137
137
  repo_dir: gems
138
138
  - name: pathname
@@ -144,7 +144,7 @@ gems:
144
144
  source:
145
145
  type: git
146
146
  name: ruby/gem_rbs_collection
147
- revision: a4c633634493ab7ae73219022f56acff56ab69af
147
+ revision: 306d1aec19defeb177e217d8aad9812a52bcd5eb
148
148
  remote: https://github.com/ruby/gem_rbs_collection.git
149
149
  repo_dir: gems
150
150
  - name: rails-dom-testing
@@ -152,7 +152,7 @@ gems:
152
152
  source:
153
153
  type: git
154
154
  name: ruby/gem_rbs_collection
155
- revision: a4c633634493ab7ae73219022f56acff56ab69af
155
+ revision: 306d1aec19defeb177e217d8aad9812a52bcd5eb
156
156
  remote: https://github.com/ruby/gem_rbs_collection.git
157
157
  repo_dir: gems
158
158
  - name: railties
@@ -160,7 +160,7 @@ gems:
160
160
  source:
161
161
  type: git
162
162
  name: ruby/gem_rbs_collection
163
- revision: a4c633634493ab7ae73219022f56acff56ab69af
163
+ revision: 306d1aec19defeb177e217d8aad9812a52bcd5eb
164
164
  remote: https://github.com/ruby/gem_rbs_collection.git
165
165
  repo_dir: gems
166
166
  - name: rainbow
@@ -168,17 +168,13 @@ gems:
168
168
  source:
169
169
  type: git
170
170
  name: ruby/gem_rbs_collection
171
- revision: a4c633634493ab7ae73219022f56acff56ab69af
171
+ revision: 306d1aec19defeb177e217d8aad9812a52bcd5eb
172
172
  remote: https://github.com/ruby/gem_rbs_collection.git
173
173
  repo_dir: gems
174
174
  - name: rbs
175
175
  version: 3.1.3
176
176
  source:
177
177
  type: rubygems
178
- - name: rbs_rails
179
- version: 0.12.0
180
- source:
181
- type: rubygems
182
178
  - name: rdoc
183
179
  version: '0'
184
180
  source:
@@ -0,0 +1,28 @@
1
+ module RbsActiveHash
2
+ module ActiveHash
3
+ module Parser
4
+ class AssociationDefinition < RBS::AST::Members::Include
5
+ end
6
+
7
+ class ScopeDefinition < RBS::AST::Members::Include
8
+ end
9
+
10
+ class RB < RBS::Prototype::RB
11
+ end
12
+
13
+ class Parser
14
+ attr_reader has_many: Array[[Symbol, Hash[untyped, untyped]]]
15
+ attr_reader has_one: Array[[Symbol, Hash[untyped, untyped]]]
16
+ attr_reader belongs_to: Array[[Symbol, Hash[untyped, untyped]]]
17
+ attr_reader scopes: Array[[Symbol, Hash[untyped, untyped]]]
18
+
19
+ def initialize: () -> void
20
+ def parse: (String string, Array[Symbol] target) -> void
21
+ def process: (RBS::AST::Declarations::t | RBS::AST::Members::t node, Array[Symbol] target) -> void
22
+ def process_association_definition: (AssociationDefinition node) -> void
23
+ def process_scope_definition: (ScopeDefinition node) -> void
24
+ def node_to_literal: (untyped node) -> untyped
25
+ end
26
+ end
27
+ end
28
+ end
@@ -6,16 +6,19 @@ module RbsActiveHash
6
6
  class Generator
7
7
  attr_reader klass: singleton(ActiveHash::Base)
8
8
  attr_reader klass_name: String
9
+ attr_reader parser: ActiveHash::Parser::Parser
9
10
 
10
11
  def initialize: (singleton(ActiveHash::Base) klass) -> void
11
12
  def generate: () -> String
12
13
 
13
14
  private
14
15
 
16
+ def format: (String) -> String
15
17
  def klass_decl: () -> String
16
18
  def header: () -> String
17
19
  def enum_decls: () -> String?
18
20
  def constants: () -> Array[String]
21
+ def scope_decls: () -> String?
19
22
  def association_decls: () -> String?
20
23
  def has_many_decls: (Array[[Symbol, Hash[untyped, untyped]]]) -> String
21
24
  def has_one_decls: (Array[[Symbol, Hash[untyped, untyped]]]) -> String
@@ -23,7 +26,7 @@ module RbsActiveHash
23
26
  def method_decls: () -> String
24
27
  def method_names: () -> Array[Symbol]
25
28
  def method_types: () -> Hash[Symbol, untyped]
26
- def valid_field_name?: (String) -> boolish
29
+ def valid_field_name?: (String | Symbol) -> boolish
27
30
  def footer: () -> String
28
31
 
29
32
  def identify_class: (untyped value) -> (String | singleton(Class))
@@ -6,7 +6,7 @@ module RbsActiveHash
6
6
  @name: Symbol
7
7
  @signature_root_dir: Pathname
8
8
 
9
- def initialize: (Symbol name) { (RakeTask) -> void } -> void
9
+ def initialize: (?Symbol name) { (RakeTask) -> void } -> void
10
10
  def define_setup_task: () -> void
11
11
  def define_clean_task: () -> void
12
12
  def define_generate_task: () -> void
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rbs_active_hash
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.2
4
+ version: 1.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Takeshi KOMIYA
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-08-27 00:00:00.000000000 Z
11
+ date: 2023-09-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: active_hash
@@ -38,20 +38,6 @@ dependencies:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
- - !ruby/object:Gem::Dependency
42
- name: rbs_rails
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - ">="
46
- - !ruby/object:Gem::Version
47
- version: '0'
48
- type: :runtime
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - ">="
53
- - !ruby/object:Gem::Version
54
- version: '0'
55
41
  description: A RBS files generator for ActiveHash models
56
42
  email:
57
43
  - i.tkomiya@gmail.com
@@ -72,7 +58,7 @@ files:
72
58
  - lib/generators/rbs_active_hash/install_generator.rb
73
59
  - lib/rbs_active_hash.rb
74
60
  - lib/rbs_active_hash/active_hash.rb
75
- - lib/rbs_active_hash/associations.rb
61
+ - lib/rbs_active_hash/active_hash/parser.rb
76
62
  - lib/rbs_active_hash/rake_task.rb
77
63
  - lib/rbs_active_hash/version.rb
78
64
  - rbs_active_hash.gemspec
@@ -81,7 +67,7 @@ files:
81
67
  - sig/generators/rbs_active_hash/install_generator.rbs
82
68
  - sig/rbs_active_hash.rbs
83
69
  - sig/rbs_active_hash/active_hash.rbs
84
- - sig/rbs_active_hash/associations.rbs
70
+ - sig/rbs_active_hash/active_hash/parser.rbs
85
71
  - sig/rbs_active_hash/rake_task.rbs
86
72
  - sig/shims/rake.rbs
87
73
  - sig/shims/thor.rbs
@@ -1,91 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "rbs"
4
-
5
- module RbsActiveHash
6
- module Associations
7
- class AssociationDefinition < RBS::AST::Members::Include
8
- end
9
-
10
- class RB < RBS::Prototype::RB
11
- def process(node, decls:, comments:, context:)
12
- case node.type
13
- when :FCALL, :VCALL
14
- case node.children.first
15
- when :has_many, :has_one, :belongs_to
16
- decls << AssociationDefinition.new(
17
- name: RBS::TypeName.new(name: node.children.first, namespace: RBS::Namespace.root),
18
- args: node.children[1],
19
- annotations: [],
20
- location: nil,
21
- comment: nil
22
- )
23
- else
24
- super
25
- end
26
- else
27
- super
28
- end
29
- end
30
- end
31
-
32
- class Parser
33
- attr_reader :has_many, :has_one, :belongs_to
34
-
35
- def initialize
36
- @has_many = []
37
- @has_one = []
38
- @belongs_to = []
39
- end
40
-
41
- def parse(string, target)
42
- parser = RB.new
43
- parser.parse(string)
44
- parser.decls.each do |decl|
45
- process(decl, target)
46
- end
47
- end
48
-
49
- def process(node, target)
50
- case node
51
- when RBS::AST::Declarations::Module, RBS::AST::Declarations::Class
52
- name = node.name.split
53
- if target[...name.size] == name
54
- node.members.each do |member|
55
- process(member, target[name.size...].to_a)
56
- end
57
- end
58
- when AssociationDefinition
59
- process_association_definition(node) if target.empty?
60
- end
61
- end
62
-
63
- def process_association_definition(node)
64
- case node.name.name
65
- when :has_many
66
- association_id, args = node_to_literal(node.args)
67
- @has_many << [association_id, args.to_h]
68
- when :has_one
69
- association_id, args = node_to_literal(node.args)
70
- @has_one << [association_id, args.to_h]
71
- when :belongs_to
72
- association_id, args = node_to_literal(node.args)
73
- @belongs_to << [association_id, args.to_h]
74
- end
75
- end
76
-
77
- def node_to_literal(node)
78
- case node.type
79
- when :LIST
80
- node.children[...-1].map { |child| node_to_literal(child) }
81
- when :LIT, :STR
82
- node.children.first
83
- when :HASH
84
- Hash[*node_to_literal(node.children.first)]
85
- else
86
- node
87
- end
88
- end
89
- end
90
- end
91
- end
@@ -1,21 +0,0 @@
1
- module RbsActiveHash
2
- module Associations
3
- class AssociationDefinition < RBS::AST::Members::Include
4
- end
5
-
6
- class RB < RBS::Prototype::RB
7
- end
8
-
9
- class Parser
10
- attr_reader has_many: Array[[Symbol, Hash[untyped, untyped]]]
11
- attr_reader has_one: Array[[Symbol, Hash[untyped, untyped]]]
12
- attr_reader belongs_to: Array[[Symbol, Hash[untyped, untyped]]]
13
-
14
- def initialize: () -> void
15
- def parse: (String string, Array[Symbol] target) -> void
16
- def process: (RBS::AST::Declarations::t | RBS::AST::Members::t node, Array[Symbol] target) -> void
17
- def process_association_definition: (AssociationDefinition node) -> void
18
- def node_to_literal: (untyped node) -> untyped
19
- end
20
- end
21
- end