migrant 1.2.8 → 1.3.0

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.
@@ -41,6 +41,7 @@ correct database schema for you. Note that you don't need to specify foreign key
41
41
  they are automatically inferred from your relations. Here is a further example:
42
42
 
43
43
  class User < ActiveRecord::Base
44
+ # Define your associations BEFORE your structure block!
44
45
  has_many :businesses
45
46
 
46
47
  structure do
@@ -50,10 +51,10 @@ they are automatically inferred from your relations. Here is a further example:
50
51
  timestamps # Gets you a created_at, and updated_at
51
52
 
52
53
  # Use an array to specifiy multiple validations
53
- secret_code 5521, :validates => [:uniqueness, :numericality]
54
+ secret_code 5521, :validates => [:uniqueness, :numericality]
54
55
  end
55
56
  end
56
-
57
+
57
58
  Now, to get your database up to date simply run:
58
59
 
59
60
  > rake db:upgrade
@@ -77,6 +78,30 @@ By default, your database structure will be cloned to your test environment. If
77
78
  automatically, simply specify an environment variable directly:
78
79
 
79
80
  > rake db:upgrade RAILS_ENV=development
81
+
82
+ == Serialization
83
+
84
+ Keeping track of your serialized attributes can be done in the Migrant DSL (v1.3+), here's some examples:
85
+
86
+ class Business < ActiveRecord::Base
87
+ structure do
88
+ # Specify serialization automatically (e.g. using Hash, Array, OpenStruct)
89
+ awards ["Best Chicken 2007", "Business of the year 2008"]
90
+
91
+ # Serialization by example types
92
+ # This would load/store an OpenStruct but store as text in your database
93
+ staff :serialized, :example => OpenStruct.new("Manager" => "Joe")
94
+
95
+ # Default serialization storage (hash)
96
+ locations :serialized
97
+ end
98
+ end
99
+
100
+ These will call ActiveRecord::Base.serialize for you so don't do it again yourself! The mock generated would appear as:
101
+
102
+ irb(main):002:0> my_business = Business.mock
103
+ => #<Business id: nil, awards: ["Best Chicken 2007", "Business of the year 2008"], staff: #<OpenStruct manager="Joe">,
104
+ locations: {}>
80
105
 
81
106
  == Want more examples?
82
107
 
@@ -104,7 +129,6 @@ Simply run rake db:upgrade or rails generate migrations to get the required migr
104
129
 
105
130
  These actions won't be performed (because we don't want to hurt your data):
106
131
 
107
- * Remove tables/columns
108
132
  * Changing column types where data loss may occur (e.g. varchar -> int)
109
133
 
110
134
  == Getting a mock of your model
@@ -129,6 +153,10 @@ Add the following to support/env/pickle.rb:
129
153
 
130
154
  All pickle steps will then return a mocked model by default, overriden with any values you provide.
131
155
 
156
+ == Help
157
+
158
+ Be sure to check out the Github Wiki, or give me a shout on Twitter: @101pascal
159
+
132
160
  == Maintability / Usability concerns
133
161
  * You don't have to define a structure on every model, Migrant ignores models with no definitions
134
162
  * You can remove the structure definitions later and nothing bad will happen (besides losing automigration for those fields)
data/Rakefile CHANGED
@@ -1,5 +1,7 @@
1
1
  require 'rubygems'
2
2
  require 'bundler'
3
+ require 'simplecov'
4
+
3
5
  begin
4
6
  Bundler.setup(:default, :development)
5
7
  rescue Bundler::BundlerError => e
@@ -7,6 +9,18 @@ rescue Bundler::BundlerError => e
7
9
  $stderr.puts "Run `bundle install` to install missing gems"
8
10
  exit e.status_code
9
11
  end
12
+
13
+ SimpleCov.adapters.define 'migrant' do
14
+ add_filter '/test'
15
+ add_filter '/lib/tasks'
16
+ add_filter '/lib/railtie' # Not covering lines it's running here .. disabling for now
17
+ add_filter '/lib/simple_object'
18
+
19
+ add_group 'Core Extensions', '/lib/migrant'
20
+ add_group 'Schema Data Types', '/lib/datatype'
21
+ end
22
+ SimpleCov.start 'migrant'
23
+
10
24
  require 'rake'
11
25
  require 'rake/testtask'
12
26
  Rake::TestTask.new(:test) do |test|
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.2.8
1
+ 1.3.0
@@ -13,12 +13,12 @@ module DataType
13
13
  @value = options.delete(:value)
