modalfields 1.2.2 → 1.3.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/Gemfile +3 -0
- data/Gemfile.lock +4 -0
- data/VERSION +1 -1
- data/lib/modalfields/modalfields.rb +92 -16
- data/modalfields.gemspec +5 -2
- data/test/helper.rb +1 -1
- metadata +19 -3
data/Gemfile
CHANGED
@@ -1,8 +1,11 @@
|
|
1
1
|
source "http://rubygems.org"
|
2
|
+
|
3
|
+
gem 'modalsettings'
|
2
4
|
gem "activesupport", ">= 2.3.5"
|
3
5
|
gem "activerecord", ">= 2.3.5"
|
4
6
|
# gem "rails", ">= 2.3.5"
|
5
7
|
|
8
|
+
|
6
9
|
# Add dependencies to develop your gem here.
|
7
10
|
# Include everything needed to run rake, tests, features, etc.
|
8
11
|
group :development do
|
data/Gemfile.lock
CHANGED
@@ -21,6 +21,9 @@ GEM
|
|
21
21
|
rake
|
22
22
|
rdoc
|
23
23
|
json (1.6.6)
|
24
|
+
modalsettings (1.0.0)
|
25
|
+
modalsupport (>= 0.8.1)
|
26
|
+
modalsupport (0.9.2)
|
24
27
|
pg (0.10.1)
|
25
28
|
rake (0.9.2.2)
|
26
29
|
rdoc (3.12)
|
@@ -37,6 +40,7 @@ DEPENDENCIES
|
|
37
40
|
activesupport (>= 2.3.5)
|
38
41
|
bundler (~> 1)
|
39
42
|
jeweler (~> 1.8.3)
|
43
|
+
modalsettings
|
40
44
|
pg
|
41
45
|
rdoc (~> 3.12)
|
42
46
|
shoulda
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.
|
1
|
+
1.3.0
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'modalsettings'
|
2
|
+
|
1
3
|
# This is a hybrid between HoboFields and model annotators.
|
2
4
|
#
|
3
5
|
# It works like other annotators, by updating the model annotations from the DB schema.
|
@@ -63,7 +65,6 @@ module ModalFields
|
|
63
65
|
|
64
66
|
end
|
65
67
|
|
66
|
-
|
67
68
|
class DefinitionsDsl < DslBase
|
68
69
|
def field(name, attributes={})
|
69
70
|
ModalFields.definitions[name.to_sym] = COMMON_ATTRIBUTES.merge(attributes)
|
@@ -141,8 +142,14 @@ module ModalFields
|
|
141
142
|
@definitions = {}
|
142
143
|
@column_to_field_declaration_hook = nil
|
143
144
|
@type_aliases = {}
|
145
|
+
@parameters = Settings[
|
146
|
+
:check_all_models => false, # consider all models (including those defined in plugins) for migration & check
|
147
|
+
:check_dynamic_models => false, # consider models that may have been defined dynamically not in model files
|
148
|
+
:update_vendor_models => false # update also model files in vendor
|
149
|
+
]
|
144
150
|
|
145
151
|
class <<self
|
152
|
+
|
146
153
|
attr_reader :hooks, :definitions
|
147
154
|
# Define declaration of primary keys
|
148
155
|
# ModalFields.show_primary_keys = false # the default: do not show primary keys
|
@@ -151,6 +158,11 @@ module ModalFields
|
|
151
158
|
# ModalFields.show_primary_keys = :except_id # only declare if named differently from 'id'
|
152
159
|
attr_accessor :show_primary_keys
|
153
160
|
|
161
|
+
def parameters(params=nil)
|
162
|
+
@parameters.merge! params if params
|
163
|
+
@parameters
|
164
|
+
end
|
165
|
+
|
154
166
|
# Run a definition block that executes field type definitions
|
155
167
|
def define(&blk)
|
156
168
|
DefinitionsDsl.new.instance_eval(&blk)
|
@@ -186,7 +198,7 @@ module ModalFields
|
|
186
198
|
# It is recommended to run this on a clearn working directory (no uncommitted changes), so that the
|
187
199
|
# changes can be easily reviewed.
|
188
200
|
def update(modify=true)
|
189
|
-
dbmodels.each do |model, file|
|
201
|
+
dbmodels(dbmodel_options).each do |model, file|
|
190
202
|
next if file.nil?
|
191
203
|
new_fields, modified_fields, deleted_fields, deleted_model = diff(model)
|
192
204
|
unless new_fields.empty? && modified_fields.empty? && deleted_fields.empty?
|
@@ -221,7 +233,7 @@ module ModalFields
|
|
221
233
|
end
|
222
234
|
|
223
235
|
def check
|
224
|
-
dbmodels.each do |model, file|
|
236
|
+
dbmodels(dbmodel_options).each do |model, file|
|
225
237
|
new_fields, modified_fields, deleted_fields, deleted_model = diff(model)
|
226
238
|
unless new_fields.empty? && modified_fields.empty? && deleted_fields.empty?
|
227
239
|
rel_file = file && file.sub(/\A#{Rails.root}/,'')
|
@@ -239,7 +251,7 @@ module ModalFields
|
|
239
251
|
def migration
|
240
252
|
up = ""
|
241
253
|
down = ""
|
242
|
-
dbmodels.each do |model, file|
|
254
|
+
dbmodels(dbmodel_options).each do |model, file|
|
243
255
|
new_fields, modified_fields, deleted_fields, deleted_model = diff(model)
|
244
256
|
unless new_fields.empty? && modified_fields.empty? && deleted_fields.empty?
|
245
257
|
up << "\n"
|
@@ -311,20 +323,84 @@ module ModalFields
|
|
311
323
|
|
312
324
|
private
|
313
325
|
|
314
|
-
#
|
315
|
-
#
|
316
|
-
#
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
326
|
+
# Return the database models
|
327
|
+
# Options:
|
328
|
+
# :all_models # Return also models in plugins, not only in the app (app/models)
|
329
|
+
# :dynamic_models # Return dynamically defined models too (not defined in a model file)
|
330
|
+
# :exclude_sti_models # Exclude derived (STI) models
|
331
|
+
# :exclude_non_sti_models # Exclude top level models
|
332
|
+
# :include_files # Return also the model definition file pathnames (return pairs of [model, file])
|
333
|
+
# :only_app_files # But return nil for files not in the app proper
|
334
|
+
# :only_app_tree_files # But return nil for files not in the app directory tree (app, vendor...)
|
335
|
+
def dbmodels(options={})
|
336
|
+
|
337
|
+
models_dir = 'app/models'
|
338
|
+
if Rails.respond_to?(:application)
|
339
|
+
models_dir = Rails.application.paths[models_dir]
|
340
|
+
end
|
341
|
+
models_dir = Rails.root.join(models_dir)
|
342
|
+
|
343
|
+
if options[:all_models]
|
344
|
+
# Include also models from plugins
|
345
|
+
model_dirs = $:.grep(/\/models\/?\Z/)
|
346
|
+
else
|
347
|
+
# Only main application models
|
348
|
+
model_dirs = [models_dir]
|
349
|
+
end
|
350
|
+
|
351
|
+
models = []
|
352
|
+
files = {}
|
353
|
+
model_dirs.each do |base|
|
354
|
+
Dir.glob(File.join(base,"**/*.rb")).each do |fn|
|
355
|
+
model = File.basename(fn).chomp(".rb").camelize.constantize
|
356
|
+
models << model
|
357
|
+
files[model.to_s] = fn
|
358
|
+
end
|
359
|
+
end
|
360
|
+
models = models.sort_by{|m| m.to_s}
|
361
|
+
|
362
|
+
if options[:dynamic_models]
|
363
|
+
# Now add dynamically generated models (not having dedicated files)
|
364
|
+
# note that subclasses of these models are not added here
|
365
|
+
models += ActiveRecord::Base.send(:subclasses)
|
366
|
+
models = models.uniq
|
367
|
+
end
|
368
|
+
|
369
|
+
models = models.uniq.reject{|model| !has_table?(model)}
|
370
|
+
|
371
|
+
non_sti_models, sti_models = models.partition{|model| model.base_class==model}
|
372
|
+
|
373
|
+
models = []
|
374
|
+
models += non_sti_models unless options[:exclude_non_sti_models]
|
375
|
+
models += sti_models unless options[:exclude_sti_models]
|
376
|
+
if options[:include_files]
|
377
|
+
models = models.map{|model| [model, files[model.to_s]]}
|
378
|
+
if options[:only_app_files] || options[:only_app_tree_files]
|
379
|
+
if options[:only_app_files]
|
380
|
+
suffix = models_dir.to_s
|
381
|
+
else
|
382
|
+
suffix = Rails.root.to_s
|
383
|
+
end
|
384
|
+
suffix += '/' unless suffix.ends_with?('/')
|
385
|
+
models = models.map{|model, file| [model, file && (file.starts_with?(suffix) ? file : nil)]}
|
386
|
+
end
|
387
|
+
end
|
388
|
+
models
|
389
|
+
end
|
390
|
+
|
391
|
+
def has_table?(cls)
|
392
|
+
(cls != ActiveRecord::Base) && cls.respond_to?(:table_name) && cls.table_name.present?
|
324
393
|
end
|
325
394
|
|
326
|
-
def
|
327
|
-
|
395
|
+
def dbmodel_options
|
396
|
+
{
|
397
|
+
:all_models=>parameters.check_all_models,
|
398
|
+
:dynamic_models=>parameters.check_dynamic_models,
|
399
|
+
:exclude_sti_models=>true,
|
400
|
+
:include_files=>true,
|
401
|
+
:only_app_files=>!parameters.update_vendor_models,
|
402
|
+
:only_app_tree_files=>parameters.update_vendor_models
|
403
|
+
}
|
328
404
|
end
|
329
405
|
|
330
406
|
def map_column_to_field_declaration(column)
|
data/modalfields.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "modalfields"
|
8
|
-
s.version = "1.
|
8
|
+
s.version = "1.3.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 = "ModelFields is a Rails plugin that adds fields declarations to your models."
|
14
14
|
s.email = "jgoizueta@gmail.com"
|
15
15
|
s.extra_rdoc_files = [
|
@@ -64,6 +64,7 @@ Gem::Specification.new do |s|
|
|
64
64
|
s.specification_version = 3
|
65
65
|
|
66
66
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
67
|
+
s.add_runtime_dependency(%q<modalsettings>, [">= 0"])
|
67
68
|
s.add_runtime_dependency(%q<activesupport>, [">= 2.3.5"])
|
68
69
|
s.add_runtime_dependency(%q<activerecord>, [">= 2.3.5"])
|
69
70
|
s.add_development_dependency(%q<shoulda>, [">= 0"])
|
@@ -74,6 +75,7 @@ Gem::Specification.new do |s|
|
|
74
75
|
s.add_development_dependency(%q<pg>, [">= 0"])
|
75
76
|
s.add_runtime_dependency(%q<rails>, [">= 2.3.0"])
|
76
77
|
else
|
78
|
+
s.add_dependency(%q<modalsettings>, [">= 0"])
|
77
79
|
s.add_dependency(%q<activesupport>, [">= 2.3.5"])
|
78
80
|
s.add_dependency(%q<activerecord>, [">= 2.3.5"])
|
79
81
|
s.add_dependency(%q<shoulda>, [">= 0"])
|
@@ -85,6 +87,7 @@ Gem::Specification.new do |s|
|
|
85
87
|
s.add_dependency(%q<rails>, [">= 2.3.0"])
|
86
88
|
end
|
87
89
|
else
|
90
|
+
s.add_dependency(%q<modalsettings>, [">= 0"])
|
88
91
|
s.add_dependency(%q<activesupport>, [">= 2.3.5"])
|
89
92
|
s.add_dependency(%q<activerecord>, [">= 2.3.5"])
|
90
93
|
s.add_dependency(%q<shoulda>, [">= 0"])
|
data/test/helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: modalfields
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.3.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,8 +9,24 @@ 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
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: modalsettings
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
14
30
|
- !ruby/object:Gem::Dependency
|
15
31
|
name: activesupport
|
16
32
|
requirement: !ruby/object:Gem::Requirement
|
@@ -214,7 +230,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
214
230
|
version: '0'
|
215
231
|
segments:
|
216
232
|
- 0
|
217
|
-
hash:
|
233
|
+
hash: -375049972268577712
|
218
234
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
219
235
|
none: false
|
220
236
|
requirements:
|