rbs_active_hash 0.1.1 → 1.0.1

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: '08c6d368bbd5d2a88c358679a5fe2d4e0e6330602cad2a593d38d0b66174356f'
4
- data.tar.gz: e18518e269dcad30a34795519bb745206eee48083d6bc3d7d3c35326d7946f76
3
+ metadata.gz: 57044cf3bbe008c0523f22f062fb7936a43ddce6a03e17f04e02daef661c092d
4
+ data.tar.gz: b6533e6014fcef654e87d2187e381dced145f2f4828567e0e226b241d7258233
5
5
  SHA512:
6
- metadata.gz: c380fd3d043cadebb606d6e2acfe47399c49d663392bba6fcd2f2c1b58277363039f7449fa848deb299bfca35b104a62ab4318b7114e863810e38518ed6bdef5
7
- data.tar.gz: 722aabe39f2f61c67562476aa6dd4af2a3acb908797ab1a8edc1913b6f8234761aaa23475c1a77e7395c7f03b01256a592892200a6c8c994c0bc895ddee71113
6
+ metadata.gz: ba76fab12f70ac6cb4bae32d6861657f4932f5e7509a2b33e273d6bd7ed954eab626af709fcc91780c6f68caad7de36c05796f4aa2cb17befd7708200a99ef79
7
+ data.tar.gz: ac00937fc78c4fd2e098ab1154aedf79a1626ab48e810ee543143087a4d83424b5547708c7b9edf7fcf5431f5d9e8e2eea54a17562e01a961fab0e1a5196908e
data/.rubocop.yml CHANGED
@@ -18,3 +18,12 @@ Layout/LineLength:
18
18
  Metrics/BlockLength:
19
19
  Exclude:
20
20
  - spec/**/*_spec.rb
21
+
22
+ Metrics/ClassLength:
23
+ Max: 200
24
+
25
+ Metrics/MethodLength:
26
+ Max: 20
27
+
28
+ Metrics/PerceivedComplexity:
29
+ Max: 10
@@ -2,6 +2,7 @@
2
2
  "recommendations": [
3
3
  "shopify.ruby-lsp",
4
4
  "soutaro.steep-vscode",
5
- "tk0miya.rspec-daemon"
5
+ "tk0miya.rspec-daemon",
6
+ "tk0miya.rbs-helper"
6
7
  ]
7
8
  }
@@ -1,5 +1,6 @@
1
1
  {
2
2
  "[ruby]": {
3
3
  "editor.defaultFormatter": "Shopify.ruby-lsp"
4
- }
4
+ },
5
+ "rbs-helper.signature-directory": "sig"
5
6
  }
data/Gemfile CHANGED
@@ -7,7 +7,7 @@ gemspec
7
7
 
8
8
  gem "rake", "~> 13.0"
9
9
 
10
- gem "rubocop", "~> 1.21"
10
+ gem "rubocop", "~> 1.52"
11
11
 
12
12
  group :development do
13
13
  gem "rspec", require: false
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- rbs_active_hash (0.1.1)
4
+ rbs_active_hash (1.0.1)
5
5
  active_hash
6
6
  rbs_rails
7
7
 
@@ -61,8 +61,9 @@ GEM
61
61
  nokogiri (1.15.2-x86_64-linux)
62
62
  racc (~> 1.4)
63
63
  parallel (1.23.0)
64
- parser (3.2.2.1)
64
+ parser (3.2.2.3)
65
65
  ast (~> 2.4.1)
66
+ racc
66
67
  pry (0.14.2)
67
68
  coderay (~> 1.1)
68
69
  method_source (~> 1.0)
@@ -92,7 +93,7 @@ GEM
92
93
  rbs_rails (0.12.0)
93
94
  parser
94
95
  rbs (>= 1)
95
- regexp_parser (2.8.0)
96
+ regexp_parser (2.8.1)
96
97
  rexml (3.2.5)
97
98
  rspec (3.12.0)
98
99
  rspec-core (~> 3.12.0)
@@ -110,10 +111,10 @@ GEM
110
111
  diff-lcs (>= 1.2.0, < 2.0)
111
112
  rspec-support (~> 3.12.0)
112
113
  rspec-support (3.12.0)
113
- rubocop (1.52.0)
114
+ rubocop (1.52.1)
114
115
  json (~> 2.3)
115
116
  parallel (~> 1.10)
116
- parser (>= 3.2.0.0)
117
+ parser (>= 3.2.2.3)
117
118
  rainbow (>= 2.2.2, < 4.0)
118
119
  regexp_parser (>= 1.8, < 3.0)
119
120
  rexml (>= 3.2.5, < 4.0)
@@ -159,7 +160,7 @@ DEPENDENCIES
159
160
  rbs_active_hash!
160
161
  rspec
161
162
  rspec-daemon
162
- rubocop (~> 1.21)
163
+ rubocop (~> 1.52)
163
164
  steep
164
165
 
165
166
  BUNDLED WITH
@@ -15,8 +15,11 @@ module RbsActiveHash
15
15
  end