14
14
  @example = options.delete(:example)
15
15
  @field = options.delete(:field)
16
- @aliases = options.delete(:was) || Array.new
16
+ @aliases = options.delete(:was) || ::Array.new
17
17
  options[:type] = options.delete(:as) if options[:as] # Nice little DSL alias for 'type'
18
18
  end
19
19
 
20
20
  # Default is 'ye good ol varchar(255)
21
- def column_defaults
21
+ def column_defaults
22
22
  { :type => :string }
23
23
  end
24
24
 
@@ -31,9 +31,13 @@ module DataType
31
31
  column[:type] == compared_column[:type]
32
32
  end
33
33
 
34
- def mock
34
+ def mock
35
35
  @value || self.class.default_mock
36
36
  end
37
+
38
+ def serialized?
39
+ false
40
+ end
37
41
 
38
42
  # Default mock should be overridden in derived classes
39
43
  def self.default_mock
@@ -95,7 +95,7 @@ module DataType
95
95
  class Symbol < Base
96
96
  def column_defaults
97
97
  # Just construct whatever the user wants
98
- {:type => @value || :string }.merge(@options)
98
+ {:type => ((serialized?)? :text : @value) || :string }.merge(@options)
99
99
  end
100
100
 
101
101
  def mock
@@ -105,10 +105,52 @@ module DataType
105
105
  when :integer then Fixnum.default_mock
106
106
  when :decimal, :float then Float.default_mock
107
107
  when :datetime, :date then Date.default_mock
108
+ when :serialized, :serialize then (@example)? @example : Hash.default_mock
108
109
  end
109
110
  end
111
+
112
+ def serialized?
113
+ %W{serialized serialize}.include?(@value.to_s)
114
+ end
115
+
116
+ def serialized_class_name
117
+ klass_name = (@example)? @example.class.to_s : "Hash"
118
+
119
+ klass_name.constantize
120
+ end
121
+ end
122
+
123
+ # Objects
124
+ class Object < Base
125
+ def column_defaults
126
+ {:type => :text }
127
+ end
128
+
129
+ def self.default_mock
130
+ self.native_class.new
131
+ end
132
+
133
+ def mock
134
+ @value || self.default_mock
135
+ end
136
+
137
+ def serialized?
138
+ true
139
+ end
140
+
141
+ def serialized_class_name
142
+ self.class.native_class
143
+ end
144
+
145
+ def self.native_class
146
+ self.to_s.split('::').last.constantize
147
+ end
110
148
  end
111
149
 
150
+ # Store these objects serialized by default
151
+ class Array < Object; end;
152
+ class Hash < Object; end;
153
+ class OpenStruct < Object; end;
112
154
  end
113
155
 
114
156
 
@@ -2,7 +2,7 @@ class <%= @activity.camelize.gsub(/\s/, '') %> < ActiveRecord::Migration
2
2
  def self.up
3
3
  create_table :<%= @table_name %> do |t|
4
4
  <% @columns.each do |field, options| %>
5
- t.<%= options.delete(:type) %> :<%= field %><%= (options.blank?)? '': ", "+options.to_a.collect { |o| ":#{o[0]}=>#{o[1]}" }.sort.join(', ') %>
5
+ t.<%= options.delete(:type) %> :<%= field %><%= (options.blank?)? '': ", "+options.to_a.collect { |o| ":#{o[0]}=>#{o[1].inspect}" }.sort.join(', ') %>
6
6
  <% end %>
7
7
  end
8
8
  <% @indexes.each do |index| %>
@@ -18,7 +18,13 @@ module Migrant
18
18
  # Get all tables and compare to the desired schema
19
19
  # The next line is an evil hack to recursively load all model files in app/models
20
20
  # This needs to be done because Rails normally lazy-loads these files, resulting a blank descendants list of AR::Base
21
- Dir["#{Rails.root.to_s}/app/models/**/*.rb"].each { |f| require(f) }
21
+ model_root = "#{Rails.root.to_s}/app/models/"
22
+
23
+ Dir["#{model_root}**/*.rb"].each do |file|
24
+ if (model_name = file.sub(model_root, '').match(/(.*)?\.rb$/))
25
+ model_name[1].camelize.constantize
26
+ end
27
+ end
22
28
 
23
29
  ActiveRecord::Base.descendants.select { |model| model.schema && model.schema.requires_migration? }.each do |model|
