ez 0.9.1 → 0.9.5

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4bbacb9af6fd2f80c8aed574c56265d9f7e9af8c
4
- data.tar.gz: 529687c8f65652ff1c9133d0fee355cd0204cd67
3
+ metadata.gz: 5cf4b1d3d88ed176c6158aa4a3d36bcf9839f7a6
4
+ data.tar.gz: c883f390a67350f0eff832ae33c8d309ad50d24a
5
5
  SHA512:
6
- metadata.gz: c36d5521426c59b5f9fbf483bedd3cff07fc24f404556f868fffc6bc402a00d2152bbd97c70bf32f3da08f2c26b88686fe1d63c25449afc6a6ab6eb13ca9fd18
7
- data.tar.gz: 9dd7a0f3d63031b615be468a56a45b34319ed02226314f98e132338dde81ce5b9a0bf6cb5f1d372702e582aae1e66deb69ad45075ce9b229a8b5df6a55194b9c
6
+ metadata.gz: 2504acb195bd45a35c4119049e5f289a345da9dfffb8add1ce47ca4ac0ed512bd9c8d619a50b92c7352ebac8a270e02f653ede15ac0d3792686c33b759e3591b
7
+ data.tar.gz: 6c5b356cf56615a97e2bba4221a2c7e2ecc07587117642fba3fad44ed45ad3e4d5f61b5314d5c78a0963a296119174139b917278b6c576059edf0d7d85b1960d
data/README.md CHANGED
@@ -1,41 +1,147 @@
1
1
  # EZ
2
2
 
3
- For educational purposes only. Makes Rails a bit more beginner-friendly.
3
+ **Version 0.9.8**
4
+
5
+ For educational purposes only, but I'm now using it on small production apps with no problems. Would love to get more real-world feedback.
6
+
7
+ Makes domain modeling in Rails more beginner-friendly by avoiding migrations.
4
8
 
5
9
  ## Usage
6
10
 
7
11
  ```ruby
8
- gem 'ez', group: 'development'
12
+ gem 'ez'
9
13
  ```
10
14
 
11
15
  ## Features
12
16
 
13
- ### 1. Console Enhancements
14
17
 
15
- * Fixes 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.
16
- * Shows helpful instructions when console starts, including the list of model classes found in the application.
17
- * Uses Hirb for table-like display. (Depends on Hirb ~> 0.7.1)
18
- * Patches Hirb to allow nice table output for `ActiveRecord::Relation` lists (i.e. result of `.all`, `.where`) and hash-like output for single ActiveRecord objects, such as the result of `.find_by(:title => 'Apollo 13')`.
18
+ ### 1. Domain Modeling Enhancements
19
+
20
+ * Enables **instant domain modeling without migrations** by editing a simple file named `db/models.yml` and then running `rake db:migrate`. If things ever get messed up, use `rake ez:reset_tables` to drop the entire db first.
21
+ * You can run `rake ez:tables` once to generate a file named `db/models.yml`. It will have some self-documenting comments inside of it.
22
+ * In development mode, there's no need to ever run `rake db:migrate` - every action will trigger automatic table updates.
23
+ * You can run `rake db:migrate` whenever you modify `db/models.yml` instead of waiting for a browser action.
24
+
25
+ **Syntax Guide for `db/models.yml`**
26
+
27
+ It's just YAML and the syntax is very simple:
28
+
29
+ ```
30
+ Book:
31
+ title: string
32
+ copies_on_hand: integer
33
+ author_id: integer
34
+ created_at: datetime
35
+ updated_at: datetime
36
+ paperback: boolean
37
+
38
+ Author:
39
+ last_name: string
40
+ first_name: string
41
+ book_count: integer
42
+ ```
19
43
 
20
- ### 2. Route Enhancements
44
+ **(Optional) Variations**
21
45
 
22
- * Patches the Rails dispatcher to avoid writing controllers for simple views by adding route support for `get "url" => "folder/file"`
46
+ The colon after the model name is optional.
23
47
 
24
- ### 3. Model Enhancements
48
+ Also, you can often omit the column type and rely on conventions. I don't recommend this for beginning students, but is very handy for experienced developers. Rails conventions are embraced in `db/models.yml` resulting in these sensible defaults:
25
49
 
