ez 1.0.0 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +7 -7
- data/lib/ez/domain_modeler.rb +6 -6
- data/lib/ez/schema_modifier.rb +27 -18
- data/lib/ez/version.rb +1 -1
- data/lib/tasks/ez_tasks.rake +16 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 33044a33df8727278898d03a7c1caaa6f139e2a2
|
4
|
+
data.tar.gz: 64bfe376ccdc13ec0748e7ba7adefb54d938059d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 53c36051739a15018e61042a661d05006a21a8f7a583e93e514d10772fd770d990f7edbbd8dce3717776edc7008dd413254289445098326f9c1c39d40cc5d5be
|
7
|
+
data.tar.gz: 97d586b236546fcae7c7ef4ab93b053135ed55f3a175d169be5c1ad1078fa15c49571b434e688bf690f5f24e8e688afd7ef6977bc65cfaefe38bad0306bedd71
|
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# EZ
|
2
2
|
|
3
|
-
**Version
|
3
|
+
**Version 1.1.0**
|
4
4
|
|
5
5
|
*For educational purposes only.*
|
6
6
|
|
@@ -22,13 +22,13 @@ Then:
|
|
22
22
|
|
23
23
|
## Summary of Best Practices
|
24
24
|
|
25
|
-
1.
|
25
|
+
1. Run `rake db:migrate` to initially generate a file named `db/models.yml`.
|
26
26
|
|
27
|
-
2. Use
|
28
|
-
|
29
|
-
3. Overall, just use `rake db:migrate` as usual.
|
27
|
+
2. Use `db/models.yml` to define your schema. Database schema changes are applied directly and triggered automatically in development mode. (`rake db:migrate` will also trigger the changes). Foreign-key indexes will be generated automatically.
|
30
28
|
|
29
|
+
3. You can continue to use traditional Rails migrations for any additional indexes, database constraints, etc.
|
31
30
|
|
31
|
+
4. Run `rake db:migrate:preview` to do a "dry run" to see what would change based your `db/models.yml` file.
|
32
32
|
|
33
33
|
## Features
|
34
34
|
|
@@ -36,8 +36,8 @@ Then:
|
|
36
36
|
### 1. Domain Modeling Enhancements
|
37
37
|
|
38
38
|
* Enables **instant domain modeling without migrations** by using a file named `db/models.yml`.
|
39
|
-
*
|
40
|
-
*
|
39
|
+
* This gem enhances `db:migrate` to incorporate the `db/models.yml` file automatically.
|
40
|
+
* Run `rake db:migrate` to initially generate a file named `db/models.yml`. It will have some self-documenting comments inside of it.
|
41
41
|
* In development mode, there's no need to ever run `rake db:migrate`! Every browser request will trigger automatic table updates.
|
42
42
|
* In the rails console, 'reload!' will also trigger table updates.
|
43
43
|
* If you prefer, just run `rake db:migrate` whenever you modify `db/models.yml`.
|
data/lib/ez/domain_modeler.rb
CHANGED
@@ -54,14 +54,14 @@ module EZ
|
|
54
54
|
end
|
55
55
|
end
|
56
56
|
|
57
|
-
def self.update_tables(silent = false)
|
58
|
-
self.new.update_tables(silent)
|
57
|
+
def self.update_tables(silent = false, dry_run = false)
|
58
|
+
self.new.update_tables(silent, dry_run)
|
59
59
|
end
|
60
60
|
|
61
|
-
def update_tables(silent = false)
|
61
|
+
def update_tables(silent = false, dry_run = false)
|
62
62
|
return false unless @ok
|
63
63
|
|
64
|
-
SchemaModifier.migrate(@spec, silent)
|
64
|
+
SchemaModifier.migrate(@spec, silent, dry_run)
|
65
65
|
return true
|
66
66
|
|
67
67
|
rescue => e
|
@@ -138,8 +138,8 @@ module EZ
|
|
138
138
|
|
139
139
|
default_column_value = nil
|
140
140
|
DEFAULT_VALUE_REGEXES.each { |r| default_column_value = $1 if column_type.sub!(r, '') }
|
141
|
-
default_column_value = default_column_value.to_i if column_type == 'integer'
|
142
|
-
default_column_value = default_column_value.to_f if column_type == 'float'
|
141
|
+
default_column_value = default_column_value.to_i if default_column_value.present? && column_type == 'integer'
|
142
|
+
default_column_value = default_column_value.to_f if default_column_value.present? && column_type == 'float'
|
143
143
|
|
144
144
|
if column_type == 'boolean'
|
145
145
|
default_column_value = default_column_value.present? && default_column_value.downcase.strip == 'true'
|
data/lib/ez/schema_modifier.rb
CHANGED
@@ -4,28 +4,38 @@ module EZ
|
|
4
4
|
# and applies any necessary db schema changes.
|
5
5
|
class SchemaModifier
|
6
6
|
|
7
|
-
attr_reader :db, :spec
|
7
|
+
attr_reader :db, :spec, :dry_run
|
8
8
|
|
9
|
-
def initialize(model_spec, silent = false)
|
9
|
+
def initialize(model_spec, silent = false, dry_run = false)
|
10
10
|
@silent = silent
|
11
|
+
@dry_run = dry_run
|
11
12
|
@spec = model_spec
|
12
13
|
connect_to_database
|
13
14
|
end
|
14
15
|
|
15
|
-
def self.migrate(model_spec, silent = false)
|
16
|
-
self.new(model_spec, silent).migrate
|
16
|
+
def self.migrate(model_spec, silent = false, dry_run = false)
|
17
|
+
self.new(model_spec, silent, dry_run).migrate
|
17
18
|
end
|
18
19
|
|
19
20
|
def migrate
|
20
21
|
@changed = false
|
21
22
|
|
23
|
+
if @dry_run
|
24
|
+
puts "Previewing... no changes will actually take place..."
|
25
|
+
puts
|
26
|
+
end
|
27
|
+
|
22
28
|
add_missing_schema
|
23
29
|
remove_dead_schema
|
24
30
|
|
25
31
|
if @changed
|
26
|
-
update_schema_version
|
32
|
+
update_schema_version unless @dry_run
|
33
|
+
puts "\n(No changes were actually made)" if @dry_run
|
27
34
|
else
|
28
|
-
|
35
|
+
puts "All tables are up-to-date."
|
36
|
+
if @dry_run
|
37
|
+
puts "\nNo changes would be made."
|
38
|
+
end
|
29
39
|
end
|
30
40
|
|
31
41
|
return @changed
|
@@ -77,22 +87,23 @@ module EZ
|
|
77
87
|
if !assume_missing
|
78
88
|
display_change "Adding new column '#{col_name}' as #{col_type} for model #{model_name}"
|
79
89
|
end
|
80
|
-
db.add_column(table_name, col_name.to_sym, col_type.to_sym, default: col_default)
|
90
|
+
db.add_column(table_name, col_name.to_sym, col_type.to_sym, default: col_default) unless @dry_run
|
81
91
|
if data[:index]
|
82
92
|
display_change " (adding database index for '#{col_name}')"
|
83
|
-
db.add_index table_name, col_name.to_sym
|
93
|
+
db.add_index table_name, col_name.to_sym unless @dry_run
|
84
94
|
end
|
85
95
|
else
|
86
96
|
if db_col.type != col_type
|
87
97
|
display_change "Changing column type for #{col_name} to #{col_type} for model #{model_name}"
|
88
98
|
end
|
89
99
|
|
100
|
+
# puts "#{table_name} #{col_name}: #{db_col.default} and #{col_default}"
|
90
101
|
if db_col.default != col_default
|
91
|
-
display_change "Applying new default value #{col_default} for #{col_name} for model #{model_name}"
|
102
|
+
display_change "Applying new default value #{col_default || 'NULL'} for #{col_name} for model #{model_name}"
|
92
103
|
end
|
93
104
|
|
94
105
|
if (db_col.type != col_type) || (db_col.default != col_default)
|
95
|
-
db.change_column(table_name, col_name.to_sym, col_type.to_sym, default: col_default)
|
106
|
+
db.change_column(table_name, col_name.to_sym, col_type.to_sym, default: col_default) unless @dry_run
|
96
107
|
end
|
97
108
|
end
|
98
109
|
end
|
@@ -101,7 +112,7 @@ module EZ
|
|
101
112
|
def add_model(model_name, columns)
|
102
113
|
table_name = model_name.tableize
|
103
114
|
display_change "Defining new table for model '#{model_name}'."
|
104
|
-
db.create_table table_name
|
115
|
+
db.create_table table_name unless @dry_run
|
105
116
|
add_missing_columns model_name, columns, true
|
106
117
|
filename = "app/models/#{model_name.underscore}.rb"
|
107
118
|
unless Rails.env.production? || File.exists?(filename)
|
@@ -125,13 +136,15 @@ module EZ
|
|
125
136
|
if @spec.has_key?(model_name)
|
126
137
|
db_columns = db.columns(table_name).map { |column| column.name.to_sym } - [:id, :created_at, :updated_at]
|
127
138
|
spec_columns = @spec[model_name].keys.map(&:to_sym)
|
139
|
+
# puts spec_columns.inspect
|
128
140
|
dead_columns = db_columns - spec_columns
|
129
141
|
|
142
|
+
|
130
143
|
if dead_columns.any?
|
131
144
|
dead_columns.each do |dead_column_name|
|
132
145
|
display_change "Removing unused column '#{dead_column_name}' from model '#{model_name}'"
|
133
146
|
end
|
134
|
-
db.remove_columns(table_name, *dead_columns)
|
147
|
+
db.remove_columns(table_name, *dead_columns) unless @dry_run
|
135
148
|
end
|
136
149
|
end
|
137
150
|
end
|
@@ -149,7 +162,7 @@ module EZ
|
|
149
162
|
dead_tables.each do |table_name|
|
150
163
|
model_name = table_name.classify
|
151
164
|
display_change "Dropping table #{table_name}"
|
152
|
-
db.drop_table(table_name)
|
165
|
+
db.drop_table(table_name) unless @dry_run
|
153
166
|
begin
|
154
167
|
filename = "app/models/#{model_name.underscore}.rb"
|
155
168
|
code = IO.read(filename)
|
@@ -157,7 +170,7 @@ module EZ
|
|
157
170
|
|
158
171
|
if is_empty
|
159
172
|
display_change "Deleting file #{filename}"
|
160
|
-
File.unlink(filename)
|
173
|
+
File.unlink(filename) unless @dry_run
|
161
174
|
end
|
162
175
|
rescue => e
|
163
176
|
display_change "Could not delete old model #{model_name.underscore}.rb."
|
@@ -165,10 +178,6 @@ module EZ
|
|
165
178
|
end
|
166
179
|
end
|
167
180
|
|
168
|
-
def silence_migration_output
|
169
|
-
ActiveRecord::Migration.verbose = false
|
170
|
-
end
|
171
|
-
|
172
181
|
def connect_to_database
|
173
182
|
ActiveRecord::Base.establish_connection
|
174
183
|
@db = ActiveRecord::Base.connection
|
data/lib/ez/version.rb
CHANGED
data/lib/tasks/ez_tasks.rake
CHANGED
@@ -1,3 +1,19 @@
|
|
1
|
+
namespace :db do
|
2
|
+
|
3
|
+
namespace :migrate do
|
4
|
+
|
5
|
+
desc "Preview table updates"
|
6
|
+
task :preview => :environment do
|
7
|
+
if File.exists?('db/models.yml')
|
8
|
+
EZ::DomainModeler.update_tables(false, true)
|
9
|
+
else
|
10
|
+
puts "Nothing to preview."
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
1
17
|
namespace :ez do
|
2
18
|
|
3
19
|
desc "Generate models.yml if it doesn't exist yet."
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ez
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jeff Cohen
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-09-
|
11
|
+
date: 2014-09-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: hirb
|