24
30
  model.reset_column_information # db:migrate doesn't do this
@@ -146,11 +152,11 @@ module Migrant
146
152
  end
147
153
 
148
154
  begin
149
- message = "> #{message} [#{mappings.collect { |shortcut, choice| choice.to_s.sub(shortcut, '('+shortcut+')') }.join(' / ')}]: "
155
+ prompt = "> #{message} [#{mappings.collect { |shortcut, choice| choice.to_s.sub(shortcut, '('+shortcut+')') }.join(' / ')}]: "
150
156
  if warning
151
- STDOUT.print red, bold, message, reset
157
+ STDOUT.print red, bold, prompt, reset
152
158
  else
153
- STDOUT.print bold, message, reset
159
+ STDOUT.print bold, prompt, reset
154
160
  end
155
161
  STDOUT.flush
156
162
  input = STDIN.gets.downcase
@@ -1,15 +1,28 @@
1
1
  module Migrant
2
2
  module ModelExtensions
3
3
  attr_accessor :schema
4
+
5
+ def belongs_to(*args)
6
+ super
7
+ create_migrant_schema
8
+ @schema.add_association(self.reflect_on_association(args.first))
9
+ end
10
+
11
+ def create_migrant_schema
12
+ if self.superclass == ActiveRecord::Base
13
+ @schema ||= Schema.new
14
+ else
15
+ @schema ||= InheritedSchema.new(self.superclass.schema)
16
+ end
17
+ end
18
+
4
19
  def structure(type=nil, &block)
5
20
  # Using instance_*evil* to get the neater DSL on the models.
6
21
  # So, my_field in the structure block actually calls Migrant::Schema.my_field
7
22
 
23
+ create_migrant_schema
8
24
  if self.superclass == ActiveRecord::Base
9
- @schema ||= Schema.new
10
- @schema.add_associations(self.reflect_on_all_associations)
11
25
  @schema.define_structure(type, &block)
12
-
13
26
  @schema.validations.each do |field, validation_options|
14
27
  validations = (validation_options.class == Array)? validation_options : [validation_options]
15
28
  validations.each do |validation|
@@ -17,9 +30,14 @@ module Migrant
17
30
  self.validates(field, validation)
18
31
  end
19
32
  end
33
+ # Set up serialized columns as required
34
+ @schema.columns.select do |name, column|
35
+ if column.serialized? && !serialized_attributes.keys.include?(name.to_s)
36
+ serialize(name, column.serialized_class_name)
37
+ end
38
+ end
20
39
  else
21
40
  self.superclass.structure(&block) # For STI, cascade all fields onto the parent model
22
- @schema = InheritedSchema.new(self.superclass.schema)
23
41
  end
24
42
  end
25
43
 
@@ -42,7 +60,7 @@ module Migrant
42
60
  end
43
61
 
44
62
  def mock_attributes(attributes={}, recursive=true)
45
- attribs = @schema.columns.collect { |name, data_type| [name, data_type.mock] }.flatten
63
+ attribs = @schema.columns.collect { |name, data_type| [name, data_type.mock] }.flatten(1)
46
64
 
47
65
  # Only recurse to one level, otherwise things get way too complicated
48
66
  if recursive
@@ -55,8 +73,8 @@ module Migrant
55
73
  Hash[*attribs].merge(attributes)
56
74
  end
57
75
 
58
- def mock!(attributes={})
59
- mock(attributes).tap do |mock|
76
+ def mock!(attributes={}, recursive=true)
77
+ mock(attributes, recursive).tap do |mock|
60
78
  mock.save!
61
79
  end
62
80
  end
@@ -29,26 +29,25 @@ module Migrant
29
29
  @proxy.translate_fancy_dsl(&block) if block_given?
30
30
  end
31
31
 