26
- * Run `rake ez:generate_yml` to generate a file named `db/models.yml`. It will have some self-documenting comments inside of it. This file is also automatically generated if you run `rake ez:tables` without an existing `models.yml` first.
27
- * Enables instant modeling without migrations via `models.yml` and `rake ez:tables`. If things get messed up, use `rake ez:reset_tables` to drop the entire db first.
28
- * Columns default to type `string` if none is provided and the column name doesn't have a recognized suffix.
29
- * Column names ending in `_id` are assumed to be of type `integer`.
50
+ * If a column type isn't specified, it's assumed to be a `string` column.
51
+ * Column names ending in `_id` and `_count` are assumed to be of type `integer`.
30
52
  * Column names ending in `_at` are assumed to be of type `datetime`.
31
53
  * Column names ending in `_on` are assumed to be of type `date`.
32
- * Boolean columns are assumed to be given a default of `false`.
33
- * Adds ActiveRecord::Base `.read` method to provide symmetry with `.create`, `.update`, and `.delete`
54
+
55
+ Also, note that `_id` columns are further assumed to be foreign keys and will **automatically generate a database index for that column**.
56
+
57
+ So the above models could be written as:
58
+
59
+ ```
60
+ Book
61
+ title
62
+ copies_on_hand: integer
63
+ author_id
64
+ created_at
65
+ updated_at
66
+ paperback: boolean
67
+
68
+ Author
69
+ last_name
70
+ first_name
71
+ book_count
72
+ ```
73
+
74
+ Finally, you can specify default values for columns in several ways. Suppose we want to make sure that `copies_on_hand` always has the value `0` for new rows. First, the fancy way:
75
+
76
+ ```
77
+ Book
78
+ title
79
+ copies_on_hand: integer, default: 0
80
+ author_id
81
+ created_at
82
+ updated_at
83
+ paperback: boolean
84
+
85
+ Author
86
+ last_name
87
+ first_name
88
+ book_count: integer, default: 0
89
+ ```
90
+
91
+ The syntax is forgiving, so the comma and colon are just for readability; this would work too:
92
+
93
+ ```
94
+ Book
95
+ title
96
+ copies_on_hand: integer default 0
97
+ author_id
98
+ created_at
99
+ updated_at
100
+ paperback: boolean
101
+
102
+ Author
103
+ last_name
104
+ first_name
105
+ book_count: integer default 0
106
+ ```
107
+
108
+ And for the extra lazy like me, you can use parentheses:
109
+
110
+ ```
111
+ Book
112
+ title
113
+ copies_on_hand: integer(0)
114
+ author_id
115
+ created_at
116
+ updated_at
117
+ paperback: boolean
118
+
119
+ Author
120
+ last_name
121
+ first_name
122
+ book_count(0)
123
+ ```
124
+
125
+ * Boolean columns are assumed to be given a default of `false` if not otherwise specified.
126
+
127
+
128
+ ### 2. More Model Enhancements
129
+
130
+ * Adds ActiveRecord::Base `.read` method so that models have complete *CRUD*: `.create`, `.read`, `.update`, and `.delete`. When given an integer, `.read` becomes a synonym for `.find`. When given a hash, it is a synonym for `.where`.
34
131
  * Adds ActiveRecord::Base `.sample` method to choose a random row.
132
+ * Adds ActiveRecord::Base `[id]` method as a synonym for `.find_by(id: ...)`. Especially handy in the console, i.e. `Book[5]` instead of `Book.find_by(id: 5)` and in controllers: `Book[params[:id]]` if you don't find the double bracing too harsh to look at.
133
+
134
+
135
+ ### 3. Beginner-friendly "It Just Works" console
136
+
137
+ * 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.
138
+ * Shows helpful instructions when console starts, including the list of model classes found in the application.
139
+ * Uses Hirb for table-like display. (Requires Hirb ~> 0.7.1)
140
+ * Patches Hirb to allow nice table output for `ActiveRecord::Relation` lists (i.e. result of `.all`, `.where`) and hash-like output for single ActiveRecord objects, such as the result of `.find_by(:title => 'Apollo 13')`.
141
+
35
142
 
36
143
  ### 4. Controller and View Enhancements
37
144
 
38
145
  * Easier JSON API calls by calling `EZ.from_api(url)`; returns parsed Ruby hash (or array, etc.)
