ez 0.6.0 → 0.6.1

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: 5a1ae8f83dfbc462ce1844beaa84360c5ceea78f
4
- data.tar.gz: d216395f9457c0fd87114e70559fc110b416aaba
3
+ metadata.gz: 279ca85b40bfbf58aebba60d1a527a2da47f6daf
4
+ data.tar.gz: b2da5c258394b5642d32d9fcd8d4991f50bd23d1
5
5
  SHA512:
6
- metadata.gz: 10cae9a53bb3256267721b2b6c36876cd32f607cafaa296d54afcad46e06778f4e39fb5e8cfb1559607d048b20e1a6d68ea373f6ca0a31a2c2d89b22f13b2536
7
- data.tar.gz: a7945abd11a627c9cc2a04243cd7a053b3a314c164a7e23890d09faee7d157df91427451bdd115e151d8f56df2710db54192c3d765e82904a77d7f513ad6b799
6
+ metadata.gz: ccd1d6ac56b6d1e76552a68ee8e49029f0a1357782a08b9163a3a3bd513329dc7bec366192c537e1047cca6991aac59055ffd42880c485429472424df6423c48
7
+ data.tar.gz: 695590626c05bdc3a55d4d8f7fab4017c434b4f8584309584332b64f9ea4179f6c15dba81f43348a8647584d5edf6553138f371c2fd70de01318ffa0b602efab
data/README.md CHANGED
@@ -1,20 +1,16 @@
1
1
  # EZ
2
2
 