32
- def add_associations(associations)
33
- associations.each do |association|
34
- # Rails 3.1 changes primary_key_name to foreign_key (correct behaviour), so this is essentially backwards compatibility for Rails 3.0
35
- field = (association.respond_to?(:foreign_key))? association.foreign_key.to_sym : association.primary_key_name.to_sym
36
- case association.macro
37
- when :belongs_to
38
- if association.options[:polymorphic]
39
- @columns[(association.name.to_s+'_type').to_sym] = DataType::Polymorphic.new(:field => field)
40
- @indexes << [(association.name.to_s+'_type').to_sym, field]
41
- end
42
- @columns[field] = DataType::ForeignKey.new(:field => field)
43
- @indexes << field
44
- end
32
+ def add_association(association)
33
+ # Rails 3.1 changes primary_key_name to foreign_key (correct behaviour), so this is essentially backwards compatibility for Rails 3.0
34
+ field = (association.respond_to?(:foreign_key))? association.foreign_key.to_sym : association.primary_key_name.to_sym
35
+
36
+ case association.macro
37
+ when :belongs_to
38
+ if association.options[:polymorphic]
39
+ @columns[(association.name.to_s+'_type').to_sym] = DataType::Polymorphic.new(:field => field)
40
+ @indexes << [(association.name.to_s+'_type').to_sym, field]
41
+ end
42
+ @columns[field] = DataType::ForeignKey.new(:field => field)
43
+ @indexes << field
45
44
  end
46
45
  end
47
46
 
48
47
  def requires_migration?
49
48
  true
50
49
  end
51
-
50
+
52
51
  # If the user defines structure(:partial), irreversible changes are ignored (removing a column, for example)
53
52
  def partial?
54
53
  @type == :partial
@@ -64,7 +63,7 @@ module Migrant
64
63
 
65
64
  def add_field(field, data_type = nil, options = {})
66
65
  data_type = DataType::String if data_type.nil?
67
- puts [":#{field}", "#{data_type}", "#{options.inspect}"].collect { |s| s.ljust(25) }.join if ENV['DEBUG']
66
+ puts [":#{field}", "#{data_type.class.to_s}", "#{options.inspect}"].collect { |s| s.ljust(25) }.join if ENV['DEBUG']
68
67
 
69
68
  # Fields that do special things go here.
70
69
  if field == :timestamps
@@ -76,8 +75,8 @@ module Migrant
76
75
  # Add index if explicitly asked
77
76
  @indexes << field if options.delete(:index) || data_type.class.to_s == 'Hash' && data_type.delete(:index)
78
77
  @validations[field] = options.delete(:validates) if options[:validates]
79
- options.merge!(:field => field)
80
-
78
+ options.merge!(:field => field)
79
+
81
80
  # Matches: description DataType::Paragraph, :index => true
82
81
  if data_type.is_a?(Class) && data_type.respond_to?(:migrant_data_type?)
83
82
  @columns[field] = data_type.new(options)
@@ -93,7 +92,6 @@ module Migrant
93
92
  end
94
93
  end
95
94
  end
96
-
97
95
  end
98
96
 
99
97
  class InheritedSchema < Schema
@@ -101,7 +99,7 @@ module Migrant
101
99
 
102
100
  def initialize(parent_schema)
103
101
  @parent_schema = parent_schema
104
- @columns = Array.new
102
+ @columns = Hash.new
105
103
  @indexes = Array.new
106
104
  end
107
105
 
@@ -22,6 +22,7 @@ Gem::Specification.new do |s|
22
22
  s.summary = %q{All the fun of ActiveRecord, without writing your migrations, and a dash of mocking.}
23
23
 
24
24
  s.add_development_dependency(%q<thoughtbot-shoulda>, [">= 0"])
25
+ s.add_development_dependency(%q<minitest>, [">= 1.6.0"])
25
26
  s.add_development_dependency(%q<ansi>, [">= 0"])
26
27
  s.add_development_dependency(%q<turn>, [">= 0"])
27
28
  s.add_development_dependency(%q<sqlite3>, [">= 0"])
@@ -29,6 +30,7 @@ Gem::Specification.new do |s|
29
30
  s.add_development_dependency(%q<terminal-table>, [">= 0"])
30
31
  s.add_development_dependency(%q<term-ansicolor>, [">= 0"])
31
32
  s.add_development_dependency(%q<rake>, [">= 0.8.7"])
33
+ s.add_development_dependency(%q<simplecov>, [">= 0"])
32
34
  s.add_dependency(%q<rails>, [">= 3.0.0"])
33
35
  s.add_dependency(%q<faker>, [">= 0"])
34
36
  s.add_dependency(%q<term-ansicolor>, [">= 0"])
@@ -1,16 +1,5 @@
1
- require 'simplecov'
2
1
  require 'fileutils'
3
2
 