39
146
  * Built-in view helper `<%= weather %>` and `EZ.weather` for classroom demo of a JSON API, to get quick hash and avoid gory details. (Relies on http://openweathermap.org). Default location is Evanston. Can pass location: `<%= weather('San Diego, CA') %>`. The `<%= weather %>` helper just delegates to `EZ.weather`.
40
- * Adds controller and view helpers `current_user`, `user_signed_in?`, `sign_in_as`, and `sign_out` to avoid cookies/session hash details
41
- * Adds view helper `map` to display a quick static map of any address. Example: `<%= map('Millenium Park, Chicago, IL') %>`
147
+ * Adds view helper `map` to display a static Google map of any address. Example: `<%= map('Millenium Park, Chicago, IL') %>`
data/lib/ez.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  require "ez/version"
2
2
  # require 'ez/dispatcher.rb'
3
3
  # require 'ez/mapper.rb'
4
- # require 'ez/controller.rb'
4
+ require 'ez/controller.rb'
5
5
 
6
6
  require 'ez/apis.rb'
7
7
  require 'ez/domain_modeler.rb'
@@ -14,6 +14,7 @@ module EZ
14
14
  class Railtie < Rails::Railtie
15
15
  rake_tasks do
16
16
  load "tasks/ez_tasks.rake"
17
+ Rake::Task["db:migrate"].enhance ["ez:tables"]
17
18
  end
18
19
 
19
20
  console do |app|
@@ -1,25 +1,17 @@
1
1
  module ActionController
2
2
  class Base
3
3
 
4
- helper_method :current_user
5
- helper_method :user_signed_in?
4
+ if Rails.env.development?
6
5
 
7
- def user_signed_in?
8
- session[:user_id].present?
9
- end
10
-
11
- def sign_in_as(user)
12
- @current_user = user
13
- session[:user_id] = user.try(:id)
14
- user
15
- end
6
+ before_action :ez_update_tables
16
7
 
17
- def sign_out
18
- sign_in_as nil
19
- end
8
+ def ez_update_tables
9
+ Rails.cache.fetch('ez-generate-yml') do
10
+ EZ::DomainModeler.generate_models_yml
11
+ end
12
+ EZ::DomainModeler.update_tables
13
+ end
20
14
 
21
- def current_user(klass = User)
22
- @current_user ||= klass.send(:find_by, id: session[:user_id])
23
15
  end
24
16
 
25
17
  end
@@ -1,28 +1,28 @@
1
1
  # require_relative './jeff_controller.rb'
2
2
 
3
- module ActionDispatch
4
- module Routing
5
- class RouteSet
6
- class Dispatcher
7
- def controller(params, default_controller=true)
8
- if params && params.key?(:controller)
9
- controller_param = params[:controller]
10
- controller_reference(controller_param)
11
- end
12
- rescue NameError => e
13
- raise ActionController::RoutingError, e.message, e.backtrace if default_controller
14
- end
3
+ # module ActionDispatch
4
+ # module Routing
5
+ # class RouteSet
6
+ # class Dispatcher
7
+ # def controller(params, default_controller=true)
8
+ # if params && params.key?(:controller)
9
+ # controller_param = params[:controller]
10
+ # controller_reference(controller_param)
11
+ # end
12
+ # rescue NameError => e
13
+ # raise ActionController::RoutingError, e.message, e.backtrace if default_controller
14
+ # end
15
15
 
16
- def controller_reference(controller_param)
17
- begin
18
- const_name = @controller_class_names[controller_param] ||= "#{controller_param.camelize}Controller"
19
- ActiveSupport::Dependencies.constantize(const_name)
20
- rescue NameError => e
21
- Kernel.class_eval("class ::#{const_name} < ApplicationController; end")
22
- ActiveSupport::Dependencies.constantize("::#{const_name}")
23
- end
24
- end
25
- end
26
- end
27
- end
28
- end
16
+ # def controller_reference(controller_param)
17
+ # begin
18
+ # const_name = @controller_class_names[controller_param] ||= "#{controller_param.camelize}Controller"
19
+ # ActiveSupport::Dependencies.constantize(const_name)
20
+ # rescue NameError => e
21
+ # Kernel.class_eval("class ::#{const_name} < ApplicationController; end")
22
+ # ActiveSupport::Dependencies.constantize("::#{const_name}")
23
+ # end
24
+ # end
25
+ # end
26
+ # end
27
+ # end
28
+ # end
@@ -3,44 +3,117 @@ require_relative 'schema_modifier'
3
3
  module EZ
4
4
  class DomainModeler
5
5
 
6
+ DEFAULT_VALUE_REGEXES = [/\s*\((.+)?\)/, /\s+(.+)?\s*/, /,\s*default:\s*(.+)?\s*/]
7
+
8
+ attr_reader :spec
9
+
6
10
  def initialize
7
- load_model_specs
11
+ begin
12
+ load_model_specs
13
+ rescue => e
14
+ puts e
15
+ end
8
16
  end
9
17
 
10
- def self.update_tables
11
- self.new.update_tables
18
+ def self.generate_models_yml
19
+ filename = Rails.root + "db/models.yml"
20
+ unless File.exist?(filename)
21
+ File.open(filename, "w") do |f|
22
+ f.puts <<-EOS
23
+ # Example table for a typical Book model.
24
+ #
25
+ Book
26
+ title: string
27
+ price: integer
28
+ author: string
29
+ summary: text
30
+ hardcover: boolean
31
+ #
32
+ # Indent consistently! Follow the above syntax exactly.
33
+ # Typical column choices are: string, text, integer, boolean, date, and datetime.
34
+ #
35
+ # Default column values can be specified like this:
36
+ # price: integer(0)
37
+ #
38
+ # Have fun!
39
+
40
+ EOS
41
+ end
42
+ end
12
43
  end
13
44
 
14
- def update_tables
15
- SchemaModifier.migrate(@spec)
45
+ def self.update_tables(silent = false)
46
+ self.new.update_tables(silent)
16
47
  end
17
48
 
18
- def load_model_specs
19
- @spec = YAML.load_file('db/models.yml')
20
- @spec ||= {}
49
+ def update_tables(silent = false)
50
+ SchemaModifier.migrate(@spec, silent)
51
+
52
+ rescue => e
53
+ puts e.message unless silent
54
+ puts e.backtrace.first unless silent
55
+ end
56
+
57
+ def load_model_specs_from_string(s)
58
+
59
+ # Append missing colons
60
+ s.gsub!(/^((\s|\-)*\w[^\:]+?)$/, '\1:')
61
+
62
+ # Replace ", default:" syntax so YAML doesn't try to parse it
63
+ s.gsub!(/,?\s*(default)?:?\s(\S)\s*$/, '(\2)')
64
+
65
+ # For backward compatibility with old array syntax
66
+ s.gsub!(/^(\s*)\-\s*/, '\1')
67
+
68
+ @spec = YAML.load(s)
69
+ parse_model_spec
21
70
 
71
+ # puts "@spec:"
72
+ # puts @spec.inspect
73
+ # puts "-" * 10
74
+ end
75
+
76
+ def load_model_specs(filename = "db/models.yml")
77
+ load_model_specs_from_string(IO.read(filename))
78
+ end
79
+
80
+ def parse_model_spec
81
+ @spec ||= {}
22
82
  @spec.each do |model, columns|
23
- @spec[model] = []
24
- columns.each do |column|
25
- if column.is_a?(String) || column.is_a?(Symbol)
26
- if column.to_s =~ /_id$/ || column.to_s =~ /_count$/
27
- @spec[model] << { column.to_s => 'integer' }
28
- elsif column.to_s =~ /_at$/
29
- @spec[model] << { column.to_s => 'datetime' }
30
- elsif column.to_s =~ /_on$/
31
- @spec[model] << { column.to_s => 'date' }
32
- else
33
- @spec[model] << { column.to_s => 'string' }
34
- end
35
- elsif column.is_a?(Hash) && column.keys.count == 1
36
- @spec[model] << { column.keys.first.to_s => column.values.first.to_s }
37
- else
38
- raise "Bad syntax around `#{column.inspect}`"
39
- end
83
+
84
+ if !columns.is_a?(Hash)
85
+ raise "Could not understand models.yml while parsing model: #{model}"
86
+ end
87
+
88
+ columns.each do |column_name, column_type|
89
+ interpret_column_spec column_name, column_type, model
40
90
  end
41
91
  end
92
+
42
93
  end
43
94
 
95
+ def interpret_column_spec(column_name, column_type, model)
96
+ column_type ||= begin
97
+ if column_name =~ /_id|_count$/
98
+ 'integer'
99
+ elsif column_name =~ /_at$/
100
+ 'datetime'
101
+ elsif column_name =~ /_on$/
102
+ 'date'
103
+ elsif column_name =~ /\?$/
104
+ 'boolean'
105
+ else
106
+ 'string'
107
+ end
108
+ end
109
+
110
+ default_column_value = (column_type == 'boolean' ? true : nil)
111
+ DEFAULT_VALUE_REGEXES.each { |r| default_column_value = $1 if column_type.sub!(r, '') }
112
+ default_column_value = default_column_value.to_i if column_type == 'integer'
113
+ default_column_value = default_column_value.to_f if column_type == 'float'
114
+
115
+ @spec[model][column_name] = { type: column_type, default: default_column_value}
116
+ end
44
117
  end
45
118
 
46
119
  end
@@ -1,22 +1,22 @@
1
- module ActionDispatch
2
- module Routing
3
- class Mapper
4
- class Mapping
1
+ # module ActionDispatch
2
+ # module Routing
3
+ # class Mapper
4
+ # class Mapping
5
5
 
6
- def route_uses_slash_and_no_hash?
7
- @options[:to].is_a?(String) &&
8
- @options[:to].index('#').nil? &&
9
- @options[:to].index('/')
10
- end
6
+ # def route_uses_slash_and_no_hash?
7
+ # @options[:to].is_a?(String) &&
8
+ # @options[:to].index('#').nil? &&
9
+ # @options[:to].index('/')
10
+ # end
11
11
 
12
- def to
13
- if route_uses_slash_and_no_hash?
14
- @options[:to].sub('/','#')
15
- else
16
- @options[:to]
17
- end
18
- end
19
- end
20
- end
21
- end
22
- end
12
+ # def to
13
+ # if route_uses_slash_and_no_hash?
14
+ # @options[:to].sub('/','#')
15
+ # else
16
+ # @options[:to]
17
+ # end
18
+ # end
19
+ # end
20
+ # end
21
+ # end
22
+ # end
@@ -32,4 +32,22 @@ class ActiveRecord::Base
32
32
  offset(rand(0...count)).first
33
33
  end
34
34
 
35
+ def self.none?
36
+ self.count == 0
37
+ end
38
+
39
+ def self.to_ez
40
+ s = self.name + ":\n"
41
+ columns.each do |column|
42
+ s << " - #{column.name}: #{column.type}\n" unless column.name == 'id'
43
+ end
44
+ s
45
+ end
46
+
47
+ def self.dump_tables_to_ez
48
+ (connection.tables - ['schema_migrations']).each do |table|
49
+ puts table.classify.constantize.to_ez
50
+ end
51
+ end
52
+
35
53
  end
@@ -3,13 +3,14 @@ module EZ
3
3
 
4
4
  attr_reader :db, :spec
5
5
 
6
- def initialize(model_spec)
6
+ def initialize(model_spec, silent = false)
7
+ @silent = silent
7
8
  @spec = model_spec
8
9
  connect_to_database
9
10
  end
10
11
 
11
- def self.migrate(model_spec)
12
- self.new(model_spec).migrate
12
+ def self.migrate(model_spec, silent = false)
13
+ self.new(model_spec, silent).migrate
13
14
  end
14
15
 
15
16
  def migrate
@@ -21,7 +22,7 @@ module EZ
21
22
  if @changed
22
23
  update_schema_version
23
24
  else
24
- puts "Everything is up-to-date."
25
+ puts "All tables are up-to-date."
25
26
  end
26
27
 
27
28
  return @changed
@@ -55,15 +56,15 @@ module EZ
55
56
  end
56
57
 
57
58
  def display_change(message)
58
- puts message
59
+ puts message unless @silent
59
60
  @changed = true
60
61
  end
61
62
 
62
63
  def add_missing_columns(model_name, columns, assume_missing = false)
63
64
  table_name = model_name.tableize
64
- columns.each do |column|
65
- col_name = column.keys.first
66
- col_type = column[col_name]
65
+ # {"nickname"=>{:type=>"string", :default=>nil}, "password_digest"=>{:type=>"string", :default=>nil}, "created_at"=>{:type=>"datetime", :default=>nil}, "updated_at"=>{:type=>"datetime", :default=>nil}, "course_id"=>{:type=>"integer", :default=>"(0)"}, "email"=>{:type=>"string", :default=>nil}, "full_name"=>{:type=>"string", :default=>nil}, "admin"=>{:type=>"boolean", :default=>true}}
66
+ columns.each do |col_name, data|
67
+ col_type = data[:type]
67
68
  if !assume_missing && db.column_exists?(table_name, col_name.to_sym)
68
69
  unless db.column_exists?(table_name, col_name.to_sym, col_type.to_sym)
69
70
  display_change "Changing column type for '#{col_name}' to #{col_type}"
@@ -93,16 +94,6 @@ module EZ
93
94
  display_change "Defining new table for model '#{model_name}'."
94
95
  db.create_table table_name
95
96
  add_missing_columns model_name, columns, true
96
- # columns.each do |column|
97
- # name = column.keys.first
98
- # col_type = column[name]
99
- # options = {}
100
- # options[:default] = false if col_type.to_sym == :boolean
101
- # t.send(col_type, name, options)
102
- # end
103
- # # t.timestamps
104
- # end
105
- # end
106
97
  filename = "app/models/#{model_name.underscore}.rb"
107
98
  unless Rails.env.production? || File.exists?(filename)
108
99
  display_change "Creating new model file: #{filename}"
@@ -121,12 +112,12 @@ module EZ
121
112
  def remove_dead_columns
122
113
  tables.each do |table_name|
123
114
  model_name = table_name.classify.to_s
115
+
124
116
  if @spec.has_key?(model_name)
125
- columns = db.columns(table_name).map { |column| column.name.to_sym } - [:id, :created_at, :updated_at]
126
- spec_columns = @spec[model_name].map do |column_entry|
127
- column_entry.is_a?(Hash) ? column_entry.keys.first.to_sym : column_entry.to_sym
128
- end
129
- dead_columns = columns - spec_columns
117
+ db_columns = db.columns(table_name).map { |column| column.name.to_sym } - [:id, :created_at, :updated_at]
118
+ spec_columns = @spec[model_name].keys.map(&:to_sym)
119
+ dead_columns = db_columns - spec_columns
120
+
130
121
  if dead_columns.any?
131
122
  dead_columns.each do |dead_column_name|
132
123
  display_change "Removing unused column '#{dead_column_name}' from model '#{model_name}'"
@@ -148,10 +139,26 @@ module EZ
148
139
 
149
140
  dead_tables.each do |table_name|
150
141
  model_name = table_name.classify
142
+ display_change "Yo"
151
143
  display_change "Dropping model #{model_name}"
152
144
  db.drop_table(table_name)
153
- display_change "Deleting file #{model_name.underscore}.rb"
154
- File.unlink "app/models/#{model_name.underscore}.rb" rescue nil
145
+ begin
146
+ filename = "app/models/#{model_name.underscore}.rb"
147
+ code = IO.read(filename)
148
+ matched = IO.read(filename) =~ /\s*class #{model_name} < ActiveRecord::Base\s+end\s*/
149
+
150
+ display_change "-" * 20
151
+ display_change matched
152
+ display_change code
153
+ display_change "-" * 20
154
+
155
+ if matched
156
+ display_change "Deleting file #{filename}"
157
+ File.unlink(filename)
158
+ end
159
+ rescue => e
160
+ display_change "Could not delete old model #{model_name.underscore}.rb."
161
+ end
155
162
  end
156
163
  end
157
164
 
@@ -1,3 +1,3 @@
1
1
  module EZ
2
- VERSION = "0.9.1"
2
+ VERSION = "0.9.5"
3
3
  end
@@ -8,16 +8,21 @@ namespace :ez do
8
8
  f.puts <<-EOS
9
9
  # Example table for a typical Book model.
10
10
  #
11
- # Book:
12
- # - title: string
13
- # - price: integer
14
- # - author: string
15
- # - summary: text
16
- # - hardcover: boolean
11
+ Book
12
+ title: string
13
+ price: integer
14
+ author: string
15
+ summary: text
16
+ hardcover: boolean
17
17
  #
18
- # Follow the syntax exactly (colons and spacing are important).
19
- # Column type choices are: string, text, integer, and boolean.
20
- # You can have as many models as you want in this file.
18
+ # Indent consistently! Follow the above syntax exactly.
19
+ # Typical column choices are: string, text, integer, boolean, date, and datetime.
20
+ #
21
+ # Default column values can be specified like this:
22
+ # price: integer(0)
23
+ #
24
+ # Have fun!
25
+
21
26
  EOS
22
27
  end
23
28
  end
@@ -29,7 +34,8 @@ EOS
29
34
 
30
35
 
31
36
  desc "Attempts to update the database schema and model files with minimal data loss."
32
- task :tables => [:environment, 'db:migrate'] do
37
+ task :tables => [:environment] do
38
+ puts "Running ez:tables..."
33
39
  if File.exists?('db/models.yml')
34
40
  if EZ::DomainModeler.update_tables
35
41
  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.1
4
+ version: 0.9.5
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-07-02 00:00:00.000000000 Z
11
+ date: 2014-08-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: hirb