16
16
 
17
17
  class Generator
18
+ attr_reader :klass, :klass_name
19
+
18
20
  def initialize(klass)
19
21
  @klass = klass
22
+ @klass_name = RbsRails::Util.module_name(klass)
20
23
  end
21
24
 
22
25
  def generate
@@ -43,12 +46,23 @@ module RbsActiveHash
43
46
  end
44
47
 
45
48
  def header
46
- module_defs = module_names.map { |module_name| "module #{module_name}" }
47
-
48
- class_name = klass.name.split("::").last
49
- class_def = "class #{class_name} < ::#{klass.superclass}"
50
-
51
- (module_defs + [class_def]).join("\n")
49
+ namespace = +""
50
+ klass_name.split("::").map do |mod_name|
51
+ namespace += "::#{mod_name}"
52
+ mod_object = Object.const_get(namespace)
53
+ case mod_object
54
+ when Class
55
+ # @type var superclass: Class
56
+ superclass = _ = mod_object.superclass
57
+ superclass_name = RbsRails::Util.module_name(superclass)
58
+
59
+ "class #{mod_name} < ::#{superclass_name}"
60
+ when Module
61
+ "module #{mod_name}"
62
+ else
63
+ raise "unreachable"
64
+ end
65
+ end.join("\n")
52
66
  end
53
67
 
54
68
  def module_names
@@ -85,12 +99,13 @@ module RbsActiveHash
85
99
 
86
100
  def method_decls
87
101
  method_names.map do |method|
102
+ method_type = stringify_type(method_types.fetch(method, "untyped"))
88
103
  <<~RBS
89
- def #{method}: () -> untyped
90
- def #{method}=: (untyped value) -> void
104
+ def #{method}: () -> #{method_type}
105
+ def #{method}=: (#{method_type} value) -> void
91
106
  def #{method}?: () -> bool
92
- def self.find_by_#{method}: (untyped value) -> self?
93
- def self.find_all_by_#{method}: (untyped value) -> Array[self]
107
+ def self.find_by_#{method}: (#{method_type} value) -> self?
108
+ def self.find_all_by_#{method}: (#{method_type} value) -> Array[self]
94
109
  RBS
95
110
  end.join("\n")
96
111
  end
@@ -102,6 +117,16 @@ module RbsActiveHash
102
117
  method_names.uniq.select { |k| k != :id && valid_field_name?(k) }
103
118
  end
104
119
 
120
+ def method_types
121
+ method_types = Hash.new { |hash, key| hash[key] = [] }
122
+ (klass.data || []).each do |record|
123
+ record.symbolize_keys.each do |key, value|
124
+ method_types[key] << value.class
125
+ end
126
+ end
127
+ method_types.transform_values(&:uniq)
128
+ end
129
+
105
130
  def valid_field_name?(name)
106
131
  name.to_s =~ /^[a-zA-Z_][a-zA-Z0-9_]*$/
107
132
  end
@@ -110,7 +135,24 @@ module RbsActiveHash
110
135
  "end\n" * klass.module_parents.size
111
136
  end
112
137
 
113
- attr_reader :klass
138
+ def stringify_type(type)
139
+ if [TrueClass, FalseClass].include?(type)
140
+ "bool"
141
+ elsif type == NilClass
142
+ "nil"
143
+ elsif type.is_a? Class
144
+ type.name
145
+ elsif type.is_a? Array
146
+ types = type.map { |t| stringify_type(t) }.uniq.sort
147
+ if types.delete("nil")
148
+ "(#{types.join(" | ")})?"
149
+ else
150
+ "(#{types.join(" | ")})"
151
+ end
152
+ else
153
+ type.to_s
154
+ end
155
+ end
114
156
  end
115
157
  end
116
158
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RbsActiveHash
4
- VERSION = "0.1.1"
4
+ VERSION = "1.0.1"
5
5
  end
@@ -4,7 +4,8 @@ module RbsActiveHash
4
4
  def self.class_to_rbs: (Class klass) -> String
5
5
 
6
6
  class Generator
7
- @klass: Class
7
+ attr_reader klass: Class
8
+ attr_reader klass_name: String
8
9
 
9
10
  def initialize: (Class class) -> void
10
11
  def generate: () -> String
@@ -16,11 +17,12 @@ module RbsActiveHash
16
17
  def enum_decls: () -> String?
17
18
  def constants: () -> Array[String]
18
19
  def method_decls: () -> String
19
- def method_names: () -> Array[String]
20
+ def method_names: () -> Array[Symbol]
21
+ def method_types: () -> Hash[Symbol, untyped]
20
22
  def valid_field_name?: (String) -> boolish
21
23
  def footer: () -> String
22
24
 
23
- attr_reader klass: Class
25
+ def stringify_type: (untyped type) -> String
24
26
  end
25
27
  end
26
28
  end
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: 0.1.1
4
+ version: 1.0.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-06-11 00:00:00.000000000 Z
11
+ date: 2023-06-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: active_hash