standalone_migrations 0.4.11 → 1.0.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.
data/Gemfile ADDED
@@ -0,0 +1,10 @@
1
+ source :rubygems
2
+
3
+ gem 'rake'
4
+ gem 'activerecord', ENV['AR'] || '>=3'
5
+
6
+ group :dev do
7
+ gem 'sqlite3'
8
+ gem 'rspec', '~>2'
9
+ gem 'jeweler'
10
+ end
data/Gemfile.lock ADDED
@@ -0,0 +1,47 @@
1
+ GEM
2
+ remote: http://rubygems.org/
3
+ specs:
4
+ activemodel (3.1.0.rc4)
5
+ activesupport (= 3.1.0.rc4)
6
+ bcrypt-ruby (~> 2.1.4)
7
+ builder (~> 3.0.0)
8
+ i18n (~> 0.6)
9
+ activerecord (3.1.0.rc4)
10
+ activemodel (= 3.1.0.rc4)
11
+ activesupport (= 3.1.0.rc4)
12
+ arel (~> 2.1.1)
13
+ tzinfo (~> 0.3.27)
14
+ activesupport (3.1.0.rc4)
15
+ multi_json (~> 1.0)
16
+ arel (2.1.1)
17
+ bcrypt-ruby (2.1.4)
18
+ builder (3.0.0)
19
+ diff-lcs (1.1.2)
20
+ git (1.2.5)
21
+ i18n (0.6.0)
22
+ jeweler (1.6.2)
23
+ bundler (~> 1.0)
24
+ git (>= 1.2.5)
25
+ rake
26
+ multi_json (1.0.3)
27
+ rake (0.9.2)
28
+ rspec (2.6.0)
29
+ rspec-core (~> 2.6.0)
30
+ rspec-expectations (~> 2.6.0)
31
+ rspec-mocks (~> 2.6.0)
32
+ rspec-core (2.6.4)
33
+ rspec-expectations (2.6.0)
34
+ diff-lcs (~> 1.1.2)
35
+ rspec-mocks (2.6.0)
36
+ sqlite3 (1.3.3)
37
+ tzinfo (0.3.27)
38
+
39
+ PLATFORMS
40
+ ruby
41
+
42
+ DEPENDENCIES
43
+ activerecord (>= 3)
44
+ jeweler
45
+ rake
46
+ rspec (~> 2)
47
+ sqlite3
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2008-2011 Todd Huss
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.markdown CHANGED
@@ -1,5 +1,13 @@
1
1
  Rails migrations in non-Rails (and non Ruby) projects.
2
2
 
