ez 1.9.2 → 1.9.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +40 -23
- data/ez.gemspec +1 -1
- data/lib/ez.rb +9 -25
- data/lib/ez/config.rb +8 -1
- data/lib/ez/domain_modeler.rb +24 -24
- data/lib/ez/rails_updater.rb +1 -1
- data/lib/ez/version.rb +1 -1
- data/lib/tasks/ez_tasks.rake +1 -5
- metadata +10 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7ac405024955a31e91958c4f679c63a062ec6d7e
|
4
|
+
data.tar.gz: e57f68f2e1a86b817bb592eac4d014334c512d41
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fa70cc7f7e368952a118ac0c162fb89ae71450589effb6be12917719ae88e2a7831168e36156ada6293b826fed36c0689c937d39b908f38ce936c8fc135bc895
|
7
|
+
data.tar.gz: a0838f2498ca2683405752c7167edeb1ba8ff2a70b8de12ef5042cc67a04a1d41c7f8bf42c3f3aad91e4774b1ba38ddfcca9f0ab82be409fc0b3399dc713e1d4
|
data/README.md
CHANGED
@@ -1,56 +1,57 @@
|
|
1
1
|
# EZ
|
2
2
|
|
3
|
-
|
3
|
+
Easy domain modeling in Rails without migrations.
|
4
|
+
|
5
|
+
**Version 1.9.3**
|
4
6
|
|
5
7
|
*For educational purposes only.*
|
6
8
|
|
7
|
-
Tested against Rails 5.1.
|
9
|
+
Tested against Rails 5.1.4.
|
8
10
|
|
9
11
|
_NOTE: For Rails < 5.0, use version 1.3_.
|
10
12
|
|
11
|
-
|
13
|
+
### Highlights
|
12
14
|
|
13
|
-
* Applies
|
14
|
-
* Schema changes applied
|
15
|
+
* Applies schema changes based on a file named `db/models.yml`.
|
16
|
+
* Schema changes are applied by running `rails server`, `rails console`, or `reload!` in the console.
|
15
17
|
* Diffs are determined automatically and applied to the database.
|
16
18
|
* Embraces Rails' column naming conventions by inferring columns types based on the name.
|
17
19
|
* Enhances the Rails Console with customized AwesomePrint and Hirb integration
|
18
20
|
* Adds two new ActiveRecord methods: `.sample(n = 1)` and `.none?`
|
19
21
|
|
20
22
|
|
21
|
-
|
23
|
+
### Installation
|
22
24
|
|
23
25
|
```ruby
|
24
26
|
gem 'ez'
|
25
27
|
```
|
26
28
|
|
27
|
-
|
28
|
-
`db/models.yml` and a
|
29
|
+
Start the server or console to force the initial generation of
|
30
|
+
`db/models.yml` and a hidden configuration file named `.ez`.
|
29
31
|
|
30
32
|
Alternatively, you can run `rails db:migrate` to generate these files without running your app.
|
31
33
|
|
32
|
-
|
33
|
-
|
34
|
-
1. Use `db/models.yml` to define your schema. Database schema changes are applied directly and triggered automatically in development mode. (`rails db:migrate` will also trigger the changes). Foreign-key indexes will be generated automatically.
|
34
|
+
### Usage
|
35
35
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
36
|
+
1. Use `db/models.yml` to define your schema. Database schema changes are applied directly without affecting migrations. (`rails db:migrate` will also trigger the changes).
|
37
|
+
2. Foreign-key indexes are generated automatically.
|
38
|
+
3. Use `rails db:migrate:preview` to perform a "dry run" based your `db/models.yml` file.
|
39
|
+
4. Use the `.ez` file to control functionality.
|
40
|
+
5. See the section on Migrations below.
|
40
41
|
|
41
42
|
|
42
43
|
|Config setting|Default|Description|
|
43
44
|
|----|----|----|
|
44
45
|
|models|true|Watches `models.yml` for changes. Set to `false` to turn off all functionality|
|
46
|
+
|timestamps|true|Generates `created_at` and `updated_at` columns on every model.
|
45
47
|
|restful_routes|true|Adds `resources :<tablename>` to routes.rb for each model|
|
46
48
|
|controllers|true|Generates one controller per model with 7 empty methods.
|
47
49
|
|views|true|Generates the view folder for each model, with 7 empty views.
|
48
|
-
|timestamps|true|Generates `created_at` and `updated_at` columns on every model.
|
49
50
|
|
50
51
|
|
51
52
|
## Syntax Guide for `db/models.yml`**
|
52
53
|
|
53
|
-
It's just YAML. We recommend `text` instead of `string` columns but both are supported.
|
54
|
+
It's just YAML. We recommend `text` instead of `string` columns (because of recent SQLite3 changes) but both are supported.
|
54
55
|
|
55
56
|
```
|
56
57
|
Book:
|
@@ -115,17 +116,33 @@ Author
|
|
115
116
|
* Boolean columns are assumed to be given a default of `false` if not otherwise specified.
|
116
117
|
|
117
118
|
|
118
|
-
###
|
119
|
+
### ActiveRecord Enhancements
|
119
120
|
|
120
|
-
*
|
121
|
-
*
|
121
|
+
* `.sample` method to choose a random row, or `.sample(5)` for five sample rows.
|
122
|
+
* `.none?` method on a collection: `Product.where(in_stock: true).none?`
|
123
|
+
* `.to_ez` to generate a snippet from legacy models that you can paste into models.yml.
|
122
124
|
|
123
125
|
|
124
|
-
###
|
126
|
+
### Beginner-friendly Rails Console
|
125
127
|
|
126
|
-
* Solves the "no connection" message in Rails >= 4.0.1 (if you try to inspect a model without making a query first) by establishing an initial connection to the development database.
|
127
128
|
* Shows helpful instructions when console starts, including the list of model classes found in the application.
|
128
|
-
*
|
129
|
+
* Solves the "no connection" message in Rails >= 4.0.1 (if you try to inspect a model without making a query first) by establishing an initial connection to the development database.
|
130
|
+
* Activates AwesomePrint.
|
129
131
|
* Uses Hirb for table-like display.
|
130
132
|
* Configures Hirb to allow nice table output for `ActiveRecord::Relation` collections
|
131
133
|
* Configures Hirb to produce hash-like output for single ActiveRecord objects
|
134
|
+
|
135
|
+
|
136
|
+
### Migrations
|
137
|
+
|
138
|
+
This gem is expecting that the student will not use database migrations
|
139
|
+
to control the schema. However, it is ok to use a combination of migrations
|
140
|
+
and `models.yml`, but be aware of the following:
|
141
|
+
|
142
|
+
* If at least one migration file is detected, this gem will stop
|
143
|
+
removing tables that are removed from `models.yml` since
|
144
|
+
it's not possible to know if there's a migration for it or not.
|
145
|
+
* Where possible, it's best to translate a migration required for
|
146
|
+
a third-party gem (say, for Devise) into an entry in models.yml
|
147
|
+
so that everything is managed in one place.
|
148
|
+
Pull requests for integrating such features into `ez` are encouraged.
|
data/ez.gemspec
CHANGED
@@ -18,7 +18,7 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.test_files = []
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
|
-
spec.add_runtime_dependency 'awesome_print'
|
21
|
+
spec.add_runtime_dependency 'awesome_print', '~> 1.8', '>= 1.8.0'
|
22
22
|
spec.add_runtime_dependency 'hirb', '~> 0.7'
|
23
23
|
|
24
24
|
spec.add_development_dependency "bundler", "~> 1.3"
|
data/lib/ez.rb
CHANGED
@@ -7,33 +7,16 @@ require 'awesome_print'
|
|
7
7
|
|
8
8
|
require 'hirb' if (Rails.env.development? || Rails.env.test?)
|
9
9
|
|
10
|
-
module EZ
|
11
|
-
module Console
|
12
|
-
def reload!
|
13
|
-
puts "Reloading code..."
|
14
|
-
if Rails::VERSION::MAJOR < 5
|
15
|
-
ActionDispatch::Reloader.cleanup!
|
16
|
-
ActionDispatch::Reloader.prepare!
|
17
|
-
else
|
18
|
-
Rails.application.reloader.reload!
|
19
|
-
end
|
20
|
-
|
21
|
-
true
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
|
27
10
|
module EZ
|
28
11
|
|
29
12
|
class Railtie < Rails::Railtie
|
13
|
+
|
30
14
|
rake_tasks do
|
31
15
|
load "tasks/ez_tasks.rake"
|
32
16
|
Rake::Task["db:migrate"].enhance ["ez:tables"]
|
33
17
|
end
|
34
18
|
|
35
19
|
console do |app|
|
36
|
-
# Rails::ConsoleMethods.send :prepend, EZ::Console
|
37
20
|
AwesomePrint.irb!
|
38
21
|
|
39
22
|
Hirb.enable(pager: false) if (Rails.env.development? || Rails.env.test?) && defined?(Hirb)
|
@@ -42,17 +25,18 @@ module EZ
|
|
42
25
|
|
43
26
|
models = EZ::DomainModeler.models
|
44
27
|
puts
|
28
|
+
puts "Rails Console"
|
29
|
+
puts "-" * 50
|
30
|
+
puts "* Type 'exit' (or press CTRL-D) when you're done."
|
31
|
+
puts "* Press Ctrl-C if things seem to get stuck."
|
32
|
+
puts "* Use the up/down arrows to repeat commands."
|
33
|
+
puts
|
45
34
|
if models.any?
|
46
|
-
puts "Models: #{models.to_sentence}"
|
35
|
+
puts "Models: #{models.to_sentence}"
|
47
36
|
puts
|
48
37
|
puts "Use this console to create, read, update, and delete rows from the database."
|
49
|
-
puts
|
38
|
+
puts "Or simply type the name of a model to see what columns it has."
|
50
39
|
end
|
51
|
-
puts "HINTS:"
|
52
|
-
puts "* Type 'exit' (or press CTRL-D) when you're done."
|
53
|
-
puts "* Press Ctrl-C if things seem to get stuck."
|
54
|
-
puts "* Use the up/down arrows to repeat commands."
|
55
|
-
puts "* Type the name of a Model to see what columns it has." if models.any?
|
56
40
|
puts
|
57
41
|
end
|
58
42
|
|
data/lib/ez/config.rb
CHANGED
data/lib/ez/domain_modeler.rb
CHANGED
@@ -21,25 +21,26 @@ module EZ
|
|
21
21
|
end
|
22
22
|
|
23
23
|
def self.automigrate
|
24
|
-
|
24
|
+
return unless EZ::Config.models?
|
25
|
+
|
26
|
+
begin
|
25
27
|
models_yml = File.join(Rails.root, 'db', 'models.yml')
|
26
28
|
schema_rb = File.join(Rails.root, 'db', 'schema.rb')
|
27
29
|
|
28
30
|
EZ::DomainModeler.generate_models_yml unless File.exist?(models_yml)
|
29
31
|
|
30
32
|
if !File.exist?(schema_rb) || (File.mtime(schema_rb) < File.mtime(models_yml))
|
31
|
-
puts "Updating your app based on models.yml..."
|
32
33
|
old_level = ActiveRecord::Base.logger.level
|
33
|
-
ActiveRecord::Base.logger.level = Logger::WARN
|
34
34
|
|
35
|
+
ActiveRecord::Base.logger.level = Logger::WARN
|
35
36
|
EZ::DomainModeler.update_tables
|
36
37
|
dump_schema if (Rails.env.development? || Rails.env.test?)
|
37
|
-
|
38
|
+
|
38
39
|
ActiveRecord::Base.logger.level = old_level
|
40
|
+
EZ::RailsUpdater.update!
|
39
41
|
end
|
40
|
-
|
41
|
-
|
42
|
-
|
42
|
+
rescue => e
|
43
|
+
puts "Exception: #{e}"
|
43
44
|
end
|
44
45
|
end
|
45
46
|
|
@@ -68,37 +69,36 @@ module EZ
|
|
68
69
|
unless File.exist?(filename)
|
69
70
|
File.open(filename, "w") do |f|
|
70
71
|
f.puts <<-EOS
|
71
|
-
# Example
|
72
|
+
# Example:
|
72
73
|
#
|
73
74
|
# Book
|
74
75
|
# title: text
|
75
76
|
# author_id: integer
|
76
|
-
# price: integer
|
77
77
|
# summary: text
|
78
|
+
# price: integer
|
78
79
|
# hardcover: boolean
|
79
80
|
#
|
81
|
+
#
|
80
82
|
# Indent consistently! Follow the above syntax exactly.
|
81
|
-
# Typical column choices are: string, text, integer, boolean, date, time, and datetime.
|
82
83
|
#
|
83
84
|
#
|
84
|
-
# About Default Values
|
85
|
-
# ----------------------------------------------------
|
86
|
-
# Default column values can be specified like this:
|
87
|
-
# price: integer(0)
|
88
85
|
#
|
89
|
-
#
|
86
|
+
# Column choices are: text, integer, boolean, datetime, and float.
|
90
87
|
#
|
91
88
|
#
|
92
|
-
#
|
93
|
-
# ----------------------------------------------------
|
94
|
-
# You can omit the column type if it's a string, or if it's obviously an integer column:
|
89
|
+
# Default values can be specified like this:
|
95
90
|
#
|
91
|
+
# price: integer(0)
|
92
|
+
#
|
93
|
+
# If not specified, Boolean columns always default to false.
|
94
|
+
#
|
95
|
+
# You can omit the column type if it's a text column or obviously an integer column:
|
96
96
|
#
|
97
97
|
# Book
|
98
98
|
# title
|
99
99
|
# author_id
|
100
|
+
# summary
|
100
101
|
# price: integer
|
101
|
-
# summary: text
|
102
102
|
# hardcover: boolean
|
103
103
|
#
|
104
104
|
# Complete details are in the README file online.
|
@@ -143,9 +143,9 @@ module EZ
|
|
143
143
|
@spec = YAML.load(s)
|
144
144
|
parse_model_spec
|
145
145
|
|
146
|
-
puts "@spec:"
|
147
|
-
puts @spec.inspect
|
148
|
-
puts "-" * 10
|
146
|
+
# puts "@spec:"
|
147
|
+
# puts @spec.inspect
|
148
|
+
# puts "-" * 10
|
149
149
|
end
|
150
150
|
|
151
151
|
def load_model_specs(filename = "db/models.yml")
|
@@ -173,7 +173,7 @@ module EZ
|
|
173
173
|
columns['created_at'] = 'datetime'
|
174
174
|
columns['updated_at'] = 'datetime'
|
175
175
|
end
|
176
|
-
|
176
|
+
|
177
177
|
columns.each do |column_name, column_type|
|
178
178
|
interpret_column_spec column_name, column_type, model
|
179
179
|
end
|
@@ -192,7 +192,7 @@ module EZ
|
|
192
192
|
elsif column_name =~ /\?$/
|
193
193
|
'boolean'
|
194
194
|
else
|
195
|
-
'
|
195
|
+
'text'
|
196
196
|
end
|
197
197
|
end
|
198
198
|
|
data/lib/ez/rails_updater.rb
CHANGED
@@ -31,7 +31,7 @@ module EZ
|
|
31
31
|
filename = File.join(Rails.root, 'app', 'controllers', "#{controller}_controller.rb")
|
32
32
|
if !File.exist?(filename)
|
33
33
|
File.open(filename, "w:utf-8") do |file|
|
34
|
-
file.puts "class #{controller.classify} < ApplicationController"
|
34
|
+
file.puts "class #{"#{controller}_controller".classify} < ApplicationController"
|
35
35
|
METHODS.each do |method|
|
36
36
|
file.puts
|
37
37
|
file.puts " def #{method}"
|
data/lib/ez/version.rb
CHANGED
data/lib/tasks/ez_tasks.rake
CHANGED
@@ -1,7 +1,3 @@
|
|
1
|
-
# Rake::Task["db:migrate"].enhance do
|
2
|
-
# Rake::Task["ez:resources"].invoke
|
3
|
-
# end
|
4
|
-
|
5
1
|
namespace :db do
|
6
2
|
|
7
3
|
namespace :migrate do
|
@@ -22,7 +18,7 @@ namespace :ez do
|
|
22
18
|
|
23
19
|
desc "Generate models.yml if it doesn't exist yet."
|
24
20
|
task :generate_yml do
|
25
|
-
EZ::DomainModeler.
|
21
|
+
EZ::DomainModeler.generate_models_yml
|
26
22
|
end
|
27
23
|
|
28
24
|
desc "Erases all data, and builds all table schema from scratch."
|
metadata
CHANGED
@@ -1,29 +1,35 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ez
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.9.
|
4
|
+
version: 1.9.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jeff Cohen
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-12-
|
11
|
+
date: 2017-12-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: awesome_print
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.8'
|
17
20
|
- - ">="
|
18
21
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
22
|
+
version: 1.8.0
|
20
23
|
type: :runtime
|
21
24
|
prerelease: false
|
22
25
|
version_requirements: !ruby/object:Gem::Requirement
|
23
26
|
requirements:
|
27
|
+
- - "~>"
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '1.8'
|
24
30
|
- - ">="
|
25
31
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
32
|
+
version: 1.8.0
|
27
33
|
- !ruby/object:Gem::Dependency
|
28
34
|
name: hirb
|
29
35
|
requirement: !ruby/object:Gem::Requirement
|