4
- SimpleCov.adapters.define 'migrant' do
5
- add_filter '/test'
6
- add_filter '/lib/tasks'
7
- add_filter '/lib/railtie' # Not covering lines it's running here .. disabling for now
8
- add_filter '/lib/simple_object'
9
-
10
- add_group 'Core Extensions', '/lib/migrant'
11
- add_group 'Schema Data Types', '/lib/datatype'
12
- end
13
- #SimpleCov.start 'migrant'
14
3
  ENV['RAILS_ENV'] = 'test'
15
4
 
16
5
  require 'rubygems'
@@ -18,5 +18,7 @@ class Business < ActiveRecord::Base
18
18
  next_sale (Time.now + 10.days)
19
19
  verified false
20
20
  location :type => :string, :limit => 127
21
+ awards ["Best business 2007", "Tastiest Chicken 2008"]
22
+ managers :serialized
21
23
  end
22
24
  end
@@ -1,6 +1,6 @@
1
1
  class User < ActiveRecord::Base
2
2
  structure do
3
- name Object.new # Testing creating from an unknown class
3
+ name nil # Testing creating from an unknown class
4
4
  email "somebody@somewhere.com"
5
5
  encrypted_password :limit => 48
6
6
  password_salt :limit => 42
@@ -86,8 +86,17 @@ class TestDataSchema < Test::Unit::TestCase
86
86
  should "generate indexes on any column when explicitly asked to" do
87
87
  assert_contains(Category.schema.indexes, :title, 'Missing index on :index => true column')
88
88
  end
89
-
90
-
89
+
90
+ should "generate a text column for serialized fields" do
91
+ assert_schema(Business, :awards, :type => :text)
92
+ assert_schema(Business, :managers, :type => :text)
93
+
94
+ assert_equal(Array, Business.schema.columns[:awards].mock.class)
95
+ assert_equal(Hash, Business.schema.columns[:managers].mock.class)
96
+
97
+ assert(Business.serialized_attributes.keys.include?("awards"), "Should call ActiveRecord::Base.serialize")
98
+ assert(Business.serialized_attributes.keys.include?("managers"), "Should call ActiveRecord::Base.serialize")
99
+ end
91
100
  end
92
101
 
93
102
  end
@@ -30,6 +30,10 @@ class TestMigrationGenerator < Test::Unit::TestCase
30
30
  end
31
31
  flunk "No migration could be found"
32
32
  end
33
+
34
+ def delete_last_migration
35
+ File.delete(Dir.glob(File.join(File.dirname(__FILE__), 'rails_app', 'db' ,'migrate', '*.rb')).last)
36
+ end
33
37
 
34
38
  context "The migration generator" do
35
39
  should "create migrations for all new tables" do
@@ -117,14 +121,19 @@ class TestMigrationGenerator < Test::Unit::TestCase
117
121
  test_mockup_of_float :float
118
122
  test_mockup_of_datetime :datetime
119
123
  test_mockup_of_currency DataType::Currency
124
+ test_mockup_serialized :serialized
125
+ test_mockup_hash OpenStruct.new({'a' => 'b'})
126
+ test_mockup_serialized_example :serialized, :example => OpenStruct.new({'c' => 'd'})
120
127
  end
128
+
121
129
 
122
130
  BusinessCategory.belongs_to(:notaclass, :polymorphic => true)
123
131
  generate_migrations
124
132
  rake_migrate
125
133
  BusinessCategory.reset_column_information
126
- BusinessCategory.mock!
134
+ m = BusinessCategory.mock!
127
135
  mock = BusinessCategory.last
136
+
128
137
  assert_not_nil(mock)
129
138
  assert(mock.test_mockup_of_text.is_a?(String))
130
139
  assert(mock.test_mockup_of_string.is_a?(String))
@@ -133,6 +142,16 @@ class TestMigrationGenerator < Test::Unit::TestCase
133
142
  assert(mock.test_mockup_of_currency.is_a?(BigDecimal))
134
143
  assert(mock.test_mockup_of_datetime.is_a?(Time))
135
144
  assert(DataType::Base.default_mock.is_a?(String))
145
+ assert(mock.test_mockup_serialized.is_a?(Hash))
146
+ assert(mock.test_mockup_hash.is_a?(OpenStruct))
147
+ assert_equal(mock.test_mockup_hash.a, 'b')
148
+ assert(mock.test_mockup_serialized_example.is_a?(OpenStruct))
149
+ assert_equal(mock.test_mockup_serialized_example.c, 'd')
150
+ end
151
+
152
+ should "not rescursively generate mocks for an inherited model when prohibited by the user" do
153
+ category_mock = BusinessCategory.mock!({}, false)
154
+ assert_not_nil(category_mock)
136
155
  end