3
+ WHAT'S NEW
4
+ ==========
5
+ In the 1.0 release we have moved to using Rails 3 migrations instead of maintaining our own migration related code. Just about anything you can do with Rails 3 migrations you can now do with [Standalone Migrations](https://github.com/thuss/standalone-migrations) too! This removed 95% of the code we have to maintain. Big thanks to [Michael Grosser](http://pragmatig.wordpress.com) for undertaking this major rewrite!
6
+
7
+ CONTRIBUTE
8
+ ==========
9
+ [Standalone Migrations](https://github.com/thuss/standalone-migrations) relies on the contributions of the open-source community! To submit a fix or an enhancement fork the repository, checkout the *develop* branch, make your changes, add your name to the *Contributors* section in README.markdown, and send us a pull request! If you're active and do good work we'll add you as a collaborator!
10
+
3
11
  USAGE
4
12
  =====
5
13
  Install Ruby, RubyGems and a ruby-database driver (e.g. `gem install mysql`) then:
@@ -10,15 +18,6 @@ Add to `Rakefile` in your projects base directory:
10
18
 
11
19
  begin
12
20
  require 'tasks/standalone_migrations'
13
- MigratorTasks.new do |t|
14
- # t.migrations = "db/migrations"
15
- # t.config = "db/config.yml"
16
- # t.schema = "db/schema.rb"
17
- # t.sub_namespace = "dbname"
18
- # t.env = "DB"
19
- # t.verbose = true
20
- # t.log_level = Logger::ERROR
21
- end
22
21
  rescue LoadError => e
23
22
  puts "gem install standalone_migrations to get db:migrate:* tasks! (Error: #{e})"
24
23
  end
@@ -50,7 +49,7 @@ Add database configuration to `db/config.yml` in your projects base directory e.
50
49
  ### To create a new database migration:
51
50
 
52
51
  rake db:new_migration name=FooBarMigration
53
- edit db/migrations/20081220234130_foo_bar_migration.rb
52
+ edit db/migrate/20081220234130_foo_bar_migration.rb
54
53
 
55
54
  ... and fill in the up and down migrations [Cheatsheet](http://dizzy.co.uk/ruby_on_rails/cheatsheets/rails-migrations).
56
55
 
@@ -76,7 +75,7 @@ An example to create a Person table with 3 columns (and it will automatically ad
76
75
 
77
76
  rake db:generate model="Person" fields="string:first_name string:last_name integer:age"
78
77
 
79
- This will create a migration in db/migrations/
78
+ This will create a migration in db/migrate/
80
79
 
81
80
  class CreatePerson < ActiveRecord::Migration
82
81
  def self.up
@@ -103,40 +102,20 @@ This will create a migration in db/migrations/
103
102
 
104
103
  ### To migrate a specific database (for example your "testing" database)
105
104
 
106
- rake db:migrate DB=test
105
+ rake db:migrate DB=test ... or ...
106
+ rake db:migrate RAILS_ENV=test
107
107
 
108
108
  ### To execute a specific up/down of one single migration
109
109
 
110
110
  rake db:migrate:up VERSION=20081220234130
111
-
111
+
112
112
  ### To revert your last migration
113
113
 
114
114
  rake db:rollback
115
115
 
116
116
  ### To revert your last 3 migrations
117
117
 
118
- rake db:rollback STEP=3
119
-
120
- ## Sub-namespacing
121
-
122
- When working with multiple databases in a single application it is convenient
123
- to have separate sets of tasks for each database. This is accomplished with
124
- sub_namespace parameter - for example, given the following declaration:
125
-
126
- MigratorTasks.new do |t|
127
- t.migrations = "db/migrate/widgets"
128
- t.sub_namespace = "widgets"
129
- ...
130
- end
131
-
132
- The following tasks will be created:
133
-
134
- db:widgets:new_migration
135
- db:widgets:migrate
136
- ...
137
-
138
- And migrations for this database would be created in db/migrate/widgets
139
- subdirectory.
118
+ rake db:rollback STEP=3
140
119
 
141
120
  Contributors
142
121
  ============
data/Rakefile CHANGED
@@ -1,17 +1,10 @@
1
- task :default => :spec
1
+ task :default do
2
+ sh "rspec spec"
3
+ end
2
4
 
3
- begin
4
- require 'rspec/core/rake_task'
5
- rescue LoadError => e
6
- $stderr.puts "RSpec 2, or one of its dependencies, is not available:"
7
- $stderr.puts "#{e.class}: #{e.message}"
8
- $stderr.puts "Install it with: sudo gem install rspec"
9
- $stderr.puts "Test-related tasks will not be available."
10
- $stderr.puts "If you have RSpec 1 installed you can try running the tests with:"
11
- $stderr.puts " spec spec"
12
- $stderr.puts "However, RSpec 1 is not officially supported."
13
- else
14
- RSpec::Core::RakeTask.new {|t| t.rspec_opts = ['--color']}
5
+ task :all do
6
+ sh "AR='~>3.0.0' bundle update activerecord && bundle exec rake"
7
+ sh "AR='~>3.1.0.rc4' bundle update activerecord && bundle exec rake"
15
8
  end
16
9
 
17
10
  # rake install -> install gem locally (for tests)
@@ -30,8 +23,6 @@ else
30
23
  gem.email = "thuss@gabrito.com"
31
24
  gem.homepage = "http://github.com/thuss/standalone-migrations"
32
25
  gem.authors = ["Todd Huss", "Michael Grosser"]
33
- gem.files += ["lib/tasks/*"]
34
- %w[rake activerecord].each{|d| gem.add_dependency d}
35
26
  end
36
27
 
37
28
  Jeweler::GemcutterTasks.new
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.4.11
1
+ 1.0.0
@@ -1,350 +1,62 @@
1
- require 'rake'
2
- require 'rake/tasklib'
3
- require 'logger'
1
+ require 'active_support/all'
2
+ require 'active_record'
3
+ require 'pathname'
4
4
 
5
- class MigratorTasks < ::Rake::TaskLib
6
- DefaultEnv = 'development'
7
-
8
- attr_accessor :name, :base, :vendor, :config, :schema, :env, :current_env
9
- attr_accessor :verbose, :log_level, :logger, :sub_namespace
10
- attr_reader :migrations
5
+ # earlier versions used migrations from db/migrations, so warn users about the change
6
+ if File.directory?('db/migrations')
7
+ puts "DEPRECATED move your migrations into db/migrate"
8
+ end
11
9
 
12
- def initialize(name = :migrator)
13
- @name = name
14
- base = File.expand_path('.')
15
- here = File.expand_path(File.dirname(File.dirname(File.dirname((__FILE__)))))
16
- @base = base
17
- @vendor = "#{here}/vendor"
18
- @migrations = ["#{base}/db/migrations"]
19
- @config = "#{base}/db/config.yml"
20
- @schema = "#{base}/db/schema.rb"
21
- @env = 'DB'
22
- @verbose = true
23
- @log_level = Logger::ERROR
24
- yield self if block_given?
25
- # Add to load_path every "lib/" directory in vendor
26
- Dir["#{vendor}/**/lib"].each { |p| $LOAD_PATH << p }
27
- define
28
- end
10
+ DB_CONFIG = YAML.load_file('db/config.yml').with_indifferent_access
29
11
 
30
- def migrations=(*value)
31
- @migrations = value.flatten
12
+ module Rails
13
+ def self.env
14
+ s = (ENV['RAILS_ENV'] || ENV['DB'] || 'development').dup # env is frozen -> dup
15
+ def s.development?; self == 'development';end
16
+ s
32
17
  end
33
18
 
34
- def define
35
- namespace :db do
36
- if sub_namespace
37
- namespace sub_namespace do
38
- define_tasks
39
- end
40
- else
41
- define_tasks
42
- end
43
- end
19
+ def self.root
20
+ Pathname.new Dir.pwd
44
21
  end
45
22
 
46
- def define_tasks
47
- sub_namespace_with_separator = sub_namespace ? "#{sub_namespace}:" : ''
48
-
49
- def ar_init(connect = true)
50
- require 'active_record'
51
- self.current_env = ENV[@env] || DefaultEnv
52
-
53
- if @config.is_a?(Hash)
54
- ActiveRecord::Base.configurations = @config
55
- else
56
- require 'erb'
57
- ActiveRecord::Base.configurations = YAML::load(ERB.new(IO.read(@config)).result)
58
- end
59
- ActiveRecord::Base.establish_connection(current_env) if connect
60
- if @logger
61
- logger = @logger
62
- else
63
- logger = Logger.new($stderr)
64
- logger.level = @log_level
65
- end
66
- ActiveRecord::Base.logger = logger
67
- end
68
-
69
- task :ar_init do
70
- ar_init
71
- end
72
-
73
- desc "Migrate the database using the scripts in the migrations directory. Target specific version with VERSION=x. Turn off output with VERBOSE=false."
74
- task :migrate => :ar_init do
75
- begin
76
- require 'migration_helpers'
77
- rescue LoadError
78
- require "#{@vendor}/migration_helpers/init"
79
- end
80
- ActiveRecord::Migration.verbose = ENV['VERBOSE'] || @verbose
81
- @migrations.each do |path|
82
- ActiveRecord::Migrator.migrate(path, ENV["VERSION"] ? ENV["VERSION"].to_i : nil)
83
- end
84
- Rake::Task["db:#{sub_namespace_with_separator}schema:dump"].execute
85
- end
86
-
87
- desc "Revert the last migration applied. Revert multiple migrations with STEP=x."
88
- task :rollback => :ar_init do
89
- step = ENV['STEP'] ? ENV['STEP'].to_i : 1
90
- @migrations.each do |path|
91
- ActiveRecord::Migrator.rollback(path, step)
92
- end
93
- Rake::Task["db:#{sub_namespace_with_separator}schema:dump"].execute
94
- end
95
-
96
- desc "Retrieves the current schema version number"
97
- task :version => :ar_init do
98
- puts "Current version: #{ActiveRecord::Migrator.current_version}"
99
- end
100
-
101
-
102
- def create_database(config)
103
- begin
104
- if config['adapter'] =~ /sqlite/
105
- if File.exist?(config['database'])
106
- $stderr.puts "#{config['database']} already exists"
107
- else
108
- begin
109
- # Create the SQLite database
110
- ActiveRecord::Base.establish_connection(config)
111
- ActiveRecord::Base.connection
112
- rescue Exception => e
113
- $stderr.puts e, *(e.backtrace)
114
- $stderr.puts "Couldn't create database for #{config.inspect}"
115
- end
116
- end
117
- return # Skip the else clause of begin/rescue
118
- else
119
- ActiveRecord::Base.establish_connection(config)
120
- ActiveRecord::Base.connection
121
- end
122
- rescue
123
- case config['adapter']
124
- when /mysql/
125
- @charset = ENV['CHARSET'] || 'utf8'
126
- @collation = ENV['COLLATION'] || 'utf8_unicode_ci'
127
- creation_options = {:charset => (config['charset'] || @charset), :collation => (config['collation'] || @collation)}
128
- error_class = config['adapter'] =~ /mysql2/ ? Mysql2::Error : Mysql::Error
129
- access_denied_error = 1045
130
- begin
131
- ActiveRecord::Base.establish_connection(config.merge('database' => nil))
132
- ActiveRecord::Base.connection.create_database(config['database'], creation_options)
133
- ActiveRecord::Base.establish_connection(config)
134
- rescue error_class => sqlerr
135
- if sqlerr.errno == access_denied_error
136
- print "#{sqlerr.error}. \nPlease provide the root password for your mysql installation\n>"
137
- root_password = $stdin.gets.strip
138
- grant_statement = "GRANT ALL PRIVILEGES ON #{config['database']}.* " \
139
- "TO '#{config['username']}'@'localhost' " \
140
- "IDENTIFIED BY '#{config['password']}' WITH GRANT OPTION;"
141
- ActiveRecord::Base.establish_connection(config.merge(
142
- 'database' => nil, 'username' => 'root', 'password' => root_password))
143
- ActiveRecord::Base.connection.create_database(config['database'], creation_options)
144
- ActiveRecord::Base.connection.execute grant_statement
145
- ActiveRecord::Base.establish_connection(config)
146
- else
147
- $stderr.puts sqlerr.error
148
- $stderr.puts "Couldn't create database for #{config.inspect}, charset: #{config['charset'] || @charset}, collation: #{config['collation'] || @collation}"
149
- $stderr.puts "(if you set the charset manually, make sure you have a matching collation)" if config['charset']
150
- end
151
- end
152
- when 'postgresql'
153
- @encoding = config['encoding'] || ENV['CHARSET'] || 'utf8'
154
- begin
155
- ActiveRecord::Base.establish_connection(config.merge('database' => 'postgres', 'schema_search_path' => 'public'))
156
- ActiveRecord::Base.connection.create_database(config['database'], config.merge('encoding' => @encoding))
157
- ActiveRecord::Base.establish_connection(config)
158
- rescue Exception => e
159
- $stderr.puts e, *(e.backtrace)
160
- $stderr.puts "Couldn't create database for #{config.inspect}"
161
- end
162
- end
163
- else
164
- $stderr.puts "#{config['database']} already exists" unless config['adapter'] =~ /sqlite/
165
- end
166
- end
167
-
168
- desc 'Create the database from config/database.yml for the current DB'
169
- task :create do
170
- ar_init(false)
171
- config = ActiveRecord::Base.configurations[self.current_env]
172
- raise ArgumentError, "#{self.current_env} database is not configured" unless config
173
- create_database config
174
- end
175
-
176
- def drop_database(config)
177
- case config['adapter']
178
- when /mysql/
179
- ActiveRecord::Base.establish_connection(config)
180
- ActiveRecord::Base.connection.drop_database config['database']
181
- when /^sqlite/
182
- require 'pathname'
183
- path = Pathname.new(config['database'])
184
- file = path.absolute? ? path.to_s : File.join(@base, path)
185
- FileUtils.rm(file)
186
- when 'postgresql'
187
- ActiveRecord::Base.establish_connection(config.merge('database' => 'postgres', 'schema_search_path' => 'public'))
188
- ActiveRecord::Base.connection.drop_database config['database']
189
- end
190
- end
191
-
192
- desc 'Drops the database for the current DB'
193
- task :drop => :ar_init do
194
- config = ActiveRecord::Base.configurations[current_env]
195
- drop_database(config)
196
- end
197
-
198
- namespace :migrate do
199
- [:up, :down].each do |direction|
200
- desc "Runs the '#{direction}' for a given migration VERSION."
201
- task direction => :ar_init do
202
- ActiveRecord::Migration.verbose = @verbose
203
- version = ENV["VERSION"].to_i
204
- raise "VERSION is required (must be a number)" if version == 0
205
- migration_path = nil
206
- if @migrations.length == 1
207
- migration_path = @migrations.first
208
- else
209
- @migrations.each do |path|
210
- Dir[File.join(path, '*.rb')].each do |file|
211
- if File.basename(file).match(/^\d+/)[0] == version.to_s
212
- migration_path = path
213
- break
214
- end
215
- end
216
- end
217
- raise "Migration #{version} wasn't found on paths #{@migrations.join(', ')}" if migration_path.nil?
218
- end
219
- ActiveRecord::Migrator.run(direction, migration_path, version)
220
- Rake::Task["db:#{sub_namespace_with_separator}schema:dump"].execute
221
- end
222
- end
223
- end
224
-
225
- desc "Raises an error if there are pending migrations"
226
- task :abort_if_pending_migrations => :ar_init do
227
- @migrations.each do |path|
228
- pending_migrations = ActiveRecord::Migrator.new(:up, path).pending_migrations
229
-
230
- if pending_migrations.any?
231
- puts "You have #{pending_migrations.size} pending migrations:"
232
- pending_migrations.each do |pending_migration|
233
- puts ' %4d %s' % [pending_migration.version, pending_migration.name]
234
- end
235
- abort %{Run "rake db:migrate" to update your database then try again.}
236
- end
237
- end
238
- end
23
+ def self.application
24
+ s = "fake_app"
239
25
 
240
- namespace :schema do
241
- desc "Create schema.rb file that can be portably used against any DB supported by AR"
242
- task :dump => :ar_init do
243
- if schema_file = ENV['SCHEMA'] || @schema
244
- require 'active_record/schema_dumper'
245
- File.open(schema_file, "w") do |file|
246
- ActiveRecord::SchemaDumper.dump(ActiveRecord::Base.connection, file)
247
- end
248
- end
249
- end
250
-
251
- desc "Load a ar_schema.rb file into the database"
252
- task :load => :ar_init do
253
- file = ENV['SCHEMA'] || @schema
254
- load(file)
255
- end
26
+ def s.paths
27
+ Dir.glob('db/*').inject({}){|hash,x|hash[x]=[x]; hash}
256
28
  end
257
29
 
258
- namespace :test do
259
- desc "Recreate the test database from the current schema.rb"
260
- task :load => ["db:#{sub_namespace_with_separator}ar_init", "db:#{sub_namespace_with_separator}test:purge"] do
261
- ActiveRecord::Base.establish_connection(:test)
262
- ActiveRecord::Schema.verbose = false
263
- Rake::Task["db:#{sub_namespace_with_separator}schema:load"].invoke
30
+ def s.config
31
+ s = "fake_config"
32
+ def s.database_configuration
33
+ DB_CONFIG
264
34
  end
265
-
266
- desc "Empty the test database"
267
- task :purge => "db:#{sub_namespace_with_separator}ar_init" do
268
- config = ActiveRecord::Base.configurations['test']
269
- case config["adapter"]
270
- when *["mysql", "mysql2"]
271
- ActiveRecord::Base.establish_connection(:test)
272
- ActiveRecord::Base.connection.recreate_database(config["database"], config)
273
- when "postgresql" #TODO i doubt this will work <-> methods are not defined
274
- ActiveRecord::Base.clear_active_connections!
275
- drop_database(config)
276
- create_database(config)
277
- when "sqlite", "sqlite3"
278
- db_file = config["database"] || config["dbfile"]
279
- File.delete(db_file) if File.exist?(db_file)
280
- when "sqlserver"
281
- drop_script = "#{config["host"]}.#{config["database"]}.DP1".gsub(/\\/, '-')
282
- `osql -E -S #{config["host"]} -d #{config["database"]} -i db\\#{drop_script}`
283
- `osql -E -S #{config["host"]} -d #{config["database"]} -i db\\test_structure.sql`
284
- when "oci", "oracle"
285
- ActiveRecord::Base.establish_connection(:test)
286
- ActiveRecord::Base.connection.structure_drop.split(";\n\n").each do |ddl|
287
- ActiveRecord::Base.connection.execute(ddl)
288
- end
289
- when "firebird"
290
- ActiveRecord::Base.establish_connection(:test)
291
- ActiveRecord::Base.connection.recreate_database!
292
- else
293
- raise "Task not supported by #{config["adapter"].inspect}"
294
- end
295
- end
296
-
297
- desc 'Check for pending migrations and load the test schema'
298
- task :prepare => ["db:#{sub_namespace_with_separator}abort_if_pending_migrations", "db:#{sub_namespace_with_separator}test:load"]
35
+ s
299
36
  end
37
+ s
38
+ end
39
+ end
300
40
 
301
- desc 'generate a model=name field="type:column_name0 type:column_name1 ... type:column_namen"'
302
- task :generate do
303
- ts = Time.now.strftime '%Y%m%d%H%%M%S'
304
-
305
- if ENV['model']
306
- table_name = ENV['model']
307
- else
308
- print 'model name> '
309
- table_name = $stdin.gets.strip
310
- end
311
-
312
- raise ArgumentError, 'must provide a name for the model to generate' if table_name.empty?
313
-
314
- create_table_str = "create_table :#{table_name} do |t|"
315
-
316
- fields = ENV['fields'] if ENV['fields']
317
-
318
- columns = ENV.has_key?('fields') ? ENV['fields'].split.map { |v| "t.#{v.sub(/:/, ' :')}" }.join("\n#{' '*6}") : nil
319
-
320
- create_table_str << "\n #{columns}" if columns
41
+ task(:rails_env){}
321
42
 
322
- contents = <<-MIGRATION
323
- class Create#{class_name table_name} < ActiveRecord::Migration
324
- def self.up
325
- #{create_table_str}
326
- t.timestamps
327
- end
328
- end
329
-
330
- def self.down
331
- drop_table :#{table_name}
332
- end
43
+ task(:environment) do
44
+ ActiveRecord::Base.configurations = DB_CONFIG
45
+ ActiveRecord::Base.establish_connection DB_CONFIG[Rails.env]
333
46
  end
334
- MIGRATION
335
47
 
336
- create_file @migrations.first, file_name("create_#{table_name}"), contents
337
- end
48
+ load 'active_record/railties/databases.rake'
338
49
 
339
- desc "Create a new migration"
340
- task :new_migration do |t|
341
- unless migration = ENV['name']
342
- puts "Error: must provide name of migration to generate."
343
- puts "For example: rake #{t.name} name=add_field_to_form"
344
- abort
345
- end
50
+ namespace :db do
51
+ desc "Create a new migration"
52
+ task :new_migration do |t|
53
+ unless migration = ENV['name']
54
+ puts "Error: must provide name of migration to generate."
55
+ puts "For example: rake #{t.name} name=add_field_to_form"
56
+ abort
57
+ end
346
58
 
347
- file_contents = <<eof
59
+ file_contents = <<eof
348
60
  class #{class_name migration} < ActiveRecord::Migration
349
61
  def self.up
350
62
  end
@@ -354,23 +66,21 @@ class #{class_name migration} < ActiveRecord::Migration
354
66
  end
355
67
  end
356
68
  eof
357
-
358
- create_file @migrations.first, file_name(migration), file_contents
359
-
360
- puts "Created migration #{file_name migration}"
361
- end
362
- end
363
-
364
- def class_name str
365
- str.split('_').map { |s| s.capitalize }.join
69
+ create_file file_name(migration), file_contents
70
+ puts "Created migration #{file_name migration}"
366
71
  end
367
72
 
368
- def create_file path, file, contents
73
+ def create_file file, contents
74
+ path = File.dirname(file)
369
75
  FileUtils.mkdir_p path unless File.exists? path
370
76
  File.open(file, 'w') { |f| f.write contents }
371
77
  end
372
78
 
373
79
  def file_name migration
374
- File.join @migrations.first, "#{Time.now.utc.strftime '%Y%m%d%H%M%S'}_#{migration}.rb"
80
+ File.join 'db/migrate', "#{Time.now.utc.strftime '%Y%m%d%H%M%S'}_#{migration}.rb"
81
+ end
82
+
83
+ def class_name str
84
+ str.split('_').map { |s| s.capitalize }.join
375
85
  end
376
86
  end
@@ -12,8 +12,8 @@ describe 'Standalone migrations' do
12
12
  end
13
13
 
14
14
  def migration(name)
15
- m = `cd spec/tmp/db/migrations && ls`.split("\n").detect { |m| m =~ name }
16
- m ? "db/migrations/#{m}" : m
15
+ m = `cd spec/tmp/db/migrate && ls`.split("\n").detect { |m| m =~ name }
16
+ m ? "db/migrate/#{m}" : m
17
17
  end
18
18
 
19
19
  def tmp_file(file)
@@ -21,16 +21,14 @@ describe 'Standalone migrations' do
21
21
  end
22
22
 
23
23
  def run(cmd)
24
- `cd spec/tmp && #{cmd} 2>&1 && echo SUCCESS`
25
- end
26
-
27
- def run_with_output(cmd)
28
- `cd spec/tmp && #{cmd} 2>&1`
24
+ result = `cd spec/tmp && #{cmd} 2>&1`
25
+ raise result unless $?.success?
26
+ result
29
27
  end
30
28
 
31
29
  def make_migration(name, options={})
32
30
  task_name = options[:task_name] || 'db:new_migration'
33
- migration = run("rake #{task_name} name=#{name}").match(%r{db/migrations/\d+.*.rb})[0]
31
+ migration = run("rake #{task_name} name=#{name}").match(%r{db/migrate/\d+.*.rb})[0]
34
32
  content = read(migration)
35
33
  content.sub!(/def self.down.*?\send/m, "def self.down;puts 'DOWN-#{name}';end")
36
34
  content.sub!(/def self.up.*?\send/m, "def self.up;puts 'UP-#{name}';end")
@@ -38,62 +36,39 @@ describe 'Standalone migrations' do
38
36
  migration.match(/\d{14}/)[0]
39
37
  end
40
38
 
41
- def make_sub_namespaced_migration(namespace, name)
42
- # specify complete task name here to avoid conditionals in make_migration
43
- make_migration(name, :task_name => "db:#{namespace}:new_migration")
44
- end
45
-
46
39
  def write_rakefile(config=nil)
47
40
  write 'Rakefile', <<-TXT
48
- $LOAD_PATH.unshift '#{File.expand_path('lib')}'
49
- begin
50
- require 'tasks/standalone_migrations'
51
- MigratorTasks.new do |t|
52
- t.log_level = Logger::INFO
53
- #{config}
54
- end
55
- rescue LoadError => e
56
- puts "gem install standalone_migrations to get db:migrate:* tasks! (Error: \#{e})"
57
- end
58
- TXT
59
- end
60
-
61
- def write_reversible_migration
62
- write "db/migrations/20110703102233_create_tests.rb", <<-TXT
63
- class CreateTests < ActiveRecord::Migration
64
- def self.up
65
- puts "UP-CreateTests"
66
- end
67
-
68
- def self.down
69
- puts "DOWN-CreateTests"
70
- end
41
+ $LOAD_PATH.unshift '#{File.expand_path('lib')}'
42
+ begin
43
+ require 'tasks/standalone_migrations'
44
+ rescue LoadError => e
45
+ puts "gem install standalone_migrations to get db:migrate:* tasks! (Error: \#{e})"
71
46
  end
72
47
  TXT
73
48
  end
74
49
 
75
50
  def write_multiple_migrations
76
51
  write_rakefile %{t.migrations = "db/migrations", "db/migrations2"}
77
- write "db/migrations/20100509095815_create_tests.rb", <<-TXT
52
+ write "db/migrate/20100509095815_create_tests.rb", <<-TXT
78
53
  class CreateTests < ActiveRecord::Migration
79
- def self.up
80
- puts "UP-CreateTests"
81
- end
54
+ def self.up
55
+ puts "UP-CreateTests"
56
+ end
82
57
 
83
- def self.down
84
- puts "DOWN-CreateTests"
85
- end
58
+ def self.down
59
+ puts "DOWN-CreateTests"
60
+ end
86
61
  end
87
62
  TXT
88
- write "db/migrations2/20100509095816_create_tests2.rb", <<-TXT
63
+ write "db/migrate/20100509095816_create_tests2.rb", <<-TXT
89
64
  class CreateTests2 < ActiveRecord::Migration
90
- def self.up
91
- puts "UP-CreateTests2"
92
- end
65
+ def self.up
66
+ puts "UP-CreateTests2"
67
+ end
93
68
 
94
- def self.down
95
- puts "DOWN-CreateTests2"
96
- end
69
+ def self.down
70
+ puts "DOWN-CreateTests2"
71
+ end
97
72
  end
98
73
  TXT
99
74
  end
@@ -103,65 +78,37 @@ end
103
78
  `mkdir spec/tmp`
104
79
  write_rakefile
105
80
  write 'db/config.yml', <<-TXT
106
- development:
107
- adapter: sqlite3
108
- database: db/development.sql
109
- test:
110
- adapter: sqlite3
111
- database: db/test.sql
81
+ development:
82
+ adapter: sqlite3
83
+ database: db/development.sql
84
+ test:
85
+ adapter: sqlite3
86
+ database: db/test.sql
112
87
  TXT
113
88
  end
114
89
 
115
- describe 'db:create and drop' do
116
- it "should create the database and drop the database that was created" do
117
- run_with_output("rake db:create").should match /spec\/tmp\)$/
118
- run_with_output("rake db:drop").should match /spec\/tmp\)$/
119
- end
90
+ it "warns of deprecated folder structure" do
91
+ warning = /DEPRECATED.* db\/migrate/
92
+ run("rake db:create").should_not =~ warning
93
+ write('db/migrations/fooo.rb', 'xxx')
94
+ run("rake db:create").should =~ warning
120
95
  end
121
96
 
122
- describe 'db:create when nonexistent environment is specified' do
123
- it "should provide an informative error message" do
124
- run_with_output("rake db:create DB=nonexistent").should match /nonexistent database is not configured/
97
+ describe 'db:create and drop' do
98
+ it "should create the database and drop the database that was created" do
99
+ run "rake db:create"
100
+ run "rake db:drop"
125
101
  end
126
102
  end
127
103
 
128
104
  describe 'db:new_migration' do
129
- context "single migration path" do
130
- it "fails if i do not add a name" do
131
- run("rake db:new_migration").should_not =~ /SUCCESS/
132
- end
133
-
134
- it "generates a new migration with this name and timestamp" do
135
- run("rake db:new_migration name=test_abc").should =~ %r{Created migration .*spec/tmp/db/migrations/\d+_test_abc\.rb}
136
- run("ls db/migrations").should =~ /^\d+_test_abc.rb$/
137
- end
138
- end
139
-
140
- context "multiple migration paths" do
141
- before do
142
- write_rakefile %{t.migrations = "db/migrations", "db/migrations2"}
143
- end
144
- it "chooses the first path" do
145
- run("rake db:new_migration name=test_abc").should =~ %r{Created migration .*db/migrations/\d+_test_abc\.rb}
146
- end
105
+ it "fails if i do not add a name" do
106
+ lambda{ run("rake db:new_migration") }.should raise_error(/name=/)
147
107
  end
148
108
 
149
- context 'sub-namespaced task' do
150
- before do
151
- write_rakefile %{t.sub_namespace = "widgets"}
152
- end
153
- it "fails if i do not add a name" do
154
- run("rake db:widgets:new_migration").should_not =~ /SUCCESS/
155
- end
156
-
157
- it "generates a new migration with this name and timestamp" do
158
- run("rake db:widgets:new_migration name=test_widget").should =~ %r{Created migration .*spec/tmp/db/migrations/\d+_test_widget\.rb}
159
- run("ls db/migrations").should =~ /^\d+_test_widget.rb$/
160
- end
161
-
162
- it 'does not create top level db:new_migration task' do
163
- run('rake db:new_migration').should =~ /Don't know how to build task 'db:new_migration'/
164
- end
109
+ it "generates a new migration with this name and timestamp" do
110
+ run("rake db:new_migration name=test_abc").should =~ %r{Created migration db/migrate/\d+_test_abc\.rb}
111
+ run("ls db/migrate").should =~ /^\d+_test_abc.rb$/
165
112
  end
166
113
  end
167
114
 
@@ -169,192 +116,88 @@ end
169
116
  it "should start with a new database version" do
170
117
  run("rake db:version").should =~ /Current version: 0/
171
118
  end
119
+
120
+ it "should display the current version" do
121
+ run("rake db:new_migration name=test_abc")
122
+ run("rake --trace db:migrate")
123
+ run("rake db:version").should =~ /Current version: #{Time.now.year}/
124
+ end
172
125
  end
173
126
 
174
127
  describe 'db:migrate' do
175
- context "single migration path" do
176
- it "does nothing when no migrations are present" do
177
- run("rake db:migrate").should =~ /SUCCESS/
178
- end
128
+ it "does nothing when no migrations are present" do
129
+ run("rake db:migrate").should_not =~ /Migrating/
130
+ end
179
131
 
180
- it "migrates if i add a migration" do
181
- run("rake db:new_migration name=xxx")
182
- result = run("rake db:migrate")
183
- result.should =~ /SUCCESS/
184
- result.should =~ /Migrating to Xxx \(#{Time.now.year}/
185
- end
132
+ it "migrates if i add a migration" do
133
+ run("rake db:new_migration name=xxx")
134
+ run("rake db:migrate").should =~ /Xxx: Migrating/i
186
135
  end
136
+ end
187
137
 
188
- context "multiple migration paths" do
189
- before do
190
- write_multiple_migrations
191
- end
192
- it "runs the migrator on each migration path" do
193
- result = run("rake db:migrate")
194
- result.should =~ /Migrating to CreateTests \(2010/
195
- result.should =~ /Migrating to CreateTests2 \(2010/
196
- end
138
+ describe 'db:migrate:down' do
139
+ it "migrates down" do
140
+ make_migration('xxx')
141
+ sleep 1
142
+ version = make_migration('yyy')
143
+ run 'rake db:migrate'
144
+
145
+ result = run("rake db:migrate:down VERSION=#{version}")
146
+ result.should_not =~ /DOWN-xxx/
147
+ result.should =~ /DOWN-yyy/
197
148
  end
198
149
 
199
- context 'sub-namespaced task' do
200
- before do
201
- write_rakefile %{t.sub_namespace = "widgets"}
202
- end
203
- it 'runs the migrations' do
204
- run("rake db:widgets:new_migration name=new_widget")
205
- result = run("rake db:widgets:migrate")
206
- result.should =~ /SUCCESS/
207
- result.should =~ /Migrating to NewWidget \(#{Time.now.year}/
208
- end
150
+ it "fails without version" do
151
+ make_migration('yyy')
152
+ lambda{ run("rake db:migrate:down") }.should raise_error(/VERSION/)
153
+ end
154
+ end
209
155
 
210
- it 'does not create top level db:new_migration task' do
211
- run('rake db:migrate').should =~ /Don't know how to build task 'db:migrate'/
212
- end
156
+ describe 'db:migrate:up' do
157
+ it "migrates up" do
158
+ make_migration('xxx')
159
+ run 'rake db:migrate'
160
+ sleep 1
161
+ version = make_migration('yyy')
162
+ result = run("rake db:migrate:up VERSION=#{version}")
163
+ result.should_not =~ /UP-xxx/
164
+ result.should =~ /UP-yyy/
165
+ end
166
+
167
+ it "fails without version" do
168
+ make_migration('yyy')
169
+ lambda{ run("rake db:migrate:up") }.should raise_error(/VERSION/)
213
170
  end
214
171
  end
215
172
 
216
173
  describe 'db:rollback' do
217
174
  it "does nothing when no migrations have been run" do
218
- run("rake db:rollback").should =~ /SUCCESS/
175
+ run("rake db:version").should =~ /version: 0/
176
+ run("rake db:rollback").should == ''
177
+ run("rake db:version").should =~ /version: 0/
219
178
  end
220
179
 
221
- it "rolls back the last migration if one has been applied" do
222
- write_reversible_migration
223
- run("rake db:migrate")
224
-
225
- result = run("rake db:rollback")
226
- result.should =~ /SUCCESS/
227
- result.should =~ /reverted/
180
+ it "rolls back the last migration if one has been applied" do
181
+ write_multiple_migrations
182
+ run("rake db:migrate")
183
+ run("rake db:version").should =~ /version: 20100509095816/
184
+ run("rake db:rollback").should =~ /revert/
185
+ run("rake db:version").should =~ /version: 20100509095815/
228
186
  end
229
187
 
230
188
  it "rolls back multiple migrations if the STEP argument is given" do
231
- write_multiple_migrations
232
- run("rake db:migrate")
233
-
234
- result = run("rake db:rollback STEP=2")
235
- result.should =~ /SUCCESS/
236
- result.should =~ /reverted/
237
- end
238
- end
239
-
240
- describe 'db:migrate:down' do
241
- context "single migration path" do
242
- it "migrates down" do
243
- make_migration('xxx')
244
- sleep 1
245
- version = make_migration('yyy')
246
- run 'rake db:migrate'
247
-
248
- result = run("rake db:migrate:down VERSION=#{version}")
249
- result.should =~ /SUCCESS/
250
- result.should_not =~ /DOWN-xxx/
251
- result.should =~ /DOWN-yyy/
252
- end
253
-
254
- it "fails without version" do
255
- make_migration('yyy')
256
- result = run("rake db:migrate:down")
257
- result.should_not =~ /SUCCESS/
258
- end
189
+ write_multiple_migrations
190
+ run("rake db:migrate")
191
+ run("rake db:version").should =~ /version: 20100509095816/
192
+ run("rake db:rollback STEP=2") =~ /revert/
193
+ run("rake db:version").should =~ /version: 0/
259
194
  end
260
-
261
- context "multiple migration paths" do
262
- before do
263
- write_multiple_migrations
264
- end
265
-
266
- it "runs down on the correct path" do
267
- run 'rake db:migrate'
268
- result = run 'rake db:migrate:down VERSION=20100509095815'
269
- result.should =~ /DOWN-CreateTests/
270
- result.should_not =~ /DOWN-CreateTests2/
271
- end
272
-
273
- it "fails if migration number isn't found" do
274
- run 'rake db:migrate'
275
- result = run 'rake db:migrate:down VERSION=20100509095820'
276
- result.should_not =~ /SUCCESS/
277
- result.should =~ /wasn't found on path/
278
- end
279
- end
280
-
281
- context 'sub-namespaced task' do
282
- before do
283
- write_rakefile %{t.sub_namespace = "widgets"}
284
- end
285
- it 'migrates down' do
286
- make_sub_namespaced_migration('widgets', 'widget_xxx')
287
- sleep 1
288
- version = make_sub_namespaced_migration('widgets', 'widget_yyy')
289
- run 'rake db:widgets:migrate'
290
-
291
- result = run("rake db:widgets:migrate:down VERSION=#{version}")
292
- result.should =~ /SUCCESS/
293
- result.should_not =~ /DOWN-widget_xxx/
294
- result.should =~ /DOWN-widget_yyy/
295
- end
296
- end
297
- end
298
-
299
- describe 'db:migrate:up' do
300
- context "single migration path" do
301
- it "migrates up" do
302
- make_migration('xxx')
303
- run 'rake db:migrate'
304
- sleep 1
305
- version = make_migration('yyy')
306
- result = run("rake db:migrate:up VERSION=#{version}")
307
- result.should =~ /SUCCESS/
308
- result.should_not =~ /UP-xxx/
309
- result.should =~ /UP-yyy/
310
- end
311
-
312
- it "fails without version" do
313
- make_migration('yyy')
314
- result = run("rake db:migrate:up")
315
- result.should_not =~ /SUCCESS/
316
- end
317
- end
318
-
319
- context "multiple migration paths" do
320
- before do
321
- write_multiple_migrations
322
- end
323
-
324
- it "runs down on the correct path" do
325
- result = run 'rake db:migrate:up VERSION=20100509095815'
326
- result.should =~ /UP-CreateTests/
327
- result.should_not =~ /UP-CreateTests2/
328
- end
329
-
330
- it "fails if migration number isn't found" do
331
- result = run 'rake db:migrate:up VERSION=20100509095820'
332
- result.should_not =~ /SUCCESS/
333
- result.should =~ /wasn't found on path/
334
- end
335
- end
336
-
337
- context 'sub-namespaced task' do
338
- before do
339
- write_rakefile %{t.sub_namespace = "widgets"}
340
- end
341
- it 'migrates up' do
342
- make_sub_namespaced_migration('widgets', 'widget_xxx')
343
- run 'rake db:widgets:migrate'
344
- sleep 1
345
- version = make_sub_namespaced_migration('widgets', 'widget_yyy')
346
- result = run("rake db:widgets:migrate:up VERSION=#{version}")
347
- result.should =~ /SUCCESS/
348
- result.should_not =~ /UP-widget_xxx/
349
- result.should =~ /UP-widget_yyy/
350
- end
351
- end
352
- end
195
+ end
353
196
 
354
197
  describe 'schema:dump' do
355
198
  it "dumps the schema" do
356
- result = run('rake db:schema:dump')
357
- result.should =~ /SUCCESS/
199
+ write('db/schema.rb', '')
200
+ run('rake db:schema:dump')
358
201
  read('db/schema.rb').should =~ /ActiveRecord/
359
202
  end
360
203
  end
@@ -365,38 +208,57 @@ end
365
208
  schema = "db/schema.rb"
366
209
  write(schema, read(schema)+"\nputs 'LOADEDDD'")
367
210
  result = run('rake db:schema:load')
368
- result.should =~ /SUCCESS/
369
211
  result.should =~ /LOADEDDD/
370
212
  end
213
+
214
+ it "loads all migrations" do
215
+ make_migration('yyy')
216
+ run "rake db:migrate"
217
+ run "rake db:drop"
218
+ run "rake db:create"
219
+ run "rake db:schema:load"
220
+ run( "rake db:migrate").strip.should == ''
221
+ end
371
222
  end
372
223
 
373
224
  describe 'db:abort_if_pending_migrations' do
374
225
  it "passes when no migrations are pending" do
375
- run("rake db:abort_if_pending_migrations").should_not =~ /try again/
226
+ run("rake db:abort_if_pending_migrations").strip.should == ''
376
227
  end
377
228
 
378
229
  it "fails when migrations are pending" do
379
230
  make_migration('yyy')
380
- result = run("rake db:abort_if_pending_migrations")
381
- result.should =~ /try again/
382
- result.should =~ /1 pending migration/
231
+ lambda{ run("rake db:abort_if_pending_migrations") }.should raise_error(/1 pending migration/)
383
232
  end
384
233
  end
385
234
 
386
235
  describe 'db:test:load' do
387
236
  it 'loads' do
388
237
  write("db/schema.rb", "puts 'LOADEDDD'")
389
- run("rake db:test:load").should =~ /LOADEDDD.*SUCCESS/m
238
+ run("rake db:test:load").should =~ /LOADEDDD/
390
239
  end
391
240
 
392
241
  it "fails without schema" do
393
- run("rake db:test:load").should =~ /no such file to load/
242
+ lambda{ run("rake db:test:load") }.should raise_error(/try again/)
394
243
  end
395
244
  end
396
245
 
397
246
  describe 'db:test:purge' do
398
247
  it "runs" do
399
- run('rake db:test:purge').should =~ /SUCCESS/
248
+ run('rake db:test:purge')
400
249
  end
401
250
  end
251
+
252
+ describe 'db:migrate when environment is specified' do
253
+ it "runs when using the DB environment variable" do
254
+ make_migration('yyy')
255
+ run('rake db:migrate DB=test')
256
+ run('rake db:version DB=test').should_not =~ /version: 0/
257
+ run('rake db:version').should =~ /version: 0/
258
+ end
259
+
260
+ it "should error on an invalid database" do
261
+ lambda{ run("rake db:create DB=nonexistent")}.should raise_error(/rake aborted/)
262
+ end
263
+ end
402
264
  end
@@ -5,16 +5,19 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{standalone_migrations}
8
- s.version = "0.4.11"
8
+ s.version = "1.0.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Todd Huss", "Michael Grosser"]
12
- s.date = %q{2011-07-07}
12
+ s.date = %q{2011-07-10}
13
13
  s.email = %q{thuss@gabrito.com}
14
14
  s.extra_rdoc_files = [
15
15
  "README.markdown"
16
16
  ]
17
17
  s.files = [
18
+ "Gemfile",
19
+ "Gemfile.lock",
20
+ "MIT-LICENSE",
18
21
  "README.markdown",
19
22
  "Rakefile",
20
23
  "VERSION",
@@ -37,14 +40,14 @@ Gem::Specification.new do |s|
37
40
 
38
41
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
39
42
  s.add_runtime_dependency(%q<rake>, [">= 0"])
40
- s.add_runtime_dependency(%q<activerecord>, [">= 0"])
43
+ s.add_runtime_dependency(%q<activerecord>, [">= 3"])
41
44
  else
42
45
  s.add_dependency(%q<rake>, [">= 0"])
43
- s.add_dependency(%q<activerecord>, [">= 0"])
46
+ s.add_dependency(%q<activerecord>, [">= 3"])
44
47
  end
45
48
  else
46
49
  s.add_dependency(%q<rake>, [">= 0"])
47
- s.add_dependency(%q<activerecord>, [">= 0"])
50
+ s.add_dependency(%q<activerecord>, [">= 3"])
48
51
  end
49
52
  end
50
53
 
metadata CHANGED
@@ -3,10 +3,10 @@ name: standalone_migrations
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
+ - 1
6
7
  - 0
7
- - 4
8
- - 11
9
- version: 0.4.11
8
+ - 0
9
+ version: 1.0.0
10
10
  platform: ruby
11
11
  authors:
12
12
  - Todd Huss
@@ -15,12 +15,11 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-07-07 00:00:00 -07:00
18
+ date: 2011-07-10 00:00:00 -07:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
22
22
  name: rake
23
- prerelease: false
24
23
  requirement: &id001 !ruby/object:Gem::Requirement
25
24
  none: false
26
25
  requirements:
@@ -30,19 +29,20 @@ dependencies:
30
29
  - 0
31
30
  version: "0"
32
31
  type: :runtime
32
+ prerelease: false
33
33
  version_requirements: *id001
34
34
  - !ruby/object:Gem::Dependency
35
35
  name: activerecord
36
- prerelease: false
37
36
  requirement: &id002 !ruby/object:Gem::Requirement
38
37
  none: false
39
38
  requirements:
40
39
  - - ">="
41
40
  - !ruby/object:Gem::Version
42
41
  segments:
43
- - 0
44
- version: "0"
42
+ - 3
43
+ version: "3"
45
44
  type: :runtime
45
+ prerelease: false
46
46
  version_requirements: *id002
47
47
  description:
48
48
  email: thuss@gabrito.com
@@ -53,6 +53,9 @@ extensions: []
53
53
  extra_rdoc_files:
54
54
  - README.markdown
55
55
  files:
56
+ - Gemfile
57
+ - Gemfile.lock
58
+ - MIT-LICENSE
56
59
  - README.markdown
57
60
  - Rakefile
58
61
  - VERSION