modaldiagrams 1.0.1 → 1.1.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.
- data/VERSION +1 -1
- data/lib/modaldiagrams/modaldiagrams.rb +76 -18
- data/lib/modaldiagrams/parameters.rb +2 -0
- data/lib/tasks/diagrams_clean.rake +11 -0
- data/modaldiagrams.gemspec +3 -2
- metadata +4 -3
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.0
|
1
|
+
1.1.0
|
@@ -1,6 +1,9 @@
|
|
1
1
|
# ActiveRecord DB Diagrams
|
2
2
|
# Configuration parameters can be changed by writing a file named config/modal_diagrams.yml
|
3
3
|
|
4
|
+
require 'modalsettings'
|
5
|
+
require 'modalsupport'
|
6
|
+
|
4
7
|
module ModalDiagrams
|
5
8
|
|
6
9
|
# Field type abbreviations
|
@@ -43,7 +46,13 @@ module ModalDiagrams
|
|
43
46
|
cluster_classes = {} # assoc cluster name to array of class names
|
44
47
|
relation_classes = [] # each element is the 2-element array of class names of the corresponding relation in relations
|
45
48
|
|
46
|
-
|
49
|
+
model_selection_options = {
|
50
|
+
:all_models => cfg.include_all_models,
|
51
|
+
:dynamic_models => cfg.include_dynamic_models,
|
52
|
+
:include_files => false
|
53
|
+
}
|
54
|
+
|
55
|
+
models = dbmodels(model_selection_options.merge(:exclude_sti_models => true))
|
47
56
|
|
48
57
|
models.each do |cls|
|
49
58
|
if cls.respond_to?(:reflect_on_all_associations) && ActiveRecord::Base.connection.table_exists?(cls.table_name)
|
@@ -144,6 +153,7 @@ module ModalDiagrams
|
|
144
153
|
end
|
145
154
|
|
146
155
|
if cfg.show_sti
|
156
|
+
sti_classes = dbmodels(model_selection_options.merge(:exclude_non_sti_models => true))
|
147
157
|
sti_classes.each do |sti_class|
|
148
158
|
cls = sti_class.base_class
|
149
159
|
if cls.respond_to?(:cluster)
|
@@ -202,26 +212,74 @@ module ModalDiagrams
|
|
202
212
|
|
203
213
|
private
|
204
214
|
|
205
|
-
#
|
206
|
-
#
|
207
|
-
#
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
215
|
+
# Return the database models
|
216
|
+
# Options:
|
217
|
+
# :all_models # Return also models in plugins, not only in the app (app/models)
|
218
|
+
# :dynamic_models # Return dynamically defined models too (not defined in a model file)
|
219
|
+
# :exclude_sti_models # Exclude derived (STI) models
|
220
|
+
# :exclude_non_sti_models # Exclude top level models
|
221
|
+
# :include_files # Return also the model definition file pathnames (return pairs of [model, file])
|
222
|
+
# :only_app_files # But return nil for files not in the app proper
|
223
|
+
# :only_app_tree_files # But return nil for files not in the app directory tree (app, vendor...)
|
224
|
+
def dbmodels(options={})
|
225
|
+
|
226
|
+
models_dir = 'app/models'
|
227
|
+
if Rails.respond_to?(:application)
|
228
|
+
models_dir = Rails.application.paths[models_dir]
|
229
|
+
end
|
230
|
+
models_dir = Rails.root.join(models_dir)
|
231
|
+
|
232
|
+
if options[:all_models]
|
233
|
+
# Include also models from plugins
|
234
|
+
model_dirs = $:.grep(/\/models\/?\Z/)
|
235
|
+
else
|
236
|
+
# Only main application models
|
237
|
+
model_dirs = [models_dir]
|
238
|
+
end
|
239
|
+
|
240
|
+
models = []
|
241
|
+
files = {}
|
242
|
+
model_dirs.each do |base|
|
243
|
+
Dir.glob(File.join(base,"**/*.rb")).each do |fn|
|
244
|
+
model = File.basename(fn).chomp(".rb").camelize.constantize
|
245
|
+
models << model
|
246
|
+
files[model.to_s] = fn
|
247
|
+
end
|
248
|
+
end
|
249
|
+
models = models.sort_by{|m| m.to_s}
|
250
|
+
|
251
|
+
if options[:dynamic_models]
|
252
|
+
# Now add dynamically generated models (not having dedicated files)
|
253
|
+
# note that subclasses of these models are not added here
|
254
|
+
models += ActiveRecord::Base.send(:subclasses)
|
255
|
+
models = models.uniq
|
256
|
+
end
|
257
|
+
|
258
|
+
models = models.uniq.reject{|model| !has_table?(model)}
|
259
|
+
|
260
|
+
non_sti_models, sti_models = models.partition{|model| model.base_class==model}
|
216
261
|
|
217
|
-
|
218
|
-
models
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
262
|
+
models = []
|
263
|
+
models += non_sti_models unless options[:exclude_non_sti_models]
|
264
|
+
models += sti_models unless options[:exclude_sti_models]
|
265
|
+
if options[:include_files]
|
266
|
+
models = models.map{|model| [model, files[model.to_s]]}
|
267
|
+
if options[:only_app_files] || options[:only_app_tree_files]
|
268
|
+
if options[:only_app_files]
|
269
|
+
suffix = models_dir.to_s
|
270
|
+
else
|
271
|
+
suffix = Rails.root.to_s
|
272
|
+
end
|
273
|
+
suffix += '/' unless suffix.ends_with?('/')
|
274
|
+
models = models.map{|model, file| [model, file && (file.starts_with?(suffix) ? file : nil)]}
|
275
|
+
end
|
276
|
+
end
|
277
|
+
models
|
223
278
|
end
|
224
279
|
|
280
|
+
def has_table?(cls)
|
281
|
+
(cls != ActiveRecord::Base) && cls.respond_to?(:table_name) && cls.table_name.present?
|
282
|
+
end
|
225
283
|
def assoc_foreign_key(assoc)
|
226
284
|
# Up to ActiveRecord 3.1 we had primary_key_name in AssociationReflection; not it is foreign_key
|
227
285
|
assoc.respond_to?(:primary_key_name) ? assoc.primary_key_name : assoc.foreign_key
|
@@ -3,6 +3,8 @@ module ModalDiagrams
|
|
3
3
|
def self.parameters
|
4
4
|
@settings ||= Settings[
|
5
5
|
# Default values
|
6
|
+
:include_all_models => false, # include models defined in plugins
|
7
|
+
:include_dynamic_models => false, # include models defined dynamically (not in model files)
|
6
8
|
:max_attributes => 24, # maximum number of attributes shown in a class (table)
|
7
9
|
:clusters_not_shown_on_main_diagram => [], # clusters not shown in the main diagram
|
8
10
|
:show_external => true, # show associations to classes from other clusters in cluster diagrams
|
data/modaldiagrams.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "modaldiagrams"
|
8
|
-
s.version = "1.0
|
8
|
+
s.version = "1.1.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Javier Goizueta"]
|
12
|
-
s.date = "2012-09-
|
12
|
+
s.date = "2012-09-06"
|
13
13
|
s.description = "modaldiagrams provides Rake tasks for diagramming ActiveRecord databases. It generates Graphviz dot files."
|
14
14
|
s.email = "jgoizueta@gmail.com"
|
15
15
|
s.extra_rdoc_files = [
|
@@ -31,6 +31,7 @@ Gem::Specification.new do |s|
|
|
31
31
|
"lib/modaldiagrams/tasks.rb",
|
32
32
|
"lib/tasks.rb",
|
33
33
|
"lib/tasks/diagrams.rake",
|
34
|
+
"lib/tasks/diagrams_clean.rake",
|
34
35
|
"lib/tasks/diagrams_pdf.rake",
|
35
36
|
"lib/tasks/diagrams_png.rake",
|
36
37
|
"lib/tasks/diagrams_ps.rake",
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: modaldiagrams
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.1.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-09-
|
12
|
+
date: 2012-09-06 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: modalsettings
|
@@ -146,6 +146,7 @@ files:
|
|
146
146
|
- lib/modaldiagrams/tasks.rb
|
147
147
|
- lib/tasks.rb
|
148
148
|
- lib/tasks/diagrams.rake
|
149
|
+
- lib/tasks/diagrams_clean.rake
|
149
150
|
- lib/tasks/diagrams_pdf.rake
|
150
151
|
- lib/tasks/diagrams_png.rake
|
151
152
|
- lib/tasks/diagrams_ps.rake
|
@@ -165,7 +166,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
165
166
|
version: '0'
|
166
167
|
segments:
|
167
168
|
- 0
|
168
|
-
hash: -
|
169
|
+
hash: -996022215717107908
|
169
170
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
170
171
|
none: false
|
171
172
|
requirements:
|