rbs_rails 0.12.1 → 0.13.0

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.
Files changed (42) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +1 -1
  3. data/.github/workflows/release.yml +27 -0
  4. data/CHANGELOG.md +56 -0
  5. data/Gemfile +7 -1
  6. data/Gemfile.lock +111 -93
  7. data/README.md +46 -1
  8. data/Rakefile +7 -2
  9. data/example/rbs_rails.rb +27 -0
  10. data/exe/rbs_rails +6 -0
  11. data/lib/generators/rbs_rails/install_generator.rb +1 -10
  12. data/lib/rbs_rails/active_record/enum.rb +81 -0
  13. data/lib/rbs_rails/active_record.rb +233 -143
  14. data/lib/rbs_rails/cli/configuration.rb +66 -0
  15. data/lib/rbs_rails/cli.rb +173 -0
  16. data/lib/rbs_rails/dependency_builder.rb +25 -8
  17. data/lib/rbs_rails/path_helpers.rb +14 -2
  18. data/lib/rbs_rails/rake_task.rb +38 -40
  19. data/lib/rbs_rails/util/file_writer.rb +22 -0
  20. data/lib/rbs_rails/util.rb +11 -4
  21. data/lib/rbs_rails/version.rb +1 -1
  22. data/lib/rbs_rails.rb +5 -2
  23. data/rbs_collection.lock.yaml +86 -38
  24. data/rbs_collection.yaml +1 -16
  25. data/rbs_rails.gemspec +1 -0
  26. data/sig/{install_generator.rbs → generators/rbs_rails/install_generator.rbs} +2 -0
  27. data/sig/rbs_rails/active_record/enum.rbs +26 -0
  28. data/sig/rbs_rails/active_record.rbs +67 -49
  29. data/sig/rbs_rails/cli/configuration.rbs +37 -0
  30. data/sig/rbs_rails/cli.rbs +35 -0
  31. data/sig/rbs_rails/dependency_builder.rbs +7 -3
  32. data/sig/rbs_rails/path_helpers.rbs +13 -6
  33. data/sig/rbs_rails/rake_task.rbs +7 -6
  34. data/sig/rbs_rails/util/file_writer.rbs +16 -0
  35. data/sig/rbs_rails/util.rbs +7 -2
  36. data/sig/rbs_rails/utils/file_writer.rbs +4 -0
  37. data/sig/rbs_rails/version.rbs +5 -1
  38. data/sig/rbs_rails.rbs +6 -3
  39. metadata +32 -8
  40. data/sig/_internal/activerecord.rbs +0 -4
  41. data/sig/parser.rbs +0 -14
  42. data/sig/rake.rbs +0 -6
@@ -0,0 +1,81 @@
1
+ require 'active_support/lazy_load_hooks'
2
+
3
+ module RbsRails
4
+ module ActiveRecord
5
+ module Enum
6
+ IGNORED_ENUM_KEYS = %i[prefix suffix default scopes]
7
+
8
+ # @rbs!
9
+ # type definitions = Hash[Symbol, Array[Symbol] | Hash[Symbol, untyped]]
10
+ # type options = Hash[Symbol, untyped]
11
+ # type enum_definitions = Array[[definitions, options]]
12
+ #
13
+ # @enum_definitions: enum_definitions
14
+
15
+ def enum(*args, **options) #: void
16
+ super # steep:ignore
17
+
18
+ name, values = args #: [Symbol, Array[Symbol]?]
19
+ if values
20
+ # Enum definitions are passed via array argument
21
+ # ex. enum :status, [:temporary, :accepted]
22
+ definitions = { name => values }
23
+ else
24
+ # Enum definitions are passed via keyword arguments
25
+ # ex. enum :status, temporary: 1, accepted: 2
26
+ values = options.slice!(*IGNORED_ENUM_KEYS)
27
+ definitions = { name => values }
28
+ end
29
+
30
+ @enum_definitions ||= [] #: enum_definitions
31
+ @enum_definitions&.append([definitions, options])
32
+ end
33
+
34
+ def enum_definitions #: Array[[Symbol, String]]
35
+ @enum_definitions&.flat_map do |(definitions, options)|
36
+ definitions.flat_map do |name, values|
37
+ labels = case values
38
+ when Array
39
+ values
40
+ when Hash
41
+ values.keys
42
+ end
43
+ labels.map do |label|
44
+ [name, enum_method_name(name, label, options)] #: [Symbol, String]
45
+ end
46
+ end
47
+ end.to_a
48
+ end
49
+
50
+ # @rbs name: Symbol
51
+ # @rbs label: Symbol
52
+ # @rbs options: Hash[Symbol, untyped]
53
+ private def enum_method_name(name, label, options) #: String
54
+ enum_prefix = options[:_prefix] || options[:prefix]
55
+ enum_suffix = options[:_suffix] || options[:suffix]
56
+
57
+ if enum_prefix == true
58
+ prefix = "#{name}_"
59
+ elsif enum_prefix
60
+ prefix = "#{enum_prefix}_"
61
+ end
62
+ if enum_suffix == true
63
+ suffix = "_#{name}"
64
+ elsif enum_suffix
65
+ suffix = "_#{enum_suffix}"
66
+ end
67
+
68
+ enum_method_name = "#{prefix}#{label}#{suffix}"
69
+
70
+ # Make enum_method_name friendly
71
+ # refs: https://github.com/rails/rails/blob/v8.0.0/activerecord/lib/active_record/enum.rb#L270
72
+ enum_method_name.gsub(/[\W&&[:ascii:]]+/, "_")
73
+ end
74
+ end
75
+ end
76
+ end
77
+
78
+ ActiveSupport.on_load(:active_record) do
79
+ # @type self: singleton(ActiveRecord::Base)
80
+ extend RbsRails::ActiveRecord::Enum
81
+ end