schema_doctor 0.0.2 → 0.0.3

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: 74042fa873e37695d586611d9dc2b5c54c6b293f2c0bf545769ff165cf3972e3
4
- data.tar.gz: b65964fe3c1c06ed555fdbad5c5ad78a876513605c84e4776dfcaff2f060042a
3
+ metadata.gz: 36282d15058adc20e4b9c2013bb9ddaa1d95f1e9457a10278be99a7b40c900e4
4
+ data.tar.gz: baf1eae580dedd1d8cbe4c5ca5bfef36e08849589aec89856731a9680cfc268a
5
5
  SHA512:
6
- metadata.gz: b40f4e2c85e7530fc7ec798c203f19a2b96a5ae01439c2118fcaa290dd0ce02e13ce695f02a3fda308a376be3ee2350a269b9f77eb7fa6bbb3db997a8d8972d9
7
- data.tar.gz: 13ba870f8f7f3e675b1f209fe5f07f243ebdd377f3de72774e94d65600feb23c4e3fe196e3bd047d3e753cdfc81a6da442b76b7fbbf37e1d3bdc37c839ff5713
6
+ metadata.gz: 917c1f0b805be6028f319f00698fdc153aedc38ffbf3b7ff6b780fc1d9eb4fd3fb7c0a106d4185cd32c54547279b509c869645a24ac3ca8849d2d5af6e4061a8
7
+ data.tar.gz: b309be6513ad10e6bf0563c9da4c87d1c9b17507f87d1a670527cc6c73f0f1b41ce0dab22a5b5b395fa3a196df991f96415078c33aaad3677e1163c87a6bb5ec
@@ -32,11 +32,13 @@ module SchemaDoctor
32
32
  table_comment: connection.table_comment(model.table_name),
33
33
  extra_comment: schema.dig(model.name, :extra_comment),
34
34
  columns: columns(model, schema.dig(model.name, :columns) || {}),
35
- indexes: indexes(model)
35
+ indexes: indexes(model),
36
+ associations: associations(model)
36
37
  }
37
38
  rescue ActiveRecord::TableNotSpecified
38
39
  nil
39
40
  rescue => e
41
+ # Skip analyzing if an error occurs
40
42
  puts "Failed to process #{model.name}: #{e.inspect}"
41
43
  puts "\e[31mWe're sorry, Failed to process \e[33m#{model.name}\e[31m:\n #{e.inspect}\e[0m"
42
44
  end
@@ -86,5 +88,38 @@ module SchemaDoctor
86
88
  }
87
89
  end
88
90
  end
91
+
92
+ def associations(model)
93
+ result = {
94
+ belongs: {},
95
+ has: {}
96
+ }
97
+
98
+ model.reflect_on_all_associations.each do |association|
99
+ case association.macro.to_s
100
+ when /\Abelongs_to/
101
+ result[:belongs][association.name] = {
102
+ macro: association.macro.to_s,
103
+ name: association.name,
104
+ class_name: association.class_name,
105
+ foreign_key: association.foreign_key,
106
+ options: association.options,
107
+ polymorphic: association.polymorphic?
108
+ }
109
+ when /\Ahas/
110
+ result[:has][association.name] = {
111
+ macro: association.macro.to_s,
112
+ name: association.name,
113
+ class_name: association.class_name,
114
+ options: association.options
115
+ }
116
+ else
117
+ puts "Unknown association type: #{association.macro}: :#{association.name}"
118
+ next
119
+ end
120
+ end
121
+
122
+ result
123
+ end
89
124
  end
90
125
  end
@@ -23,6 +23,8 @@ module SchemaDoctor
23
23
  :toclevels: 1
24
24
  :toc-title: Table of Contents
25
25
  :linkattrs:
26
+ :sectlinks:
27
+ :sectanchors:
26
28
 
27
29
  TEXT
28
30
 
@@ -85,6 +87,71 @@ module SchemaDoctor
85
87
 
86
88
  TEXT
87
89
  end
90
+
91
+ # Output associations schema
92
+ f.puts <<~TEXT
93
+
94
+ === Associations
95
+ TEXT
96
+ belongs = model[:associations][:belongs]
97
+ if belongs.present?
98
+ f.puts <<~TEXT
99
+ [cols="1,1,1,1"]
100
+ |===
101
+ |macro|name|foreign_key|options
102
+
103
+ TEXT
104
+
105
+ belongs.each_value do |association|
106
+ class_name = association.delete(:class_name).to_s
107
+ polymorphic = association.delete(:polymorphic)
108
+ # TODO: polymorphicのリンク先を特定できるようにする。今のところリンクを生成しないように。
109
+ association[:name] = "link:#_#{class_name.downcase.gsub("::", "")}[#{association[:name]}]" unless polymorphic
110
+
111
+ str = association.values.map do |v|
112
+ escaped = v.to_s.gsub("|", "{vbar}")
113
+ "|#{escaped}\n"
114
+ end.join
115
+
116
+ f.puts <<~TEXT
117
+ #{str}
118
+ TEXT
119
+ end
120
+
121
+ f.puts "|==="
122
+ end
123
+
124
+ has = model[:associations][:has]
125
+ if has.present?
126
+ f.puts <<~TEXT
127
+ [cols="1,1,1"]
128
+ |===
129
+ |macro|name|options
130
+
131
+ TEXT
132
+
133
+ has.each_value do |association|
134
+ class_name = association.delete(:class_name).to_s
135
+ association[:name] = "link:#_#{class_name.gsub("::", "").downcase}[#{association[:name]}]"
136
+ str = association.values.map do |v|
137
+ escaped = v.to_s.gsub("|", "{vbar}")
138
+ "|#{escaped}\n"
139
+ end.join
140
+
141
+ f.puts <<~TEXT
142
+ #{str}
143
+ TEXT
144
+ end
145
+
146
+ f.puts "|==="
147
+ end
148
+
149
+ if belongs.empty? & has.empty?
150
+ f.puts <<~TEXT
151
+ None
152
+
153
+ TEXT
154
+ end
88
155
  end
89
156
  end
90
157
  puts "Done! => #{adoc_path}"
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SchemaDoctor
4
- VERSION = "0.0.2"
4
+ VERSION = "0.0.3"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: schema_doctor
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - lni_T
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-07-18 00:00:00.000000000 Z
11
+ date: 2024-08-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord