versioned_seeds 0.0.1 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.rspec +1 -0
- data/Rakefile +4 -0
- data/lib/generators/versioned_seeds/seed_file_generator.rb +22 -0
- data/lib/generators/versioned_seeds/templates/seed_file.rb +1 -0
- data/lib/tasks/versioned_seeds.rake +3 -3
- data/lib/versioned_seeds.rb +49 -24
- data/lib/versioned_seeds/railtie.rb +1 -1
- data/lib/versioned_seeds/version.rb +1 -1
- data/spec/rails_root/.versioned_seeds +3 -0
- data/spec/rails_root/db/seeds/20111203000001_file1.rb +0 -0
- data/spec/rails_root/db/seeds/20111203000002_file2.rb +0 -0
- data/spec/rails_root/db/seeds/20111203000003_file3.rb +0 -0
- data/spec/versioned_seeds_spec.rb +138 -0
- data/versioned_seeds.gemspec +3 -0
- metadata +39 -4
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--colour
|
data/Rakefile
CHANGED
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'rails/generators'
|
2
|
+
|
3
|
+
module VersionedSeeds
|
4
|
+
class SeedFileGenerator < Rails::Generators::NamedBase
|
5
|
+
# namespace 'vs'
|
6
|
+
source_root File.expand_path("../templates", __FILE__)
|
7
|
+
|
8
|
+
desc "Generates a seed file with a timestamped name"
|
9
|
+
|
10
|
+
def create_seed_file
|
11
|
+
# directory 'db/seeds'
|
12
|
+
template 'seed_file.rb', "db/seeds/#{script_name}.rb"
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def script_name
|
18
|
+
ts = Time.now.utc.strftime("%Y%m%d%H%M%S")
|
19
|
+
"#{ts}_#{name}"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
# Put your seeding script here
|
@@ -3,15 +3,15 @@ require 'versioned_seeds'
|
|
3
3
|
namespace :vs do
|
4
4
|
desc "Display current seeds version"
|
5
5
|
task :status do
|
6
|
-
puts "Last seeds: #{VersionedSeeds.
|
6
|
+
puts "Last seeds: #{VersionedSeeds.last_loaded}"
|
7
7
|
end
|
8
8
|
|
9
|
-
desc "
|
9
|
+
desc "Load the next seeding script"
|
10
10
|
task :next => :environment do
|
11
11
|
VersionedSeeds.next
|
12
12
|
end
|
13
13
|
|
14
|
-
desc "
|
14
|
+
desc "Load all seeding scripts that haven't been loaded yet"
|
15
15
|
task :all => :environment do
|
16
16
|
VersionedSeeds.all
|
17
17
|
end
|
data/lib/versioned_seeds.rb
CHANGED
@@ -4,51 +4,76 @@ require "versioned_seeds/version"
|
|
4
4
|
module VersionedSeeds
|
5
5
|
require "versioned_seeds/railtie" if defined?(Rails)
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
|
7
|
+
module ClassMethods # :nodoc:
|
8
|
+
# Loads the next seeding script
|
9
|
+
def next(loaded=already_loaded)
|
10
|
+
load next_seed(loaded)
|
10
11
|
end
|
11
12
|
|
12
|
-
|
13
|
-
|
13
|
+
# Loads all the seeding scripts that haven't been loaded yet
|
14
|
+
def all(loaded=already_loaded)
|
15
|
+
load all_seeds(loaded)
|
14
16
|
end
|
15
17
|
|
18
|
+
# Returns the next seeding script to load
|
19
|
+
def next_seed(loaded=already_loaded)
|
20
|
+
all_seeds(loaded).first
|
21
|
+
end
|
22
|
+
|
23
|
+
# Returns all the seeding scripts to load
|
24
|
+
def all_seeds(loaded=already_loaded)
|
25
|
+
seeds.delete_if { |seed| loaded.include?(seed.version) }
|
26
|
+
end
|
27
|
+
|
28
|
+
# returns the last loaded seeding script
|
29
|
+
def last_loaded(loaded=already_loaded)
|
30
|
+
loaded.last
|
31
|
+
end
|
32
|
+
|
33
|
+
# Loads a list of seeding scripts and updates the .versioned_seeds file
|
16
34
|
def load(seeds)
|
17
|
-
|
35
|
+
seeds = [*seeds]
|
36
|
+
loaded = seeds.inject([]) do |ary, seed|
|
18
37
|
puts "Loading: #{File.basename seed.file}"
|
19
38
|
require seed.file
|
20
|
-
seed
|
39
|
+
ary << seed
|
40
|
+
ary
|
21
41
|
end
|
22
|
-
write_version last_version if last_version
|
23
|
-
end
|
24
|
-
|
25
|
-
def next_seeds(version=current_version)
|
26
|
-
seeds.keep_if { |seed| seed.version == version.next }
|
27
|
-
end
|
28
42
|
|
29
|
-
|
30
|
-
seeds.keep_if { |seed| seed.version > version }
|
43
|
+
write_loaded loaded
|
31
44
|
end
|
32
45
|
|
46
|
+
# Returns the files located in the rails_root/db/seeds folder sorted by version
|
33
47
|
def seeds
|
34
|
-
Dir[Rails.root+'db/seeds/*.rb'].inject([]) { |list, file|
|
48
|
+
Dir[Rails.root + 'db/seeds/*.rb'].inject([]) { |list, file|
|
35
49
|
filename = File.basename(file)
|
36
|
-
version = filename
|
50
|
+
version = filename[/^(\d+)_/, 1]
|
51
|
+
|
52
|
+
next unless version
|
53
|
+
|
37
54
|
list << OpenStruct.new(:file => file, :version => version)
|
38
55
|
list
|
39
56
|
}.sort { |seed1, seed2| seed1.version <=> seed2.version }
|
40
57
|
end
|
41
58
|
|
42
|
-
|
43
|
-
|
44
|
-
|
59
|
+
# Writes the versions of the loaded script to the .versionned_seeds file
|
60
|
+
def write_loaded(loaded)
|
61
|
+
if loaded.any?
|
62
|
+
File.open(Rails.root + '.versioned_seeds', 'a') do |f|
|
63
|
+
loaded.each { |seed| f.puts seed.version }
|
64
|
+
end
|
65
|
+
else
|
66
|
+
puts "No seed has been loaded"
|
45
67
|
end
|
46
68
|
end
|
47
69
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
File.
|
70
|
+
# Returns the list of already loaded scripts
|
71
|
+
def already_loaded
|
72
|
+
file = Rails.root + '.versioned_seeds'
|
73
|
+
return [0] unless File.exists?(file)
|
74
|
+
File.read(file).split(/\r?\n/)
|
52
75
|
end
|
53
76
|
end
|
77
|
+
|
78
|
+
extend ClassMethods
|
54
79
|
end
|
File without changes
|
File without changes
|
File without changes
|
@@ -0,0 +1,138 @@
|
|
1
|
+
require 'rails'
|
2
|
+
require 'ostruct'
|
3
|
+
require 'versioned_seeds'
|
4
|
+
|
5
|
+
$:.unshift File.join(File.dirname(__FILE__), 'rails_root', 'db', 'seeds')
|
6
|
+
|
7
|
+
module VersionedSeeds
|
8
|
+
class Tester
|
9
|
+
include ClassMethods
|
10
|
+
end
|
11
|
+
|
12
|
+
describe Tester do
|
13
|
+
def remove_seed_file
|
14
|
+
seed_file = Rails.root + '.versioned_seeds'
|
15
|
+
File.delete(seed_file) if File.exists?(seed_file)
|
16
|
+
seed_file
|
17
|
+
end
|
18
|
+
|
19
|
+
let(:rails_root) { Pathname.new(File.dirname __FILE__) + 'rails_root' }
|
20
|
+
let(:vs_folder) { rails_root + 'db/seeds' }
|
21
|
+
[1,2,3].each do |n|
|
22
|
+
let("file#{n}".to_sym) do
|
23
|
+
OpenStruct.new file: (vs_folder+"2011120300000#{n}_file#{n}.rb").to_s, version: "2011120300000#{n}"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
let(:seed_files) { [ file1, file2, file3 ] }
|
27
|
+
|
28
|
+
before :each do
|
29
|
+
@tester = Tester.new
|
30
|
+
@tester.stub(:puts)
|
31
|
+
@tester.stub(:require)
|
32
|
+
|
33
|
+
::Rails.stub(:root) { rails_root }
|
34
|
+
end
|
35
|
+
|
36
|
+
context do
|
37
|
+
before do
|
38
|
+
@tester.stub(:seeds).and_return(seed_files)
|
39
|
+
@tester.stub(:load)
|
40
|
+
end
|
41
|
+
|
42
|
+
describe 'next' do
|
43
|
+
it "should load the next seeding script" do
|
44
|
+
@tester.should_receive(:load).with(file2)
|
45
|
+
@tester.next([file1.version])
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
describe 'all' do
|
50
|
+
it "should load all the seeding scripts that haven't been loaded yet" do
|
51
|
+
@tester.should_receive(:load).with([file2, file3])
|
52
|
+
@tester.all([file1.version])
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
describe 'next_seed' do
|
57
|
+
it "should return the next seeding script to load" do
|
58
|
+
@tester.next_seed([file1.version]).should == file2
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
describe 'all_seeds' do
|
63
|
+
it "should return all the seeding scripts to load" do
|
64
|
+
@tester.all_seeds([file1.version]).should == [file2, file3]
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
describe 'last_loaded' do
|
69
|
+
it "should return the last loaded seeding script" do
|
70
|
+
@tester.last_loaded(seed_files).should == file3
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
describe 'load' do
|
76
|
+
before do
|
77
|
+
@tester.stub(:write_loaded)
|
78
|
+
end
|
79
|
+
|
80
|
+
it "should print the name of loaded files" do
|
81
|
+
@tester.should_receive(:puts).with("Loading: #{File.basename file1.file}")
|
82
|
+
@tester.load file1
|
83
|
+
end
|
84
|
+
|
85
|
+
it "should require the seeding scripts" do
|
86
|
+
@tester.should_receive(:require).with(file1.file)
|
87
|
+
@tester.load file1
|
88
|
+
end
|
89
|
+
|
90
|
+
it "should only require the specified seeding scripts" do
|
91
|
+
@tester.should_not_receive(:require).with(file1.file)
|
92
|
+
@tester.load file2
|
93
|
+
end
|
94
|
+
|
95
|
+
it "should be able to require multiple scripts" do
|
96
|
+
@tester.should_receive(:require).with(file1.file)
|
97
|
+
@tester.should_receive(:require).with(file2.file)
|
98
|
+
@tester.load [file1, file2]
|
99
|
+
end
|
100
|
+
|
101
|
+
it "should write the loaded scripts to .versioned_file" do
|
102
|
+
@tester.should_receive(:write_loaded)
|
103
|
+
@tester.load file1
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
describe 'seeds' do
|
108
|
+
it "should return the files located in the rails_root/db/seeds folder sorted by version" do
|
109
|
+
@tester.seeds.should == seed_files
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
describe 'write_loaded' do
|
114
|
+
it "should write the versions of the loaded scripts to the .versioned_seeds file" do
|
115
|
+
seed_file = remove_seed_file
|
116
|
+
file = mock('file')
|
117
|
+
File.should_receive(:open).with(seed_file, 'a').and_yield(file)
|
118
|
+
file.should_receive(:puts).with(file1.version.to_s)
|
119
|
+
@tester.write_loaded [file1]
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
describe 'already_loaded' do
|
124
|
+
it "should return [0] if the file does not exist" do
|
125
|
+
remove_seed_file
|
126
|
+
@tester.already_loaded.should == [0]
|
127
|
+
end
|
128
|
+
|
129
|
+
it "should return the list of already loaded scripts" do
|
130
|
+
File.open(Rails.root + '.versioned_seeds', 'w') do |f|
|
131
|
+
3.times { |n| f.puts "2011120300000#{n+1}" }
|
132
|
+
end
|
133
|
+
@tester.already_loaded.should == %w(20111203000001 20111203000002 20111203000003)
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
end
|
138
|
+
end
|
data/versioned_seeds.gemspec
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: versioned_seeds
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,8 +9,30 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2011-
|
13
|
-
dependencies:
|
12
|
+
date: 2011-12-05 00:00:00.000000000Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rake
|
16
|
+
requirement: &70330387431100 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0.9'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *70330387431100
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: rspec
|
27
|
+
requirement: &70330387428960 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '2'
|
33
|
+
type: :development
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *70330387428960
|
14
36
|
description: Manage your seed scripts by versioning them
|
15
37
|
email:
|
16
38
|
- scourtois@cubyx.fr
|
@@ -19,13 +41,21 @@ extensions: []
|
|
19
41
|
extra_rdoc_files: []
|
20
42
|
files:
|
21
43
|
- .gitignore
|
44
|
+
- .rspec
|
22
45
|
- Gemfile
|
23
46
|
- README.mdown
|
24
47
|
- Rakefile
|
48
|
+
- lib/generators/versioned_seeds/seed_file_generator.rb
|
49
|
+
- lib/generators/versioned_seeds/templates/seed_file.rb
|
25
50
|
- lib/tasks/versioned_seeds.rake
|
26
51
|
- lib/versioned_seeds.rb
|
27
52
|
- lib/versioned_seeds/railtie.rb
|
28
53
|
- lib/versioned_seeds/version.rb
|
54
|
+
- spec/rails_root/.versioned_seeds
|
55
|
+
- spec/rails_root/db/seeds/20111203000001_file1.rb
|
56
|
+
- spec/rails_root/db/seeds/20111203000002_file2.rb
|
57
|
+
- spec/rails_root/db/seeds/20111203000003_file3.rb
|
58
|
+
- spec/versioned_seeds_spec.rb
|
29
59
|
- versioned_seeds.gemspec
|
30
60
|
homepage: http://github.com/simonc/versioned_seeds
|
31
61
|
licenses: []
|
@@ -52,4 +82,9 @@ signing_key:
|
|
52
82
|
specification_version: 3
|
53
83
|
summary: Versioned Seeds provides a very simple way to manage your seed scripts by
|
54
84
|
versioning them. It provides rake tasks to load them.
|
55
|
-
test_files:
|
85
|
+
test_files:
|
86
|
+
- spec/rails_root/.versioned_seeds
|
87
|
+
- spec/rails_root/db/seeds/20111203000001_file1.rb
|
88
|
+
- spec/rails_root/db/seeds/20111203000002_file2.rb
|
89
|
+
- spec/rails_root/db/seeds/20111203000003_file3.rb
|
90
|
+
- spec/versioned_seeds_spec.rb
|