active_record_inline_schema 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.
data/CHANGELOG CHANGED
@@ -1,3 +1,10 @@
1
+ 0.6.1 / 2013-03-15
2
+
3
+ * Enhancements
4
+
5
+ * :dry_run option that just prints info to your log
6
+ * if AR::Base#primary_key is false-y (e.g. you set Pet.primary_key = false), don't automatically create a primary key column
7
+
1
8
  0.6.0 / 2012-11-29
2
9
 
3
10
  * Breaking changes
@@ -123,4 +130,4 @@ After I made this list, I decided to diverge from mini_record v0.2.1 instead of
123
130
  * automagically generate fields from associations
124
131
  * revised difference checking code
125
132
 
126
- Pity the forker (me)!
133
+ Pity the forker (me)!
data/README.md CHANGED
@@ -4,6 +4,8 @@ Define table structure (columns and indexes) inside your ActiveRecord models lik
4
4
 
5
5
  Specify columns like you would with ActiveRecord migrations and then run .auto_upgrade! Based on the mini_record gem from Davide D'Agostino, it adds fewer aliases, doesn't create timestamps and relationship columns automatically.
6
6
 
7
+ You don't have to be connected to the database when you run the DSL methods.
8
+
7
9
  ## Production use
8
10
 
9
11
  Over 2 years in [Brighter Planet's environmental impact API](http://impact.brighterplanet.com) and [reference data service](http://data.brighterplanet.com).
@@ -40,6 +42,12 @@ Lots and lots of use in the [`earth` library](https://github.com/brighterplanet/
40
42
  end
41
43
  ApiResponse.auto_upgrade!
42
44
 
45
+ # you can also do this
46
+ ApiResponse.auto_upgrade! :dry_run => true
47
+
48
+ # this won't delete columns that it doesn't know about
49
+ ApiResponse.auto_upgrade! :gentle => true
50
+
43
51
  ## Credits
44
52
 
45
53
  Massive thanks to DAddYE, who you follow on twitter [@daddye](http://twitter.com/daddye) and look at his site at [daddye.it](http://www.daddye.it)
@@ -55,7 +63,7 @@ Forked from [`mini_record` version v0.2.1](https://github.com/DAddYE/mini_record
55
63
 
56
64
  ## Copyright
57
65
 
58
- Copyright 2012 Seamus Abshere
66
+ Copyright 2013 Seamus Abshere
59
67
 
60
68
  Adapted from [mini_record](https://github.com/DAddYE/mini_record), which is copyright 2011 Davide D'Agostino
61
69
 
@@ -1,4 +1,5 @@
1
1
  require 'set'
2
+ require 'logger'
2
3
 
3
4
  class ActiveRecordInlineSchema::Config
4
5
  attr_reader :model
@@ -19,18 +20,28 @@ class ActiveRecordInlineSchema::Config
19
20
  ideal_indexes.add Index.new(self, column_name, options)
20
21
  end
21
22
 
23
+ def log_dry(msg)
24
+ (ActiveRecord::Base.logger || (@logger ||= Logger.new($stderr))).info "[ActiveRecordInlineSchema DRY RUN] #{msg}"
25
+ end
26
+
22
27
  def apply(options)
23
- non_standard_primary_key = if (primary_key_column = find_ideal_column(model.primary_key))
24
- primary_key_column.type != :primary_key
28
+ dry_run = options.fetch(:dry_run, false)
29
+ has_primary_key = true
30
+ non_standard_primary_key = false
31
+
32
+ if !model.primary_key
33
+ has_primary_key = false
34
+ elsif (primary_key_column = find_ideal_column(model.primary_key))
35
+ non_standard_primary_key = (primary_key_column.type != :primary_key)
25
36
  elsif model.primary_key != 'id'
26
- true
37
+ non_standard_primary_key = true
27
38
  end
28
39
 
29
40
  if non_standard_primary_key
30
41
  if primary_key_column and (postgresql? or sqlite?)
31
42
  primary_key_column.options[:null] = false
32
43
  end
33
- else
44
+ elsif has_primary_key
34
45
  add_ideal_column :id, :type => :primary_key
35
46
  end
36
47
 
@@ -54,7 +65,11 @@ class ActiveRecordInlineSchema::Config
54
65
  end
55
66
 
56
67
  statements.each do |sql|
57
- connection.execute sql
68
+ if dry_run
69
+ log_dry sql
70
+ else
71
+ connection.execute sql
72
+ end
58
73
  end
59
74
  safe_reset_column_information
60
75
  end
@@ -69,7 +84,11 @@ class ActiveRecordInlineSchema::Config
69
84
  existing_column_names.reject do |existing_column_name|
70
85
  find_ideal_column existing_column_name
71
86
  end.each do |existing_column_name|
72
- connection.remove_column model.table_name, existing_column_name
87
+ if dry_run
88
+ log_dry "remove column #{model.table_name}.#{existing_column_name}"
89
+ else
90
+ connection.remove_column model.table_name, existing_column_name
91
+ end
73
92
  end
74
93
  end
75
94
 
@@ -77,7 +96,11 @@ class ActiveRecordInlineSchema::Config
77
96
  ideal_columns.reject do |ideal_column|
78
97
  find_existing_column ideal_column.name
79
98
  end.each do |ideal_column|
80
- connection.add_column model.table_name, ideal_column.name, ideal_column.type, ideal_column.options
99
+ if dry_run
100
+ log_dry "add column #{model.table_name}.#{ideal_column.name} #{ideal_column.type} #{ideal_column.options.inspect}"
101
+ else
102
+ connection.add_column model.table_name, ideal_column.name, ideal_column.type, ideal_column.options
103
+ end
81
104
  end
82
105
 
83
106
  # Change attributes of existent columns
@@ -101,7 +124,11 @@ class ActiveRecordInlineSchema::Config
101
124
 
102
125
  # Change the column if applicable
103
126
  if type_changed or option_changes.any?
104
- connection.change_column model.table_name, existing_column_name, ideal_column.type, option_changes
127
+ if dry_run
128
+ log_dry "change column #{model.table_name}.#{existing_column_name} #{ideal_column.type} #{option_changes.inspect}"
129
+ else
130
+ connection.change_column model.table_name, existing_column_name, ideal_column.type, option_changes
131
+ end
105
132
  end
106
133
  end
107
134
 
@@ -110,7 +137,11 @@ class ActiveRecordInlineSchema::Config
110
137
  existing_index_names.reject do |existing_index_name|
111
138
  find_ideal_index existing_index_name
112
139
  end.each do |existing_index_name|
113
- connection.remove_index model.table_name, :name => existing_index_name
140
+ if dry_run
141
+ log_dry "remove index #{model.table_name} #{existing_index_name}"
142
+ else
143
+ connection.remove_index model.table_name, :name => existing_index_name
144
+ end
114
145
  end
115
146
  end
116
147
 
@@ -118,7 +149,11 @@ class ActiveRecordInlineSchema::Config
118
149
  ideal_indexes.reject do |ideal_index|
119
150
  find_existing_index ideal_index.name
120
151
  end.each do |ideal_index|
121
- connection.add_index model.table_name, ideal_index.column_name, ideal_index.options
152
+ if dry_run
153
+ log_dry "add index #{model.table_name}.#{ideal_index.column_name} #{ideal_index.options.inspect}"
154
+ else
155
+ connection.add_index model.table_name, ideal_index.column_name, ideal_index.options
156
+ end
122
157
  end
123
158
 
124
159
  safe_reset_column_information
@@ -190,6 +225,6 @@ class ActiveRecordInlineSchema::Config
190
225
  end
191
226
 
192
227
  def postgresql?
193
- connection.adapter_name =~ /postgresql/i
228
+ connection.adapter_name =~ /postgres/i
194
229
  end
195
230
  end
@@ -1,3 +1,3 @@
1
1
  module ActiveRecordInlineSchema
2
- VERSION = "0.6.0"
2
+ VERSION = "0.6.1"
3
3
  end
@@ -109,6 +109,12 @@ class Pet6 < ActiveRecord::Base
109
109
  col :yesno, :type => :boolean
110
110
  end
111
111
 
112
+ class Pet7 < ActiveRecord::Base
113
+ include SpecHelper
114
+ self.primary_key = false
115
+ col :name
116
+ end
117
+
112
118
  case ENV['DB_ADAPTER']
113
119
  when 'mysql'
114
120
  class CustomMysql < ActiveRecord::Base
@@ -122,4 +128,4 @@ when 'postgresql'
122
128
  col :inet, :type => 'inet'
123
129
  col :bytea, :type => 'bytea'
124
130
  end
125
- end
131
+ end
@@ -6,12 +6,7 @@ describe ActiveRecordInlineSchema do
6
6
  end
7
7
 
8
8
  describe :regressions do
9
- def assert_unique(model, column_name, v)
10
- e = if sqlite?
11
- ActiveRecord::StatementInvalid
12
- else
13
- ActiveRecord::RecordNotUnique
14
- end
9
+ def assert_unique(model, column_name, v, e = ActiveRecord::RecordNotUnique)
15
10
  lambda do
16
11
  2.times do
17
12
  p = model.new
@@ -22,8 +17,13 @@ describe ActiveRecordInlineSchema do
22
17
  end
23
18
 
24
19
  it "properly creates tables with only one column, an auto-increment primary key" do
20
+ e = if sqlite?
21
+ ActiveRecord::StatementInvalid
22
+ else
23
+ ActiveRecord::RecordNotUnique
24
+ end
25
25
  Pet3.auto_upgrade!
26
- assert_unique Pet3, :id, 1
26
+ assert_unique Pet3, :id, 1, e
27
27
  end
28
28
 
29
29
  it "properly creates with only one column, a string primary key" do
@@ -47,6 +47,13 @@ describe ActiveRecordInlineSchema do
47
47
  Pet6.columns_hash['yesno'].type.must_equal :boolean
48
48
  end
49
49
 
50
+ it "doesn't force you to have a primary key" do
51
+ Pet7.auto_upgrade!
52
+ Pet7.primary_key.must_equal false
53
+ Pet7.columns_hash['id'].must_equal nil
54
+ Pet7.columns_hash['name'].type.must_equal :string
55
+ end
56
+
50
57
  it "deletes unrecognized columns by default" do
51
58
  Pet6.auto_upgrade!
52
59
  ActiveRecord::Base.connection.add_column Pet6.table_name, 'foo', :string
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_record_inline_schema
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.6.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2012-11-30 00:00:00.000000000 Z
13
+ date: 2013-03-15 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: activesupport
@@ -93,7 +93,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
93
93
  version: '0'
94
94
  requirements: []
95
95
  rubyforge_project:
96
- rubygems_version: 1.8.24
96
+ rubygems_version: 1.8.25
97
97
  signing_key:
98
98
  specification_version: 3
99
99
  summary: Define table structure (columns and indexes) inside your ActiveRecord models