137
156
 
138
157
  should "generate example mocks for an inherited model when STI is in effect" do
@@ -141,6 +160,7 @@ class TestMigrationGenerator < Test::Unit::TestCase
141
160
  assert(Customer.mock.is_a?(Customer))
142
161
  end
143
162
 
163
+
144
164
  should "remove extraneous text from a filename too large for the operating system" do
145
165
  BusinessCategory.structure do
146
166
  a_very_very_long_field_indeed_far_too_long_for_any_good_use_really true
@@ -148,9 +168,11 @@ class TestMigrationGenerator < Test::Unit::TestCase
148
168
  a_very_very_long_field_indeed_far_too_long_for_any_good_use_really_3 true
149
169
  end
150
170
 
151
- BusinessCategory.belongs_to(:verylongclassthatissuretogenerateaverylargeoutputfilename, :polymorphic => true)
171
+ BusinessCategory.belongs_to(:verylongclassthatissuretogenerateaverylargeoutputfilename)
152
172
  generate_migrations
153
- rake_migrate
173
+ delete_last_migration # Can't actually test migration because the index name is too long!
174
+ # BusinessCategory.schema.undo_structure_column(:verylongclassthatissuretogenerateaverylargeoutputfilename_id)
175
+ BusinessCategory.reset_structure!
154
176
  end
155
177
 
156
178
  should "remove columns when requested and confirmed by the user" do
@@ -1,21 +1,23 @@
1
1
  class CreateBusinesses < ActiveRecord::Migration
2
2
  def self.up
3
3
  create_table :businesses do |t|
4
- t.integer :user_id
5
- t.string :owner_type
6
- t.integer :owner_id
7
- t.string :name
8
- t.string :website
9
- t.text :address
10
- t.string :summary
11
- t.text :description
12
- t.string :landline
13
- t.string :mobile
14
- t.integer :operating_days, :limit=>1
15
- t.datetime :date_established
16
- t.datetime :next_sale
17
- t.boolean :verified
18
- t.string :location, :limit=>127
4
+ t.integer :user_id
5
+ t.string :owner_type
6
+ t.integer :owner_id
7
+ t.string :name
8
+ t.string :website
9
+ t.text :address
10
+ t.string :summary
11
+ t.text :description
12
+ t.string :landline
13
+ t.string :mobile
14
+ t.integer :operating_days, :limit=>1
15
+ t.datetime :date_established
16
+ t.datetime :next_sale
17
+ t.boolean :verified
18
+ t.string :location, :limit=>127
19
+ t.text :awards
20
+ t.text :managers
19
21
  end
20
22
  add_index :businesses, :user_id
21
23
  add_index :businesses, [:owner_type, :owner_id]
metadata CHANGED
@@ -1,145 +1,170 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: migrant
3
- version: !ruby/object:Gem::Version
4
- version: 1.2.8
3
+ version: !ruby/object:Gem::Version
5
4
  prerelease:
5
+ version: 1.3.0
6
6
  platform: ruby
7
- authors:
7
+ authors:
8
8
  - Pascal Houliston
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-05-23 00:00:00.000000000Z
13
- dependencies:
14
- - !ruby/object:Gem::Dependency
12
+
13
+ date: 2011-05-23 00:00:00 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
15
16
  name: thoughtbot-shoulda
16
- requirement: &70104235211140 !ruby/object:Gem::Requirement
17
+ prerelease: false
18
+ requirement: &id001 !ruby/object:Gem::Requirement
17
19
  none: false
18
- requirements:
19
- - - ! '>='
20
- - !ruby/object:Gem::Version
21
- version: '0'
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: "0"
22
24
  type: :development
25
+ version_requirements: *id001
26
+ - !ruby/object:Gem::Dependency
27
+ name: minitest
23
28
  prerelease: false
24
- version_requirements: *70104235211140
25
- - !ruby/object:Gem::Dependency
26
- name: ansi
27
- requirement: &70104235209920 !ruby/object:Gem::Requirement
29
+ requirement: &id002 !ruby/object:Gem::Requirement
28
30
  none: false
29
- requirements:
30
- - - ! '>='
31
- - !ruby/object:Gem::Version
32
- version: '0'
31
+ requirements:
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: 1.6.0
33
35
  type: :development
