ez 1.9.2 → 1.9.3
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 +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
|