seed_migration 1.1.0 → 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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 78f4daf16c4c6c80bcd1774606a1873b860eedf0
4
- data.tar.gz: 36d0c48eb0420bcb7ceba3cf287384eab7e71977
3
+ metadata.gz: 5d535ca4398f774e12467c56e174923aca1c20d5
4
+ data.tar.gz: 7de4bf9f1f32a8c199a83e43e204b20f578e4f19
5
5
  SHA512:
6
- metadata.gz: 40d9f2546b0eb5fe9fc65a9375a41a0d6a5abbbb56ea32eea845bb83dacad0ee3165d3c77908cf19a407344d8998ee0640ddcb8d72ae13ee600008696be05b3a
7
- data.tar.gz: b15825df57b3c3a5a6793446a473f1a13e5d4af0ccbe79835b125a5129f8fb6f57e5483a28123019062d621d792ea914572aed3a267eecbcd8eeab01a65f4bbc
6
+ metadata.gz: ca7c584a9a4b42c8d6f38d145a4d1b320ac311779c3dac98223415be2ff4439d5350b5db3a8a20e44b1885e18eb4ca201984c9abe4544d7e79493f3888d6b1ce
7
+ data.tar.gz: 900252bf1b87a11f1530e5976f95bd906c8a398277e86f7b6661a52857187603cae1eafc41b34ed18a200bea614c727d017cf393842e6ca0de4fd3938b4f5777
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- [![Build Status](https://travis-ci.org/harrystech/seed_migration.svg?branch=master)](https://travis-ci.org/harrystech/seed_migration) [![Gem Version](https://badge.fury.io/rb/seed_migration.svg)](http://badge.fury.io/rb/seed_migration)
1
+ [![Build Status](https://travis-ci.org/harrystech/seed_migration.svg?branch=master)](https://travis-ci.org/harrystech/seed_migration) [![Gem Version](https://badge.fury.io/rb/seed_migration.svg)](http://badge.fury.io/rb/seed_migration) [![Code Climate](https://codeclimate.com/repos/565d2ab865f101004800136a/badges/22e9c1da0befd44cac82/gpa.svg)](https://codeclimate.com/repos/565d2ab865f101004800136a/feed) [![Test Coverage](https://codeclimate.com/repos/565d2ab865f101004800136a/badges/22e9c1da0befd44cac82/coverage.svg)](https://codeclimate.com/repos/565d2ab865f101004800136a/coverage)
2
2
 
3
3
  # SeedMigration
4
4
 
@@ -21,7 +21,7 @@ gem 'seed_migration'
21
21
 
22
22
  ### Install and run the internal migrations
23
23
 
24
- ```ruby
24
+ ```
25
25
  rake seed_migration:install:migrations
26
26
  rake db:migrate
27
27
  ```
@@ -32,7 +32,7 @@ That will create the table to keep track of data migrations.
32
32
 
33
33
  You can use the generator :
34
34
 
35
- ```ruby
35
+ ```
36
36
  rails g seed_migration AddFoo
37
37
  ```
38
38
  A new file will be created under `db/data/` using rails migration convention:
@@ -47,13 +47,13 @@ You'll need to implement the `#up` method and if you need to be able to rollback
47
47
 
48
48
  To run all pending migrations, simply use
49
49
 
50
- ```ruby
50
+ ```
51
51
  rake seed:migrate
52
52
  ```
53
53
 
54
54
  If needed, you can run a specific migration:
55
55
 
56
- ```ruby
56
+ ```
57
57
  rake seed:migrate MIGRATION=20140407162007_add_foo.rb
58
58
  ```
59
59
 
@@ -61,22 +61,42 @@ rake seed:migrate MIGRATION=20140407162007_add_foo.rb
61
61
 
62
62
  Rolling back the last migration is as simple as:
63
63
 
64
- ```ruby
64
+ ```
65
65
  rake seed:rollback
66
66
  ```
67
67
 
68
68
  You can rollback more than one migration at the same time:
69
69
 
70
- ```ruby
70
+ ```
71
71
  rake seed:rollback STEP=3 # rollback last 3 migrations
72
72
  ```
73
73
 
74
74
  Or rollback a specific migration:
75
75
 
76
- ```ruby
76
+ ```
77
77
  rake seed:rollback MIGRATION=20140407162007_add_foo.rb
78
78
  ```
79
79
 
80
+ ### Status
81
+
82
+ See the status of your migrations:
83
+
84
+ ```
85
+ rake seed:migrate:status
86
+ ```
87
+
88
+ Example output:
89
+
90
+ ```
91
+ database: seed-migrationdevelopment
92
+
93
+ Status Migration ID Migration Name
94
+ --------------------------------------------------
95
+ up 20160114153832 Add users
96
+ down 20160114153843 Add more users
97
+ down 20160114153851 Add even more users
98
+ ```
99
+
80
100
  ### Registering models
81
101
 
82
102
  By default no models are registered, so running seed migrations won't update the seeds file.
@@ -124,6 +144,17 @@ SeedMigration::Migrator.bootstrap(20140404193326)
124
144
 
125
145
  Note that `seeds.rb` is only generated in development mode. Production data will not be dumped in this process.
126
146
 
147
+ ### Checking for pending migrations
148
+
149
+ Check for pending data migrations:
150
+
151
+ ```ruby
152
+ SeedMigration::Migrator.check_pending!
153
+ ```
154
+
155
+ If there are pending migrations, this will raise
156
+ `SeedMigration::Migrator::PendingMigrationError`.
157
+
127
158
  ### Adding seed_migrations to an existing app
128
159
 
129
160
  If your app already contains seeds, using this gem could cause some issues.
@@ -207,7 +238,7 @@ SeedMigration.register Product
207
238
 
208
239
  At the moment, we rely by default on
209
240
 
210
- ```
241
+ ```ruby
211
242
  ActiveRecord::Base.connection.reset_pk_sequence!
212
243
  ```
213
244
  which is `pg` only.
@@ -218,7 +249,7 @@ If you need to use this gem with another database, use the `ignore_ids` configur
218
249
  ## Runnings tests
219
250
 
220
251
 
221
- ```ruby
252
+ ```
222
253
  RAILS_ENV=test bundle exec rake app:db:reset
223
254
  bundle exec rspec spec
224
255
  ```
@@ -14,7 +14,7 @@ module SeedMigration
14
14
  def register(model, &block)
15
15
  unregister model
16
16
  entry = RegisterEntry.new(model)
17
- entry.instance_eval &block if block_given?
17
+ entry.instance_eval(&block) if block_given?
18
18
 
19
19
  self.registrar << entry
20
20
  end
@@ -2,23 +2,23 @@ require 'rails'
2
2
 
3
3
  module SeedMigration
4
4
 
5
- class << self
6
- mattr_accessor :extend_native_migration_task
7
- mattr_accessor :migration_table_name
8
- mattr_accessor :ignore_ids
9
- mattr_accessor :update_seeds_file
10
- mattr_accessor :migrations_path
11
- mattr_accessor :use_strict_create
12
-
13
- self.migration_table_name = 'seed_migration_data_migrations' # Hardcoded, evil!
14
- self.extend_native_migration_task = false
15
- self.ignore_ids = false
16
- self.update_seeds_file = true
17
- self.migrations_path = 'data'
18
- self.use_strict_create = false
19
- end
20
-
21
- def self.config(&block)
5
+ DEFAULT_TABLE_NAME = 'seed_migration_data_migrations'
6
+
7
+ mattr_accessor :extend_native_migration_task
8
+ mattr_accessor :migration_table_name
9
+ mattr_accessor :ignore_ids
10
+ mattr_accessor :update_seeds_file
11
+ mattr_accessor :migrations_path
12
+ mattr_accessor :use_strict_create
13
+
14
+ self.migration_table_name = DEFAULT_TABLE_NAME
15
+ self.extend_native_migration_task = false
16
+ self.ignore_ids = false
17
+ self.update_seeds_file = true
18
+ self.migrations_path = 'data'
19
+ self.use_strict_create = false
20
+
21
+ def self.config
22
22
  yield self
23
23
  after_config
24
24
  end
@@ -14,7 +14,7 @@ module SeedMigration
14
14
 
15
15
  def initialize(migration_path)
16
16
  @path = Pathname.new(migration_path)
17
- raise "Can't find migration at #{@path.to_s}." if !@path.exist?
17
+ raise "Can't find migration at #{@path}." if !@path.exist?
18
18
  end
19
19
 
20
20
  def up
@@ -37,7 +37,7 @@ module SeedMigration
37
37
  migration.migrated_on = DateTime.now
38
38
  begin
39
39
  migration.save!
40
- rescue Exception => e
40
+ rescue StandardError => e
41
41
  puts e
42
42
  end
43
43
  announce("#{klass}: migrated (#{runtime}s)")
@@ -68,6 +68,12 @@ module SeedMigration
68
68
  end
69
69
  end
70
70
 
71
+ def self.check_pending!
72
+ if get_new_migrations.any?
73
+ raise SeedMigration::Migrator::PendingMigrationError
74
+ end
75
+ end
76
+
71
77
  # Rake methods
72
78
  def self.run_new_migrations
73
79
  # TODO : Add warning about empty registered_models
@@ -105,13 +111,25 @@ module SeedMigration
105
111
  create_seed_file
106
112
  end
107
113
 
114
+ def self.display_migrations_status
115
+ puts "\ndatabase: #{ActiveRecord::Base.connection_config[:database]}\n\n"
116
+ puts "#{'Status'.center(8)} #{'Migration ID'.ljust(14)} Migration Name"
117
+ puts "-" * 50
118
+
119
+ up_versions = get_all_migration_versions
120
+ get_migration_files.each do |file|
121
+ version, name = parse_migration_filename(file)
122
+ status = up_versions.include?(version) ? "up" : "down"
123
+ puts "#{status.center(8)} #{version.ljust(14)} #{name}"
124
+ end
125
+ end
126
+
108
127
  def self.bootstrap(last_timestamp = nil)
109
128
  # replace with logger ?
110
- p "Assume migrated up to #{last_timestamp}"
129
+ p "Assume seed data migrated up to #{last_timestamp}"
111
130
  files = get_migration_files(last_timestamp.to_s)
112
131
  files.each do |file|
113
- name = file.split('/').last
114
- version = name.split('_').first
132
+ _, version = parse_migration_filename(file)
115
133
  migration = SeedMigration::DataMigration.new
116
134
  migration.version = version
117
135
  migration.runtime = 0
@@ -145,7 +163,7 @@ module SeedMigration
145
163
  return files
146
164
  end
147
165
 
148
- all_migration_versions = SeedMigration::DataMigration.all.map(&:version)
166
+ all_migration_versions = get_all_migration_versions
149
167
 
150
168
  files.each do |file|
151
169
  filename = file.split('/').last
@@ -197,6 +215,17 @@ module SeedMigration
197
215
  files.sort!
198
216
  end
199
217
 
218
+ def self.get_all_migration_versions
219
+ SeedMigration::DataMigration.all.map(&:version)
220
+ end
221
+
222
+ def self.parse_migration_filename(filename)
223
+ basename = File.basename(filename, '.rb')
224
+ _, version, underscored_name = basename.match(/(\d+)_(.*)/).to_a
225
+ name = underscored_name.gsub("_", " ").capitalize
226
+ [version, name]
227
+ end
228
+
200
229
  def self.create_seed_file
201
230
  if !SeedMigration.update_seeds_file || !Rails.env.development?
202
231
  return
@@ -247,9 +276,9 @@ SeedMigration::Migrator.bootstrap(#{last_migration})
247
276
  end
248
277
 
249
278
  if Rails::VERSION::MAJOR == 3 || defined?(ActiveModel::MassAssignmentSecurity)
250
- model_creation_string = "#{instance.class}.#{create_method}(#{JSON.parse(sorted_attributes.to_json).to_s}, :without_protection => true)"
279
+ model_creation_string = "#{instance.class}.#{create_method}(#{JSON.parse(sorted_attributes.to_json)}, :without_protection => true)"
251
280
  elsif Rails::VERSION::MAJOR == 4
252
- model_creation_string = "#{instance.class}.#{create_method}(#{JSON.parse(sorted_attributes.to_json).to_s})"
281
+ model_creation_string = "#{instance.class}.#{create_method}(#{JSON.parse(sorted_attributes.to_json)})"
253
282
  end
254
283
 
255
284
  # With pretty indents, please.
@@ -262,5 +291,12 @@ SeedMigration::Migrator.bootstrap(#{last_migration})
262
291
  def self.create_method
263
292
  SeedMigration.use_strict_create? ? 'create!' : 'create'
264
293
  end
294
+
295
+ class PendingMigrationError < StandardError
296
+ def initialize
297
+ super("Data migrations are pending. To resolve this issue, "\
298
+ "run the following:\n\n\trake seed:migrate\n")
299
+ end
300
+ end
265
301
  end
266
302
  end
@@ -1,3 +1,3 @@
1
1
  module SeedMigration
2
- VERSION = "1.1.0"
2
+ VERSION = "1.2.0"
3
3
  end
@@ -12,4 +12,13 @@ namespace :seed do
12
12
  SeedMigration::Migrator.rollback_migrations(ENV["MIGRATION"], ENV["STEP"] || ENV["STEPS"] || 1)
13
13
  end
14
14
  end
15
+
16
+ namespace :migrate do
17
+ if !Rake::Task.task_defined?("seed:migrate:status")
18
+ desc "Display status of data migrations."
19
+ task :status => :environment do
20
+ SeedMigration::Migrator.display_migrations_status
21
+ end
22
+ end
23
+ end
15
24
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: seed_migration
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andy O'Neill
@@ -11,10 +11,10 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2015-11-30 00:00:00.000000000 Z
14
+ date: 2016-07-11 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
- name: sqlite3
17
+ name: pry
18
18
  requirement: !ruby/object:Gem::Requirement
19
19
  requirements:
20
20
  - - ">="
@@ -28,21 +28,21 @@ dependencies:
28
28
  - !ruby/object:Gem::Version
29
29
  version: '0'
30
30
  - !ruby/object:Gem::Dependency
31
- name: pg
31
+ name: rspec-rails
32
32
  requirement: !ruby/object:Gem::Requirement
33
33
  requirements:
34
- - - ">="
34
+ - - '='
35
35
  - !ruby/object:Gem::Version
36
- version: '0'
36
+ version: 2.14.2
37
37
  type: :development
38
38
  prerelease: false
39
39
  version_requirements: !ruby/object:Gem::Requirement
40
40
  requirements:
41
- - - ">="
41
+ - - '='
42
42
  - !ruby/object:Gem::Version
43
- version: '0'
43
+ version: 2.14.2
44
44
  - !ruby/object:Gem::Dependency
45
- name: pry
45
+ name: rspec-mocks
46
46
  requirement: !ruby/object:Gem::Requirement
47
47
  requirements:
48
48
  - - ">="
@@ -56,21 +56,21 @@ dependencies:
56
56
  - !ruby/object:Gem::Version
57
57
  version: '0'
58
58
  - !ruby/object:Gem::Dependency
59
- name: rspec-rails
59
+ name: test-unit
60
60
  requirement: !ruby/object:Gem::Requirement
61
61
  requirements:
62
- - - '='
62
+ - - "~>"
63
63
  - !ruby/object:Gem::Version
64
- version: 2.14.2
64
+ version: '3.0'
65
65
  type: :development
66
66
  prerelease: false
67
67
  version_requirements: !ruby/object:Gem::Requirement
68
68
  requirements:
69
- - - '='
69
+ - - "~>"
70
70
  - !ruby/object:Gem::Version
71
- version: 2.14.2
71
+ version: '3.0'
72
72
  - !ruby/object:Gem::Dependency
73
- name: rspec-mocks
73
+ name: codeclimate-test-reporter
74
74
  requirement: !ruby/object:Gem::Requirement
75
75
  requirements:
76
76
  - - ">="
@@ -83,20 +83,6 @@ dependencies:
83
83
  - - ">="
84
84
  - !ruby/object:Gem::Version
85
85
  version: '0'
86
- - !ruby/object:Gem::Dependency
87
- name: test-unit
88
- requirement: !ruby/object:Gem::Requirement
89
- requirements:
90
- - - "~>"
91
- - !ruby/object:Gem::Version
92
- version: '3.0'
93
- type: :development
94
- prerelease: false
95
- version_requirements: !ruby/object:Gem::Requirement
96
- requirements:
97
- - - "~>"
98
- - !ruby/object:Gem::Version
99
- version: '3.0'
100
86
  description: Rails gem for Data Migrations
101
87
  email:
102
88
  - aoneill@harrys.com
@@ -142,7 +128,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
142
128
  version: '0'
143
129
  requirements: []
144
130
  rubyforge_project:
145
- rubygems_version: 2.4.5
131
+ rubygems_version: 2.5.1
146
132
  signing_key:
147
133
  specification_version: 4
148
134
  summary: Rails Data Migration