ardm-migrations 1.2.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.
Files changed (61) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +35 -0
  3. data/.travis.yml +11 -0
  4. data/Gemfile +53 -0
  5. data/LICENSE +20 -0
  6. data/README.rdoc +39 -0
  7. data/Rakefile +4 -0
  8. data/ardm-migrations.gemspec +27 -0
  9. data/db/migrations/1_create_people_table.rb +12 -0
  10. data/db/migrations/2_add_dob_to_people.rb +13 -0
  11. data/db/migrations/config.rb +4 -0
  12. data/examples/Rakefile +144 -0
  13. data/examples/sample_migration.rb +58 -0
  14. data/examples/sample_migration_spec.rb +50 -0
  15. data/lib/ardm-migrations.rb +1 -0
  16. data/lib/dm-migrations/adapters/dm-do-adapter.rb +295 -0
  17. data/lib/dm-migrations/adapters/dm-mysql-adapter.rb +299 -0
  18. data/lib/dm-migrations/adapters/dm-oracle-adapter.rb +332 -0
  19. data/lib/dm-migrations/adapters/dm-postgres-adapter.rb +159 -0
  20. data/lib/dm-migrations/adapters/dm-sqlite-adapter.rb +96 -0
  21. data/lib/dm-migrations/adapters/dm-sqlserver-adapter.rb +177 -0
  22. data/lib/dm-migrations/adapters/dm-yaml-adapter.rb +23 -0
  23. data/lib/dm-migrations/auto_migration.rb +239 -0
  24. data/lib/dm-migrations/exceptions/duplicate_migration.rb +6 -0
  25. data/lib/dm-migrations/migration.rb +300 -0
  26. data/lib/dm-migrations/migration_runner.rb +85 -0
  27. data/lib/dm-migrations/sql/column.rb +5 -0
  28. data/lib/dm-migrations/sql/mysql.rb +61 -0
  29. data/lib/dm-migrations/sql/postgres.rb +82 -0
  30. data/lib/dm-migrations/sql/sqlite.rb +51 -0
  31. data/lib/dm-migrations/sql/table.rb +15 -0
  32. data/lib/dm-migrations/sql/table_creator.rb +109 -0
  33. data/lib/dm-migrations/sql/table_modifier.rb +57 -0
  34. data/lib/dm-migrations/sql.rb +5 -0
  35. data/lib/dm-migrations/version.rb +5 -0
  36. data/lib/dm-migrations.rb +3 -0
  37. data/lib/spec/example/migration_example_group.rb +73 -0
  38. data/lib/spec/matchers/migration_matchers.rb +106 -0
  39. data/spec/integration/auto_migration_spec.rb +553 -0
  40. data/spec/integration/auto_upgrade_spec.rb +40 -0
  41. data/spec/integration/migration_runner_spec.rb +89 -0
  42. data/spec/integration/migration_spec.rb +157 -0
  43. data/spec/integration/sql_spec.rb +250 -0
  44. data/spec/isolated/require_after_setup_spec.rb +30 -0
  45. data/spec/isolated/require_before_setup_spec.rb +30 -0
  46. data/spec/isolated/require_spec.rb +25 -0
  47. data/spec/rcov.opts +6 -0
  48. data/spec/spec.opts +4 -0
  49. data/spec/spec_helper.rb +18 -0
  50. data/spec/unit/migration_spec.rb +453 -0
  51. data/spec/unit/sql/column_spec.rb +14 -0
  52. data/spec/unit/sql/postgres_spec.rb +97 -0
  53. data/spec/unit/sql/sqlite_extensions_spec.rb +108 -0
  54. data/spec/unit/sql/table_creator_spec.rb +94 -0
  55. data/spec/unit/sql/table_modifier_spec.rb +49 -0
  56. data/spec/unit/sql/table_spec.rb +28 -0
  57. data/spec/unit/sql_spec.rb +7 -0
  58. data/tasks/spec.rake +38 -0
  59. data/tasks/yard.rake +9 -0
  60. data/tasks/yardstick.rake +19 -0
  61. metadata +150 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 92f93f472dab02d31afe97f1eeb7a8c678bf93dd