3
- For educational purposes only. Makes Rails a bit more beginner-friendly.
3
+ * For educational purposes only. Makes Rails a bit more beginner-friendly.
4
+ * Depends on Hirb ~> 0.7.1
5
+ * Patches the Rails dispatcher to avoid writing controllers for simple views by adding route support for `get "url" => "folder/file"`
6
+ * Enables instant modeling without migrations via `models.yml` and `rake ez:tables`
7
+ * Quick JSON API calls with `EZ.from_api(url)`, returns parsed Ruby hash (or array, etc.)
8
+ * Built-in `EZ.weather(location)` for classroom demo of API, to get quick hash and avoid JSON explanation. Relies on http://openweathermap.org
9
+ * Adds controller and view helpers `current_user`, `user_signed_in?`, `sign_in_as`, and `sign_out` to avoid cookies/session hash details
10
+ * Adds ActiveRecord::Base `read` method to provide symmetry with `create`, `update`, and `delete`
11
+ * Adds ActiveRecord::Base `sample` method to choose a random row
12
+ * Patches Hirb to allow table output for `ActiveRecord::Relation` lists (i.e. result of `.all`, `.where` or `.read(:col => value)` but normal output for single ActiveRecord objects, like the result of `.find_by(:id => id)` or `read(id)`
4
13
 
5
- ## Installation
6
-
7
- Add this line to your application's Gemfile:
8
-
9
- gem 'ez'
10
-
11
- And then execute:
12
-
13
- $ bundle
14
-
15
- Or install it yourself as:
16
-
17
- $ gem install ez
18
14
 
19
15
 
20
16
 
@@ -1,35 +1,38 @@
1
1
  require_relative 'schema_modifier'
2
2
 
3
- class DomainModeler
3
+ module EZ
4
+ class DomainModeler
4
5
 
5
- def initialize
6
- load_model_specs
7
- end
6
+ def initialize
7
+ load_model_specs
8
+ end
8
9
 
9
- def self.update_tables
10
- self.new.update_tables
11
- end
10
+ def self.update_tables
11
+ self.new.update_tables
12
+ end
12
13
 
13
- def update_tables
14
- SchemaModifier.migrate(@spec)
15
- end
14
+ def update_tables
15
+ SchemaModifier.migrate(@spec)
16
+ end
16
17
 
17
- def load_model_specs
18
- @spec = YAML.load_file('db/models.yml')
19
- @spec ||= {}
20
-
21
- @spec.each do |model, columns|
22
- @spec[model] = []
23
- columns.each do |column|
24
- if column.is_a?(String) || column.is_a?(Symbol)
25
- @spec[model] << { column.to_s => 'string' }
26
- elsif column.is_a?(Hash) && column.keys.count == 1
27
- @spec[model] << { column.keys.first.to_s => column.values.first.to_s }
28
- else
29
- raise "Bad syntax."
18
+ def load_model_specs
19
+ @spec = YAML.load_file('db/models.yml')
20
+ @spec ||= {}
21
+
22
+ @spec.each do |model, columns|
23
+ @spec[model] = []
24
+ columns.each do |column|
25
+ if column.is_a?(String) || column.is_a?(Symbol)
26
+ @spec[model] << { column.to_s => 'string' }
27
+ elsif column.is_a?(Hash) && column.keys.count == 1
28
+ @spec[model] << { column.keys.first.to_s => column.values.first.to_s }
29
+ else
30
+ raise "Bad syntax."
31
+ end
30
32
  end
31
33
  end
32
34
  end
35
+
33
36
  end
34
37
 
35
38
  end
@@ -1,144 +1,146 @@
1
- class SchemaModifier
1
+ module EZ
2
+ class SchemaModifier
2
3
 
3
- attr_reader :db, :spec
4
+ attr_reader :db, :spec
4
5
 
5
- def initialize(model_spec)
6
- @spec = model_spec
7
- connect_to_database
8
- end
6
+ def initialize(model_spec)
7
+ @spec = model_spec
8
+ connect_to_database
9
+ end
9
10
 
10
- def self.migrate(model_spec)
11
- self.new(model_spec).migrate
12
- end
11
+ def self.migrate(model_spec)
12
+ self.new(model_spec).migrate
13
+ end
13
14
 
14
- def migrate
15
- @changed = false
15
+ def migrate
16
+ @changed = false
16
17
 
17
- add_missing_schema
18
- remove_dead_schema
19
- update_schema_version
18
+ add_missing_schema
19
+ remove_dead_schema
20
+ update_schema_version
20
21
 
21
- puts "Everything is up-to-date." unless @changed
22
- end
22
+ puts "Everything is up-to-date." unless @changed
23
+ end
23
24
 
24
25
 
25
- def tables
26
- @tables ||= (db.tables - ['schema_migrations'])
27
- end
26
+ def tables
27
+ @tables ||= (db.tables - ['schema_migrations'])
28
+ end
28
29
 
29
- def missing_model?(model_name)
30
- missing_table?(model_name.tableize)
31
- end
30
+ def missing_model?(model_name)
31
+ missing_table?(model_name.tableize)
32
+ end
32
33
 
33
- def missing_table?(name)
34
- tables.index(name).nil?
35
- end
34
+ def missing_table?(name)
35
+ tables.index(name).nil?
36
+ end
36
37
 
37
- def add_missing_schema
38
- @spec.each do |model_name, columns|
39
- if missing_model?(model_name)
40
- add_model(model_name, columns)
41
- else
42
- add_missing_columns(model_name, columns)
38
+ def add_missing_schema
39
+ @spec.each do |model_name, columns|
40
+ if missing_model?(model_name)
41
+ add_model(model_name, columns)
42
+ else
43
+ add_missing_columns(model_name, columns)
44
+ end
43
45
  end
44
46
  end
45
- end
46
47
 
47
- def display_change(message)
48
- puts message
49
- @changed = true
50
- end
48
+ def display_change(message)
49
+ puts message
50
+ @changed = true
51
+ end
51
52
 
52
- def add_missing_columns(model_name, columns)
53
- table_name = model_name.tableize
54
- columns.each do |column|
55
- col_name = column.keys.first
56
- col_type = column[col_name]
57
- if db.column_exists?(table_name, col_name.to_sym)
58
- unless db.column_exists?(table_name, col_name.to_sym, col_type.to_sym)
59
- display_change "Changing column type for '#{col_name}' to #{col_type}"
60
- db.change_column(table_name, col_name.to_sym, col_type.to_sym)
53
+ def add_missing_columns(model_name, columns)
54
+ table_name = model_name.tableize
55
+ columns.each do |column|
56
+ col_name = column.keys.first
57
+ col_type = column[col_name]
58
+ if db.column_exists?(table_name, col_name.to_sym)
59
+ unless db.column_exists?(table_name, col_name.to_sym, col_type.to_sym)
60
+ display_change "Changing column type for '#{col_name}' to #{col_type}"
61
+ db.change_column(table_name, col_name.to_sym, col_type.to_sym)
62
+ end
63
+ else
64
+ display_change "Adding new column '#{col_name}' as #{col_type} for model #{model_name}"
65
+ db.add_column(table_name, col_name.to_sym, col_type.to_sym)
61
66
  end
62
- else
63
- display_change "Adding new column '#{col_name}' as #{col_type} for model #{model_name}"
64
- db.add_column(table_name, col_name.to_sym, col_type.to_sym)
65
67
  end
66
68
  end
67
- end
68
69
 
69
- def add_model(model_name, columns)
70
- table_name = model_name.tableize
71
- display_change "Defining model #{model_name}..."
72
- ActiveRecord::Schema.define do
73
- create_table table_name do |t|
74
- columns.each do |column|
75
- name = column.keys.first
76
- col_type = column[name]
77
- t.send(col_type, name)
70
+ def add_model(model_name, columns)
71
+ table_name = model_name.tableize
72
+ display_change "Defining model #{model_name}..."
73
+ ActiveRecord::Schema.define do
74
+ create_table table_name do |t|
75
+ columns.each do |column|
76
+ name = column.keys.first
77
+ col_type = column[name]
78
+ t.send(col_type, name)
79
+ end
80
+ # t.timestamps
78
81
  end
79
- # t.timestamps
80
82
  end
81
- end
82
- filename = "app/models/#{model_name.underscore}.rb"
83
- unless File.exists?(filename)
84
- display_change "Creating new model file: #{filename}"
85
- File.open(filename, "w") do |f|
86
- f.puts "class #{model_name} < ActiveRecord::Base"
87
- f.puts "end"
83
+ filename = "app/models/#{model_name.underscore}.rb"
84
+ unless File.exists?(filename)
85
+ display_change "Creating new model file: #{filename}"
86
+ File.open(filename, "w") do |f|
87
+ f.puts "class #{model_name} < ActiveRecord::Base"
88
+ f.puts "end"
89
+ end
88
90
  end
89
91
  end
90
- end
91
92
 
92
- def remove_dead_schema
93
- remove_dead_tables
94
- remove_dead_columns
95
- end
93
+ def remove_dead_schema
94
+ remove_dead_tables
95
+ remove_dead_columns
96
+ end
96
97
 
97
- def remove_dead_columns
98
- tables.each do |table_name|
99
- model_name = table_name.classify.to_s
100
- if @spec.has_key?(model_name)
101
- columns = db.columns(table_name).map { |column| column.name.to_sym } - [:id, :created_at, :updated_at]
102
- spec_columns = @spec[model_name].map do |column_entry|
103
- column_entry.is_a?(Hash) ? column_entry.keys.first.to_sym : column_entry.to_sym
104
- end
105
- dead_columns = columns - spec_columns
106
- if dead_columns.any?
107
- display_change "Removing unused columns: #{dead_columns.to_sentence} for model #{model_name}"
108
- db.remove_columns(table_name, *dead_columns)
98
+ def remove_dead_columns
99
+ tables.each do |table_name|
100
+ model_name = table_name.classify.to_s
101
+ if @spec.has_key?(model_name)
102
+ columns = db.columns(table_name).map { |column| column.name.to_sym } - [:id, :created_at, :updated_at]
103
+ spec_columns = @spec[model_name].map do |column_entry|
104
+ column_entry.is_a?(Hash) ? column_entry.keys.first.to_sym : column_entry.to_sym
105
+ end
106
+ dead_columns = columns - spec_columns
107
+ if dead_columns.any?
108
+ display_change "Removing unused columns: #{dead_columns.to_sentence} for model #{model_name}"
109
+ db.remove_columns(table_name, *dead_columns)
110
+ end
109
111
  end
110
112
  end
111
113
  end
112
- end
113
114
 
114
- def update_schema_version
115
- @db.initialize_schema_migrations_table
116
- @db.assume_migrated_upto_version(Time.now.strftime("%Y%m%d%H%M%S"))
117
- end
115
+ def update_schema_version
116
+ @db.initialize_schema_migrations_table
117
+ @db.assume_migrated_upto_version(Time.now.strftime("%Y%m%d%H%M%S"))
118
+ end
118
119
 
119
- def remove_dead_tables
120
- tables_we_need = @spec.keys.map { |model| model.tableize }
121
- dead_tables = tables - tables_we_need
120
+ def remove_dead_tables
121
+ tables_we_need = @spec.keys.map { |model| model.tableize }
122
+ dead_tables = tables - tables_we_need
122
123
 
123
- dead_tables.each do |table_name|
124
- model_name = table_name.classify
125
- display_change "Dropping model #{model_name}"
126
- db.drop_table(table_name)
127
- display_change "Deleting file #{model_name.underscore}.rb"
128
- File.unlink "app/models/#{model_name.underscore}.rb" rescue nil
124
+ dead_tables.each do |table_name|
125
+ model_name = table_name.classify
126
+ display_change "Dropping model #{model_name}"
127
+ db.drop_table(table_name)
128
+ display_change "Deleting file #{model_name.underscore}.rb"
129
+ File.unlink "app/models/#{model_name.underscore}.rb" rescue nil
130
+ end
129
131
  end
130
- end
131
132
 
132
- def silence_migration_output
133
- ActiveRecord::Migration.verbose = false
134
- end
133
+ def silence_migration_output
134
+ ActiveRecord::Migration.verbose = false
135
+ end
135
136
 
136
- def connect_to_database
137
- ActiveRecord::Base.establish_connection({
138
- adapter: 'sqlite3',
139
- database: "db/development.sqlite3",
140
- })
141
- @db = ActiveRecord::Base.connection
142
- end
137
+ def connect_to_database
138
+ ActiveRecord::Base.establish_connection({
139
+ adapter: 'sqlite3',
140
+ database: "db/development.sqlite3",
141
+ })
142
+ @db = ActiveRecord::Base.connection
143
+ end
143
144
 
145
+ end
144
146
  end
@@ -1,3 +1,3 @@
1
1
  module EZ
2
- VERSION = "0.6.0"
2
+ VERSION = "0.6.1"
3
3
  end
metadata CHANGED
@@ -1,61 +1,61 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ez
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.6.1
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-03-20 00:00:00.000000000 Z
11
+ date: 2014-03-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: hirb
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ~>
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
19
  version: 0.7.1
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ~>
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: 0.7.1
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: bundler
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ~>
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
33
  version: '1.3'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ~>
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '1.3'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rake
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ~>
45
+ - - "~>"
46
46
  - !ruby/object:Gem::Version
47
47
  version: '10.0'
48
- - - '>='
48
+ - - ">="
49
49
  - !ruby/object:Gem::Version
50
50
  version: 10.0.0
51
51
  type: :development
52
52
  prerelease: false
53
53
  version_requirements: !ruby/object:Gem::Requirement
54
54
  requirements:
55
- - - ~>
55
+ - - "~>"
56
56
  - !ruby/object:Gem::Version
57
57
  version: '10.0'
58
- - - '>='
58
+ - - ">="
59
59
  - !ruby/object:Gem::Version
60
60
  version: 10.0.0
61
61
  description: Gem for easier Rails development.
@@ -65,7 +65,7 @@ executables: []
65
65
  extensions: []
66
66
  extra_rdoc_files: []
67
67
  files:
68
- - .gitignore
68
+ - ".gitignore"
69
69
  - Gemfile
70
70
  - LICENSE.txt
71
71
  - README.md
@@ -122,17 +122,17 @@ require_paths:
122
122
  - lib
123
123
  required_ruby_version: !ruby/object:Gem::Requirement
124
124
  requirements:
125
- - - '>='
125
+ - - ">="
126
126
  - !ruby/object:Gem::Version
127
127
  version: '0'
128
128
  required_rubygems_version: !ruby/object:Gem::Requirement
129
129
  requirements:
130
- - - '>='
130
+ - - ">="
131
131
  - !ruby/object:Gem::Version
132
132
  version: '0'
133
133
  requirements: []
134
134
  rubyforge_project:
135
- rubygems_version: 2.2.0
135
+ rubygems_version: 2.2.2
136
136
  signing_key:
137
137
  specification_version: 4
138
138
  summary: For educational purposes only.