36
+ version_requirements: *id002
37
+ - !ruby/object:Gem::Dependency
38
+ name: ansi
34
39
  prerelease: false
35
- version_requirements: *70104235209920
36
- - !ruby/object:Gem::Dependency
37
- name: turn
38
- requirement: &70104235209100 !ruby/object:Gem::Requirement
40
+ requirement: &id003 !ruby/object:Gem::Requirement
39
41
  none: false
40
- requirements:
41
- - - ! '>='
42
- - !ruby/object:Gem::Version
43
- version: '0'
42
+ requirements:
43
+ - - ">="
44
+ - !ruby/object:Gem::Version
45
+ version: "0"
44
46
  type: :development
47
+ version_requirements: *id003
48
+ - !ruby/object:Gem::Dependency
49
+ name: turn
45
50
  prerelease: false
46
- version_requirements: *70104235209100
47
- - !ruby/object:Gem::Dependency
48
- name: sqlite3
49
- requirement: &70104235208420 !ruby/object:Gem::Requirement
51
+ requirement: &id004 !ruby/object:Gem::Requirement
50
52
  none: false
51
- requirements:
52
- - - ! '>='
53
- - !ruby/object:Gem::Version
54
- version: '0'
53
+ requirements:
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ version: "0"
55
57
  type: :development
58
+ version_requirements: *id004
59
+ - !ruby/object:Gem::Dependency
60
+ name: sqlite3
56
61
  prerelease: false
57
- version_requirements: *70104235208420
58
- - !ruby/object:Gem::Dependency
59
- name: simplecov
60
- requirement: &70104235207540 !ruby/object:Gem::Requirement
62
+ requirement: &id005 !ruby/object:Gem::Requirement
61
63
  none: false
62
- requirements:
63
- - - ! '>='
64
- - !ruby/object:Gem::Version
65
- version: '0'
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: "0"
66
68
  type: :development
69
+ version_requirements: *id005
70
+ - !ruby/object:Gem::Dependency
71
+ name: simplecov
67
72
  prerelease: false
68
- version_requirements: *70104235207540
69
- - !ruby/object:Gem::Dependency
70
- name: terminal-table
71
- requirement: &70104235206840 !ruby/object:Gem::Requirement
73
+ requirement: &id006 !ruby/object:Gem::Requirement
72
74
  none: false
73
- requirements:
74
- - - ! '>='
75
- - !ruby/object:Gem::Version
76
- version: '0'
75
+ requirements:
76
+ - - ">="
77
+ - !ruby/object:Gem::Version
78
+ version: "0"
77
79
  type: :development
80
+ version_requirements: *id006
81
+ - !ruby/object:Gem::Dependency
82
+ name: terminal-table
78
83
  prerelease: false
79
- version_requirements: *70104235206840
80
- - !ruby/object:Gem::Dependency
81
- name: term-ansicolor
82
- requirement: &70104235205000 !ruby/object:Gem::Requirement
84
+ requirement: &id007 !ruby/object:Gem::Requirement
83
85
  none: false
84
- requirements:
85
- - - ! '>='
86
- - !ruby/object:Gem::Version
87
- version: '0'
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: "0"
88
90
  type: :development
91
+ version_requirements: *id007
92
+ - !ruby/object:Gem::Dependency
93
+ name: term-ansicolor
89
94
  prerelease: false
90
- version_requirements: *70104235205000
91
- - !ruby/object:Gem::Dependency
95
+ requirement: &id008 !ruby/object:Gem::Requirement
96
+ none: false
97
+ requirements:
98
+ - - ">="
99
+ - !ruby/object:Gem::Version
100
+ version: "0"
101
+ type: :development
102
+ version_requirements: *id008
103
+ - !ruby/object:Gem::Dependency
92
104
  name: rake
93
- requirement: &70104235203980 !ruby/object:Gem::Requirement
105
+ prerelease: false
106
+ requirement: &id009 !ruby/object:Gem::Requirement
94
107
  none: false
95
- requirements:
96
- - - ! '>='
97
- - !ruby/object:Gem::Version
108
+ requirements:
109
+ - - ">="
110
+ - !ruby/object:Gem::Version
98
111
  version: 0.8.7
99
112
  type: :development
113
+ version_requirements: *id009
114
+ - !ruby/object:Gem::Dependency
115
+ name: simplecov
100
116
  prerelease: false
