versioned_seeds 0.0.1 → 0.1.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/.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
|