ez 0.9.7 → 0.9.9
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 +4 -4
- data/README.md +27 -5
- data/lib/ez.rb +29 -10
- data/lib/ez/domain_modeler.rb +28 -4
- data/lib/ez/schema_modifier.rb +2 -2
- data/lib/ez/version.rb +1 -1
- data/lib/tasks/ez_tasks.rake +27 -8
- 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: c1435cdce1c508b5097a63994d5410bacc4d70b0
|
4
|
+
data.tar.gz: c45bc846995af9ff76cd7b4ae516f1bb9d9921b0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4531ea674bbd3fb547aeda0ab8ed898592292a6997497aecc46637b5917693a45f56b3137c9c3057d02bc96909eb0fc3fa53034d95f2ba05d8591c75de3d5162
|
7
|
+
data.tar.gz: 9b13d85e4e0ed661244b87e7cb3a485131904da9adb7e1c967a72363cfdf4c487a681b5fc1c4048031273d372de1539ba440f06ef81d97b5843561acc80adcb6
|
data/README.md
CHANGED
@@ -2,9 +2,11 @@
|
|
2
2
|
|
3
3
|
**Version 0.9.8**
|
4
4
|
|
5
|
+
*For educational purposes only.*
|
6
|
+
|
5
7
|
Makes domain modeling in Rails more beginner-friendly by avoiding migrations.
|
6
8
|
|
7
|
-
|
9
|
+
Also enhances the rails console.
|
8
10
|
|
9
11
|
|
10
12
|
## Usage
|
@@ -13,15 +15,35 @@ For educational purposes only.
|
|
13
15
|
gem 'ez'
|
14
16
|
```
|
15
17
|
|
18
|
+
Then:
|
19
|
+
|
20
|
+
`rake db:migrate` to generate a skeleton `db/models.yml` that you should edit.
|
21
|
+
|
22
|
+
|
23
|
+
## Summary of Best Practices
|
24
|
+
|
25
|
+
1. Use `db/models.yml` to define your schema. Foreign-key indexes will be generated automatically. (This should cover 100% of what most beginners will ever need to do.)
|
26
|
+
|
27
|
+
2. Use Rails migrations for any additional indexes, database constraints, etc.
|
28
|
+
|
29
|
+
3. Just use `rake db:migrate` as usual. Nothing new to learn.
|
30
|
+
|
31
|
+
|
32
|
+
|
16
33
|
## Features
|
17
34
|
|
18
35
|
|
19
36
|
### 1. Domain Modeling Enhancements
|
20
37
|
|
21
|
-
* Enables **instant domain modeling without migrations** by
|
22
|
-
*
|
23
|
-
*
|
24
|
-
*
|
38
|
+
* Enables **instant domain modeling without migrations** by using a file named `db/models.yml`.
|
39
|
+
* No new rake tasks to learn. This gem enhances `db:migrate` to incorporate the `db/models.yml` file automatically.
|
40
|
+
* You can run `rake db:migrate` to initially generate a file named `db/models.yml`. It will have some self-documenting comments inside of it.
|
41
|
+
* In development mode, there's no need to ever run `rake db:migrate`! Every brower request will trigger automatic table updates.
|
42
|
+
* In the rails console, 'reload!' will also trigger table updates.
|
43
|
+
* If you prefer, you can run `rake db:migrate` whenever you modify `db/models.yml`.
|
44
|
+
* `rake db:migrate` will run any pending migrations *after* following instructions in the `db/models.yml` file.
|
45
|
+
|
46
|
+
|
25
47
|
|
26
48
|
**Syntax Guide for `db/models.yml`**
|
27
49
|
|
data/lib/ez.rb
CHANGED
@@ -11,28 +11,47 @@ require 'ez/view_helpers.rb'
|
|
11
11
|
require 'hirb' if Rails.env.development?
|
12
12
|
|
13
13
|
module EZ
|
14
|
+
module Console
|
15
|
+
def reload!(print=true)
|
16
|
+
puts "Reloading code..." if print
|
17
|
+
ActionDispatch::Reloader.cleanup!
|
18
|
+
ActionDispatch::Reloader.prepare!
|
19
|
+
|
20
|
+
puts "Updating tables (if necessary) ..." if print
|
21
|
+
old_level = ActiveRecord::Base.logger.level
|
22
|
+
ActiveRecord::Base.logger.level = Logger::WARN
|
23
|
+
EZ::DomainModeler.generate_models_yml
|
24
|
+
EZ::DomainModeler.update_tables
|
25
|
+
puts "Models: #{EZ::DomainModeler.models.to_sentence}"
|
26
|
+
ActiveRecord::Base.logger.level = old_level
|
27
|
+
true
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
module EZ
|
33
|
+
|
14
34
|
class Railtie < Rails::Railtie
|
15
35
|
rake_tasks do
|
16
36
|
load "tasks/ez_tasks.rake"
|
17
37
|
Rake::Task["db:migrate"].enhance ["ez:tables"]
|
18
38
|
end
|
19
39
|
|
20
|
-
config.to_prepare do
|
21
|
-
Rails.cache.fetch('ez-generate-yml-flag') do
|
22
|
-
EZ::DomainModeler.generate_models_yml
|
23
|
-
end
|
24
|
-
EZ::DomainModeler.update_tables
|
25
|
-
end
|
26
|
-
|
27
40
|
console do |app|
|
28
|
-
|
41
|
+
Rails::ConsoleMethods.send :prepend, EZ::Console
|
42
|
+
Hirb.enable(pager: false) if ::Rails.env.development? && defined?(Hirb)
|
43
|
+
|
44
|
+
old_level = ActiveRecord::Base.logger.level
|
45
|
+
ActiveRecord::Base.logger.level = Logger::WARN
|
46
|
+
EZ::DomainModeler.generate_models_yml
|
47
|
+
EZ::DomainModeler.update_tables(true)
|
48
|
+
ActiveRecord::Base.logger.level = old_level
|
29
49
|
|
30
50
|
I18n.enforce_available_locales = false
|
31
51
|
puts "Welcome to the Rails Console."
|
32
52
|
puts "-" * 60
|
33
53
|
puts
|
34
|
-
|
35
|
-
models = tables.map { |t| t.classify }
|
54
|
+
models = EZ::DomainModeler.models
|
36
55
|
if models.any?
|
37
56
|
puts "Models: #{models.to_sentence}"
|
38
57
|
puts
|
data/lib/ez/domain_modeler.rb
CHANGED
@@ -9,12 +9,19 @@ module EZ
|
|
9
9
|
# Valid formats for default values
|
10
10
|
DEFAULT_VALUE_REGEXES = [/\s*\((.+)?\)/, /\s+(.+)?\s*/, /,\s*default:\s*(.+)?\s*/]
|
11
11
|
|
12
|
+
def self.models
|
13
|
+
tables = ActiveRecord::Base.connection.tables - ['schema_migrations']
|
14
|
+
tables.map { |t| t.classify }
|
15
|
+
end
|
16
|
+
|
12
17
|
# Get the domain model as a hash
|
13
18
|
attr_reader :spec
|
14
19
|
|
15
20
|
def initialize
|
21
|
+
@ok = false
|
16
22
|
begin
|
17
23
|
load_model_specs
|
24
|
+
@ok = true
|
18
25
|
rescue => e
|
19
26
|
puts e
|
20
27
|
end
|
@@ -52,15 +59,23 @@ module EZ
|
|
52
59
|
end
|
53
60
|
|
54
61
|
def update_tables(silent = false)
|
62
|
+
return false unless @ok
|
63
|
+
|
55
64
|
SchemaModifier.migrate(@spec, silent)
|
65
|
+
return true
|
56
66
|
|
57
67
|
rescue => e
|
58
68
|
puts e.message unless silent
|
59
69
|
puts e.backtrace.first unless silent
|
70
|
+
@ok = false
|
71
|
+
return false
|
60
72
|
end
|
61
73
|
|
62
74
|
def load_model_specs_from_string(s)
|
63
75
|
|
76
|
+
# Ignore comments
|
77
|
+
s.gsub!(/#.*$/,'')
|
78
|
+
|
64
79
|
# Append missing colons
|
65
80
|
s.gsub!(/^((\s|\-)*\w[^\:]+?)$/, '\1:')
|
66
81
|
|
@@ -74,8 +89,8 @@ module EZ
|
|
74
89
|
parse_model_spec
|
75
90
|
|
76
91
|
# puts "@spec:"
|
77
|
-
|
78
|
-
|
92
|
+
puts @spec.inspect
|
93
|
+
puts "-" * 10
|
79
94
|
end
|
80
95
|
|
81
96
|
def load_model_specs(filename = "db/models.yml")
|
@@ -86,10 +101,19 @@ module EZ
|
|
86
101
|
@spec ||= {}
|
87
102
|
@spec.each do |model, columns|
|
88
103
|
|
104
|
+
msg = nil
|
105
|
+
|
89
106
|
if !columns.is_a?(Hash)
|
90
|
-
|
107
|
+
msg = "Could not understand models.yml while parsing model '#{model}'."
|
108
|
+
end
|
109
|
+
|
110
|
+
if model !~ /^[A-Z]/ || model =~ /\s/
|
111
|
+
msg = "Could not understand models.yml while parsing model '#{model}'."
|
112
|
+
msg << " Models must begin with an uppercase letter and cannot contain spaces."
|
91
113
|
end
|
92
114
|
|
115
|
+
raise msg if msg
|
116
|
+
|
93
117
|
columns.each do |column_name, column_type|
|
94
118
|
interpret_column_spec column_name, column_type, model
|
95
119
|
end
|
@@ -112,7 +136,7 @@ module EZ
|
|
112
136
|
end
|
113
137
|
end
|
114
138
|
|
115
|
-
default_column_value = (column_type == 'boolean' ?
|
139
|
+
default_column_value = (column_type == 'boolean' ? false : nil)
|
116
140
|
DEFAULT_VALUE_REGEXES.each { |r| default_column_value = $1 if column_type.sub!(r, '') }
|
117
141
|
default_column_value = default_column_value.to_i if column_type == 'integer'
|
118
142
|
default_column_value = default_column_value.to_f if column_type == 'float'
|
data/lib/ez/schema_modifier.rb
CHANGED
@@ -138,8 +138,8 @@ module EZ
|
|
138
138
|
end
|
139
139
|
|
140
140
|
def update_schema_version
|
141
|
-
db.initialize_schema_migrations_table
|
142
|
-
db.assume_migrated_upto_version(Time.now.utc.strftime("%Y%m%d%H%M%S"))
|
141
|
+
# db.initialize_schema_migrations_table
|
142
|
+
# db.assume_migrated_upto_version(Time.now.utc.strftime("%Y%m%d%H%M%S"))
|
143
143
|
end
|
144
144
|
|
145
145
|
def remove_dead_tables
|
data/lib/ez/version.rb
CHANGED
data/lib/tasks/ez_tasks.rake
CHANGED
@@ -8,19 +8,39 @@ namespace :ez do
|
|
8
8
|
f.puts <<-EOS
|
9
9
|
# Example table for a typical Book model.
|
10
10
|
#
|
11
|
-
Book
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
11
|
+
# Book
|
12
|
+
# title: string
|
13
|
+
# author_id: integer
|
14
|
+
# price: integer
|
15
|
+
# summary: text
|
16
|
+
# hardcover: boolean
|
17
17
|
#
|
18
18
|
# Indent consistently! Follow the above syntax exactly.
|
19
|
-
# Typical column choices are: string, text, integer, boolean, date, and datetime.
|
19
|
+
# Typical column choices are: string, text, integer, boolean, date, time, and datetime.
|
20
20
|
#
|
21
|
+
#
|
22
|
+
# Specifying Default Values
|
23
|
+
# ----------------------------------------------------
|
21
24
|
# Default column values can be specified like this:
|
22
25
|
# price: integer(0)
|
23
26
|
#
|
27
|
+
# If not specified, Boolean columns always default to false.
|
28
|
+
#
|
29
|
+
#
|
30
|
+
# Convention-Based Defaults:
|
31
|
+
# ----------------------------------------------------
|
32
|
+
# You can omit the column type if it's a string, or if it's obviously an integer column:
|
33
|
+
#
|
34
|
+
#
|
35
|
+
# Book
|
36
|
+
# title
|
37
|
+
# author_id
|
38
|
+
# price: integer
|
39
|
+
# summary: text
|
40
|
+
# hardcover: boolean
|
41
|
+
#
|
42
|
+
# Complete details are in the README file online.
|
43
|
+
#
|
24
44
|
# Have fun!
|
25
45
|
|
26
46
|
EOS
|
@@ -35,7 +55,6 @@ EOS
|
|
35
55
|
|
36
56
|
desc "Attempts to update the database schema and model files with minimal data loss."
|
37
57
|
task :tables => [:environment] do
|
38
|
-
puts "Running ez:tables..."
|
39
58
|
if File.exists?('db/models.yml')
|
40
59
|
if EZ::DomainModeler.update_tables
|
41
60
|
Rake::Task["db:schema:dump"].invoke unless Rails.env.production?
|
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: 0.9.
|
4
|
+
version: 0.9.9
|
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-
|
11
|
+
date: 2014-09-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: hirb
|