101
- version_requirements: *70104235203980
102
- - !ruby/object:Gem::Dependency
117
+ requirement: &id010 !ruby/object:Gem::Requirement
118
+ none: false
119
+ requirements:
120
+ - - ">="
121
+ - !ruby/object:Gem::Version
122
+ version: "0"
123
+ type: :development
124
+ version_requirements: *id010
125
+ - !ruby/object:Gem::Dependency
103
126
  name: rails
104
- requirement: &70104235202140 !ruby/object:Gem::Requirement
127
+ prerelease: false
128
+ requirement: &id011 !ruby/object:Gem::Requirement
105
129
  none: false
106
- requirements:
107
- - - ! '>='
108
- - !ruby/object:Gem::Version
130
+ requirements:
131
+ - - ">="
132
+ - !ruby/object:Gem::Version
109
133
  version: 3.0.0
110
134
  type: :runtime
111
- prerelease: false
112
- version_requirements: *70104235202140
113
- - !ruby/object:Gem::Dependency
135
+ version_requirements: *id011
136
+ - !ruby/object:Gem::Dependency
114
137
  name: faker
115
- requirement: &70104235200060 !ruby/object:Gem::Requirement
138
+ prerelease: false
139
+ requirement: &id012 !ruby/object:Gem::Requirement
116
140
  none: false
117
- requirements:
118
- - - ! '>='
119
- - !ruby/object:Gem::Version
120
- version: '0'
141
+ requirements:
142
+ - - ">="
143
+ - !ruby/object:Gem::Version
144
+ version: "0"
121
145
  type: :runtime
122
- prerelease: false
123
- version_requirements: *70104235200060
124
- - !ruby/object:Gem::Dependency
146
+ version_requirements: *id012
147
+ - !ruby/object:Gem::Dependency
125
148
  name: term-ansicolor
126
- requirement: &70104235198100 !ruby/object:Gem::Requirement
149
+ prerelease: false
150
+ requirement: &id013 !ruby/object:Gem::Requirement
127
151
  none: false
128
- requirements:
129
- - - ! '>='
130
- - !ruby/object:Gem::Version
131
- version: '0'
152
+ requirements:
153
+ - - ">="
154
+ - !ruby/object:Gem::Version
155
+ version: "0"
132
156
  type: :runtime
133
- prerelease: false
134
- version_requirements: *70104235198100
157
+ version_requirements: *id013
135
158
  description: Easier schema management for Rails that compliments your domain model.
136
159
  email: 101pascal@gmail.com
137
160
  executables: []
161
+
138
162
  extensions: []
139
- extra_rdoc_files:
163
+
164
+ extra_rdoc_files:
140
165
  - LICENSE
141
166
  - README.rdoc
142
- files:
167
+ files:
143
168
  - .gitignore
144
169
  - .rvmrc
145
170
  - Gemfile
@@ -224,27 +249,30 @@ files:
224
249
  - test/verified_output/migrations/renamed_old_spots.rb
225
250
  homepage: http://github.com/pascalh1011/migrant
226
251
  licenses: []
252
+
227
253
  post_install_message:
228
254
  rdoc_options: []
229
- require_paths:
255
+
256
+ require_paths:
230
257
  - lib
231
- required_ruby_version: !ruby/object:Gem::Requirement
258
+ required_ruby_version: !ruby/object:Gem::Requirement
232
259
  none: false
233
- requirements:
234
- - - ! '>='
235
- - !ruby/object:Gem::Version
236
- version: '0'
237
- required_rubygems_version: !ruby/object:Gem::Requirement
260
+ requirements:
261
+ - - ">="
262
+ - !ruby/object:Gem::Version
263
+ version: "0"
264
+ required_rubygems_version: !ruby/object:Gem::Requirement
238
265
  none: false
239
- requirements:
240
- - - ! '>='
241
- - !ruby/object:Gem::Version
242
- version: '0'
266
+ requirements:
267
+ - - ">="
268
+ - !ruby/object:Gem::Version
269
+ version: "0"
243
270
  requirements: []
271
+
244
272
  rubyforge_project:
245
- rubygems_version: 1.8.10
273
+ rubygems_version: 1.8.5
246
274
  signing_key:
247
275
  specification_version: 3
248
- summary: All the fun of ActiveRecord, without writing your migrations, and a dash
249
- of mocking.
276
+ summary: All the fun of ActiveRecord, without writing your migrations, and a dash of mocking.
250
277
  test_files: []
278
+