4
+ data.tar.gz: ef8affab3f303cb35f70529616936114d0d0aa54
5
+ SHA512:
6
+ metadata.gz: 49bc21cc18de995796d5755f80c305a0daf4b7ab69610e3d7561e04c07c699bc9ca2686b61845326978161249f56cd3da45d5caa798a97201dd095283aff0333
7
+ data.tar.gz: 6feded039b1f6a3afd3868ab600b240d46ca2d6dab1a8184c4e13d55de1ba905a1b9563ad61b242c35810351ba5a6d8357f729dbb44afdbbca60b4c7c72f05fd
data/.gitignore ADDED
@@ -0,0 +1,35 @@
1
+ ## MAC OS
2
+ .DS_Store
3
+
4
+ ## TEXTMATE
5
+ *.tmproj
6
+ tmtags
7
+
8
+ ## EMACS
9
+ *~
10
+ \#*
11
+ .\#*
12
+
13
+ ## VIM
14
+ *.swp
15
+
16
+ ## Rubinius
17
+ *.rbc
18
+
19
+ ## PROJECT::GENERAL
20
+ *.gem
21
+ coverage
22
+ rdoc
23
+ pkg
24
+ tmp
25
+ doc
26
+ log
27
+ .yardoc
28
+ measurements
29
+
30
+ ## BUNDLER
31
+ .bundle
32
+ Gemfile.*
33
+
34
+ ## PROJECT::SPECIFIC
35
+ spec/db/
data/.travis.yml ADDED
@@ -0,0 +1,11 @@
1
+ language: ruby
2
+ sudo: false
3
+ rvm:
4
+ - 1.9.3
5
+ - 2.0.0
6
+ - 2.1.5
7
+ - 2.2.0
8
+ matrix:
9
+ allow_failures:
10
+ - rvm: 2.1.5
11
+ - rvm: 2.2.0
data/Gemfile ADDED
@@ -0,0 +1,53 @@
1
+ require 'pathname'
2
+
3
+ source 'https://rubygems.org'
4
+
5
+ gemspec
6
+
7
+ SOURCE = ENV.fetch('SOURCE', :git).to_sym
8
+ REPO_POSTFIX = SOURCE == :path ? '' : '.git'
9
+ DATAMAPPER = SOURCE == :path ? Pathname(__FILE__).dirname.parent : 'http://github.com/ar-dm'
10
+ DM_VERSION = '~> 1.2.0'
11
+ DO_VERSION = '~> 0.10.6'
12
+ DM_DO_ADAPTERS = %w[ sqlite postgres mysql oracle sqlserver ]
13
+ CURRENT_BRANCH = ENV.fetch('GIT_BRANCH', 'master')
14
+
15
+ gem 'ardm-core', DM_VERSION, SOURCE => "#{DATAMAPPER}/ardm-core#{REPO_POSTFIX}", :branch => CURRENT_BRANCH
16
+
17
+ group :datamapper do
18
+
19
+ adapters = ENV['ADAPTER'] || ENV['ADAPTERS']
20
+ adapters = adapters.to_s.tr(',', ' ').split.uniq - %w[ in_memory ]
21
+
22
+ if (do_adapters = DM_DO_ADAPTERS & adapters).any?
23
+ do_options = {}
24
+ do_options[:git] = "#{DATAMAPPER}/do#{REPO_POSTFIX}" if ENV['DO_GIT'] == 'true'
25
+
26
+ gem 'data_objects', DO_VERSION, do_options.dup
27
+
28
+ do_adapters.each do |adapter|
29
+ adapter = 'sqlite3' if adapter == 'sqlite'
30
+ gem "do_#{adapter}", DO_VERSION, do_options.dup
31
+ end
32
+
33
+ gem 'ardm-do-adapter', DM_VERSION,
34
+ SOURCE => "#{DATAMAPPER}/ardm-do-adapter#{REPO_POSTFIX}",
35
+ :branch => CURRENT_BRANCH
36
+ end
37
+
38
+ adapters.each do |adapter|
39
+ gem "ardm-#{adapter}-adapter", DM_VERSION,
40
+ SOURCE => "#{DATAMAPPER}/ardm-#{adapter}-adapter#{REPO_POSTFIX}",
41
+ :branch => CURRENT_BRANCH
42
+ end
43
+
44
+ plugins = ENV['PLUGINS'] || ENV['PLUGIN']
45
+ plugins = plugins.to_s.tr(',', ' ').split.uniq
46
+
47
+ plugins.each do |plugin|
48
+ gem plugin, DM_VERSION,
49
+ SOURCE => "#{DATAMAPPER}/#{plugin}#{REPO_POSTFIX}",
50
+ :branch => CURRENT_BRANCH
51
+ end
52
+
53
+ end
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2011 Paul Sadauskas
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.rdoc ADDED
@@ -0,0 +1,39 @@
1
+ = dm-migrations
2
+
3
+ DataMapper plugin for writing and specing migrations.
4
+
5
+ == Example
6
+
7
+ require 'dm-migrations/migration_runner'
8
+
9
+ DataMapper.setup(:default, "sqlite3::memory")
10
+
11
+ DataMapper::Logger.new(STDOUT, :debug)
12
+ DataMapper.logger.debug( "Starting Migration" )
13
+
14
+ migration 1, :create_people_table do
15
+ up do
16
+ create_table :people do
17
+ column :id, Integer, :serial => true
18
+ column :desc, String
19
+ end
20
+ end
21
+
22
+ down do
23
+ drop_table :people
24
+ end
25
+ end
26
+
27
+ migration 2, :make_desc_text do
28
+ up do
29
+ modify_table :people do
30
+ # You currently have to use the underlying DB type here, rather than
31
+ # a DataMapper type
32
+ change_column :desc, 'text'
33
+ end
34
+ end
35
+ end
36
+
37
+ migrate_up!
38
+
39
+ For more, see the examples directory.
data/Rakefile ADDED
@@ -0,0 +1,4 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+
4
+ FileList['tasks/**/*.rake'].each { |task| import task }
@@ -0,0 +1,27 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path('../lib/dm-migrations/version', __FILE__)
3
+
4
+ Gem::Specification.new do |gem|
5
+ gem.name = 'ardm-migrations'
6
+ gem.version = DataMapper::Migrations::VERSION
7
+
8
+ gem.authors = ["Martin Emde", "Paul Sadauskas"]
9
+ gem.email = ['me@martinemde.com', 'psadauskas [a] gmail [d] com']
10
+ gem.description = "Ardm fork of dm-migrations"
11
+ gem.summary = gem.description
12
+ gem.license = "MIT"
13
+
14
+ gem.files = `git ls-files`.split("\n")
15
+ gem.test_files = `git ls-files -- {spec}/*`.split("\n")
16
+ gem.extra_rdoc_files = %w[LICENSE README.rdoc]
17
+
18
+ gem.homepage = "http://github.com/martinemde/ardm-migrations"
19
+
20
+ gem.require_paths = ["lib"]
21
+
22
+ gem.add_runtime_dependency 'ardm-core', '~> 1.2'
23
+
24
+ gem.add_development_dependency 'rake', '~> 0.9'
25
+ gem.add_development_dependency 'rspec', '~> 1.3'
26
+ end
27
+
@@ -0,0 +1,12 @@
1
+ migration 1, :create_people_table do
2
+ up do
3
+ create_table :people do
4
+ column :id, Integer, :serial => true
5
+ column :name, String, :size => 50
6
+ column :age, Integer
7
+ end
8
+ end
9
+ down do
10
+ drop_table :people
11
+ end
12
+ end
@@ -0,0 +1,13 @@
1
+ migration 2, :add_dob_to_people do
2
+ up do
3
+ modify_table :people do
4
+ add_column :dob, DateTime, :allow_nil => true
5
+ end
6
+ end
7
+
8
+ down do
9
+ modify_table :people do
10
+ drop_column :dob
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,4 @@
1
+ DataMapper::Logger.new(STDOUT, :debug)
2
+ DataMapper.logger.debug( "Starting Migration" )
3
+
4
+ DataMapper.setup(:default, 'postgres://postgres@localhost/dm_core_test')
data/examples/Rakefile ADDED
@@ -0,0 +1,144 @@
1
+ # Sample tasks using dm-migrations
2
+ # Roughly following Rails conventions, and mostly based on Padrino's dm:* tasks
3
+ #
4
+ # Cf. https://github.com/padrino/padrino-framework/blob/master/padrino-gen/lib/padrino-gen/padrino-tasks/datamapper.rb
5
+ # https://github.com/datamapper/dm-rails/blob/master/lib/dm-rails/railties/database.rake
6
+ #
7
+
8
+ require 'rake'
9
+
10
+ # replace this with however your app configures DataMapper repositor(ies)
11
+ task :environment do
12
+ require File.expand_path('boot', File.dirname(__FILE__))
13
+ end
14
+
15
+ namespace :db do
16
+
17
+ namespace :auto do
18
+
19
+ desc "Perform auto-migration (reset your db data)"
20
+ task :migrate => :environment do |t, _|
21
+ puts "=> Auto-migrating"
22
+ ::DataMapper.auto_migrate!
23
+ puts "<= #{t.name} done"
24
+ end
25
+
26
+ desc "Perform non destructive auto-migration"
27
+ task :upgrade => :environment do
28
+ puts "=> Auto-upgrading"
29
+ ::DataMapper.auto_upgrade!
30
+ puts "<= #{t.name} done"
31
+ end
32
+
33
+ end
34
+
35
+ desc "Run all pending migrations, or up to specified migration"
36
+ task :migrate, [:version] => :load_migrations do |t, args|
37
+ if vers = args[:version] || ENV['VERSION']
38
+ puts "=> Migrating up to version #{vers}"
39
+ migrate_up!(vers)
40
+ else
41
+ puts "=> Migrating up"
42
+ migrate_up!
43
+ end
44
+ puts "<= #{t.name} done"
45
+ end
46
+
47
+ desc "Rollback down to specified migration, or rollback last STEP=x migrations (default 1)"
48
+ task :rollback, [:version] => :load_migrations do |t, args|
49
+ if vers = args[:version] || ENV['VERSION']
50
+ puts "=> Rolling back down to migration #{vers}"
51
+ migrate_down!(vers)
52
+ else
53
+ step = ENV['STEP'].to_i || 1
54
+ applied = migrations.delete_if {|m| m.needs_up?}.sort # note this is N queries as currently implemented
55
+ target = applied[-1 * step] || applied[0]
56
+ if target
57
+ puts "=> Rolling back #{step} step(s)"
58
+ migrate_down!(target.position - 1)
59
+ else
60
+ warn "No migrations to rollback: #{step} step(s)"
61
+ end
62
+ end
63
+ puts "<= #{t.name} done"
64
+ end
65
+
66
+ desc "List migrations descending, showing which have been applied"
67
+ task :migrations => :load_migrations do
68
+ puts migrations.sort.reverse.map {|m| "#{m.position} #{m.name} #{m.needs_up? ? '' : 'APPLIED'}"}
69
+ end
70
+
71
+ task :load_migrations => :environment do
72
+ require 'dm-migrations/migration_runner'
73
+ FileList['db/migrate/*.rb'].each do |migration|
74
+ load migration
75
+ end
76
+ end
77
+
78
+
79
+ desc "Create the database"
80
+ task :create, [:repository] => :environment do |t, args|
81
+ repo = args[:repository] || ENV['REPOSITORY'] || :default
82
+ config = DataMapper.repository(repo).adapter.options.symbolize_keys
83
+ user, password, host = config[:user], config[:password], config[:host]
84
+ database = config[:database] || config[:path].sub(/\//, "")
85
+ charset = config[:charset] || ENV['CHARSET'] || 'utf8'
86
+ collation = config[:collation] || ENV['COLLATION'] || 'utf8_unicode_ci'
87
+ puts "=> Creating database '#{database}'"
88
+
89
+ case config[:adapter]
90
+ when 'postgres'
91
+ system("createdb", "-E", charset, "-h", host, "-U", user, database)
92
+ when 'mysql'
93
+ query = [
94
+ "mysql", "--user=#{user}", (password.blank? ? '' : "--password=#{password}"), (%w[127.0.0.1 localhost].include?(host) ? '-e' : "--host=#{host} -e"),
95
+ "CREATE DATABASE #{database} DEFAULT CHARACTER SET #{charset} DEFAULT COLLATE #{collation}".inspect
96
+ ]
97
+ system(query.compact.join(" "))
98
+ when 'sqlite3'
99
+ DataMapper.setup(DataMapper.repository.name, config)
100
+ else
101
+ raise "Adapter #{config[:adapter]} not supported for creating databases yet."
102
+ end
103
+ puts "<= #{t.name} done"
104
+ end
105
+
106
+ desc "Drop the database"
107
+ task :drop, [:repository] => :environment do |t, args|
108
+ repo = args[:repository] || ENV['REPOSITORY'] || :default
109
+ config = DataMapper.repository(repo).adapter.options.symbolize_keys
110
+ user, password, host = config[:user], config[:password], config[:host]
111
+ database = config[:database] || config[:path].sub(/\//, "")
112
+ puts "=> Dropping database '#{database}'"
113
+ case config[:adapter]
114
+ when 'postgres'
115
+ system("dropdb", "-h", host, "-U", user, database)
116
+ when 'mysql'
117
+ query = [
118
+ "mysql", "--user=#{user}", (password.blank? ? '' : "--password=#{password}"), (%w[127.0.0.1 localhost].include?(host) ? '-e' : "--host=#{host} -e"),
119
+ "DROP DATABASE IF EXISTS #{database}".inspect
120
+ ]
121
+ system(query.compact.join(" "))
122
+ when 'sqlite3'
123
+ File.delete(config[:path]) if File.exist?(config[:path])
124
+ else
125
+ raise "Adapter #{config[:adapter]} not supported for dropping databases yet."
126
+ end
127
+ puts "<= #{t.name} done"
128
+ end
129
+
130
+ desc 'Load the seed data from db/seeds.rb'
131
+ task :seed => :environment do |t, _|
132
+ puts "=> Loading seed data"
133
+ seed_file = File.expand_path('db/seeds.rb', File.dirname(__FILE__))
134
+ load(seed_file) if File.exist?(seed_file)
135
+ puts "<= #{t.name} done"
136
+ end
137
+
138
+ desc "Drop the database, migrate from scratch and initialize with the seed data"
139
+ task :reset => [:drop, :setup]
140
+
141
+ desc "Create the database, migrate and initialize with the seed data"
142
+ task :setup => [:create, :migrate, :seed]
143
+
144
+ end
@@ -0,0 +1,58 @@
1
+ require 'dm-migrations/migration_runner'
2
+
3
+ DataMapper.setup(:default, "sqlite3::memory")
4
+
5
+ DataMapper::Logger.new(STDOUT, :debug)
6
+ DataMapper.logger.debug( "Starting Migration" )
7
+
8
+ migration 1, :create_people_table do
9
+ up do
10
+ create_table :people do
11
+ column :id, Integer, :serial => true
12
+ column :name, String, :size => 50
13
+ column :age, Integer
14
+ end
15
+ end
16
+ down do
17
+ drop_table :people
18
+ end
19
+ end
20
+
21
+ migration 2, :add_dob_to_people do
22
+ up do
23
+ modify_table :people do
24
+ add_column :dob, DateTime, :allow_nil => true
25
+ end
26
+ end
27
+
28
+ down do
29
+ modify_table :people do
30
+ drop_column :dob
31
+ end
32
+ end
33
+ end
34
+
35
+ # migrate_down!
36
+ # migrate_up!
37
+ #
38
+ # class Person
39
+ # include DataMapper::Resource
40
+ #
41
+ # property :id, Serial
42
+ # property :name, String, :size => 50
43
+ # property :age, Integer
44
+ # property :dob, DateTime, :default => proc { Time.now }
45
+ #
46
+ # end
47
+ #
48
+ # Person.create(:name => "Mark Bates", :age => 31)
49
+ # puts Person.first.inspect
50
+ # puts Person.all.inspect
51
+
52
+ if $0 == __FILE__
53
+ if $*.first == "down"
54
+ migrate_down!
55
+ else
56
+ migrate_up!
57
+ end
58
+ end
@@ -0,0 +1,50 @@
1
+ require 'pathname'
2
+
3
+ dir = Pathname(__FILE__).dirname.expand_path
4
+
5
+ require dir + 'sample_migration'
6
+ require dir + '../lib/spec/example/migration_example_group'
7
+
8
+ describe :create_people_table, :type => :migration do
9
+
10
+ before do
11
+ run_migration
12
+ end
13
+
14
+ it 'should create a people table' do
15
+ repository(:default).should have_table(:people)
16
+ end
17
+
18
+ it 'should have an id column as the primary key' do
19
+ table(:people).should have_column(:id)
20
+ table(:people).column(:id).type.should == 'integer'
21
+ #table(:people).column(:id).should be_primary_key
22
+ end
23
+
24
+ it 'should have a name column as a string' do
25
+ table(:people).should have_column(:name)
26
+ table(:people).column(:name).type.should == 'character varying'
27
+ table(:people).column(:name).should permit_null
28
+ end
29
+
30
+ it 'should have a nullable age column as a int' do
31
+ table(:people).should have_column(:age)
32
+ table(:people).column(:age).type.should == 'integer'
33
+ table(:people).column(:age).should permit_null
34
+ end
35
+
36
+ end
37
+
38
+ describe :add_dob_to_people, :type => :migration do
39
+
40
+ before do
41
+ run_migration
42
+ end
43
+
44
+ it 'should add a dob column as a timestamp' do
45
+ table(:people).should have_column(:dob)
46
+ table(:people).column(:dob).type.should == 'timestamp without time zone'
47
+ table(:people).column(:dob).should permit_null
48
+ end
49
+
50
+ end
@@ -0,0 +1 @@
1
+ require 'dm-migrations'