active-dump 0.0.1 → 0.0.2
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/README.md +12 -4
- data/lib/active-dump/rake.rb +20 -8
- data/lib/active-dump/version.rb +1 -1
- data/lib/active-dump.rb +47 -24
- metadata +7 -7
data/README.md
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
Date : 2013-11-13
|
6
6
|
|
7
7
|
Copyright : Copyright (C) 2013 Felix C. Stegerman
|
8
|
-
Version : v0.0.
|
8
|
+
Version : v0.0.2
|
9
9
|
|
10
10
|
[]: }}}1
|
11
11
|
|
@@ -16,11 +16,12 @@
|
|
16
16
|
|
17
17
|
active-dump - dump and restore activerecord from/to yaml
|
18
18
|
|
19
|
-
active-dump provides
|
19
|
+
active-dump provides 3 rake tasks that allow you to dump and restore
|
20
20
|
activerecord data from/to yaml:
|
21
21
|
|
22
22
|
* `rake db:data:dump` creates a yaml dump
|
23
23
|
* `rake db:data:restore` restores a yaml dump
|
24
|
+
* `rake db:data:delete` deletes all records in database
|
24
25
|
|
25
26
|
#
|
26
27
|
|
@@ -42,12 +43,16 @@ gem 'active-dump', require: 'active-dump/rails'
|
|
42
43
|
* `FILE`: the file to dump to/restore from (defaults to
|
43
44
|
`db/data.yml`)
|
44
45
|
* `MODELS`: the models to dump (defaults to all models)
|
46
|
+
* `DELETE`: delete records with same id before restore (defaults to
|
47
|
+
false)
|
48
|
+
* `VERBOSE`: print info/sql (defaults to false)
|
49
|
+
* `DRYRUN`: don't do anything (defaults to false, implies `VERBOSE`)
|
45
50
|
|
46
51
|
#
|
47
52
|
|
48
53
|
Configuration files:
|
49
54
|
|
50
|
-
* `config/active-dump.yml`:
|
55
|
+
* `config/active-dump.yml`: set defaults
|
51
56
|
* `config/database.yml`: database connection
|
52
57
|
|
53
58
|
[]: }}}2
|
@@ -59,11 +64,14 @@ gem 'active-dump', require: 'active-dump/rails'
|
|
59
64
|
|
60
65
|
$ rake db:data:dump MODELS=Foo,Bar
|
61
66
|
$ RAILS_ENV=production rake db:data:load
|
67
|
+
$ rake db:data:restore DELETE=yes
|
68
|
+
$ rake db:data:delete # CAREFUL!
|
62
69
|
|
63
70
|
`config/active-dump.yml`:
|
64
71
|
|
65
72
|
```yaml
|
66
73
|
file: db/dump.yml
|
74
|
+
verbose: true
|
67
75
|
models:
|
68
76
|
- Cms::Block
|
69
77
|
- Cms::Categorization
|
@@ -85,7 +93,7 @@ models:
|
|
85
93
|
|
86
94
|
## TODO
|
87
95
|
|
88
|
-
* specs
|
96
|
+
* specs! docs?
|
89
97
|
* use model's database connection?!
|
90
98
|
* ...
|
91
99
|
|
data/lib/active-dump/rake.rb
CHANGED
@@ -21,25 +21,37 @@ module ActiveDump
|
|
21
21
|
extend ::Rake::DSL
|
22
22
|
|
23
23
|
# define rake tasks
|
24
|
-
def self.define_tasks
|
24
|
+
def self.define_tasks # {{{1
|
25
25
|
namespace :db do
|
26
26
|
namespace :data do
|
27
27
|
desc 'Dump data'
|
28
28
|
task :dump => :environment do
|
29
|
-
|
30
|
-
c = ActiveDump.config ENV['FILE'], (m && m.split(','))
|
31
|
-
ActiveDump.dump c
|
29
|
+
ActiveDump.dump cfg_from_env
|
32
30
|
end
|
33
31
|
|
34
32
|
desc 'Restore data'
|
35
33
|
task :restore => :environment do
|
36
|
-
|
37
|
-
|
34
|
+
ActiveDump.restore cfg_from_env
|
35
|
+
end
|
36
|
+
|
37
|
+
desc 'Delete data'
|
38
|
+
task :delete => :environment do
|
39
|
+
ActiveDump.delete cfg_from_env
|
38
40
|
end
|
39
41
|
end
|
40
42
|
end
|
41
|
-
end
|
42
|
-
|
43
|
+
end # }}}1
|
44
|
+
|
45
|
+
# get config from ENV
|
46
|
+
def self.cfg_from_env # {{{1
|
47
|
+
f = ENV['FILE'] ; f2 = f && f.blank? ? nil : f
|
48
|
+
m = ENV['MODELS'] ; ms = m && m.split(',')
|
49
|
+
d = (ENV['DELETE'] ||'') =~ /yes|true/i
|
50
|
+
v = (ENV['VERBOSE']||'') =~ /yes|true/i
|
51
|
+
n = (ENV['DRYRUN'] ||'') =~ /yes|true/i
|
52
|
+
ActiveDump.config file: f2, models: ms, delete: d, verbose: v,
|
53
|
+
dryrun: n
|
54
|
+
end # }}}1
|
43
55
|
end
|
44
56
|
|
45
57
|
end
|
data/lib/active-dump/version.rb
CHANGED
data/lib/active-dump.rb
CHANGED
@@ -22,38 +22,63 @@ module ActiveDump
|
|
22
22
|
# --
|
23
23
|
|
24
24
|
# dump to yaml
|
25
|
-
def self.dump(
|
26
|
-
data = Hash[
|
27
|
-
|
28
|
-
|
25
|
+
def self.dump(cfg) # {{{1
|
26
|
+
data = Hash[ cfg[:models].map do |m|
|
27
|
+
records = m.constantize.all.map(&:attributes)
|
28
|
+
printf "dumping model %-30s: %10d record(s)\n",
|
29
|
+
m, records.length if cfg[:verbose] or cfg[:dryrun]
|
29
30
|
[m, records]
|
30
31
|
end ]
|
31
|
-
File.write
|
32
|
+
File.write cfg[:file], YAML.dump(data) unless cfg[:dryrun]
|
32
33
|
end # }}}1
|
33
34
|
|
34
|
-
# restore from yaml
|
35
|
-
def self.restore(
|
36
|
-
data = YAML.load File.read(
|
35
|
+
# restore from yaml; optionally delete existing records first
|
36
|
+
def self.restore(cfg) # {{{1
|
37
|
+
data = YAML.load File.read(cfg[:file])
|
37
38
|
conn = connection
|
38
39
|
ActiveRecord::Base.transaction do
|
39
40
|
data.each do |m,records|
|
40
|
-
|
41
|
-
table = model.quoted_table_name
|
41
|
+
table = m.constantize.quoted_table_name
|
42
42
|
records.each do |record|
|
43
43
|
cols = record.keys.map { |k| conn.quote_column_name k }
|
44
44
|
vals = record.values.map { |v| conn.quote v }
|
45
|
-
|
45
|
+
delete_record conn, cfg, table, conn.quote(record['id']) \
|
46
|
+
if cfg[:delete]
|
47
|
+
insert_record conn, cfg, table, cols, vals
|
46
48
|
end
|
47
49
|
end
|
48
50
|
end
|
49
51
|
end # }}}1
|
50
52
|
|
53
|
+
# delete all records
|
54
|
+
def self.delete(cfg) # {{{1
|
55
|
+
conn = connection
|
56
|
+
ActiveRecord::Base.transaction do
|
57
|
+
cfg[:models].each do |m|
|
58
|
+
sql = "DELETE FROM #{m.constantize.quoted_table_name};"
|
59
|
+
execute conn, cfg, sql
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end # }}}1
|
63
|
+
|
51
64
|
# --
|
52
65
|
|
66
|
+
# execute sql (optionally verbose)
|
67
|
+
def self.execute(conn, cfg, sql)
|
68
|
+
puts sql if cfg[:verbose] or cfg[:dryrun]
|
69
|
+
conn.execute sql unless cfg[:dryrun]
|
70
|
+
end
|
71
|
+
|
72
|
+
# delete record w/ id; make sure everything is quoted !!!
|
73
|
+
def self.delete_record(conn, cfg, table, id)
|
74
|
+
sql = "DELETE FROM #{table} WHERE id = #{id};"
|
75
|
+
execute conn, cfg, sql
|
76
|
+
end
|
77
|
+
|
53
78
|
# insert data; make sure everything is quoted !!!
|
54
|
-
def self.
|
55
|
-
sql = "INSERT INTO #{table} (#{cols*','}) VALUES (#{vals*','})"
|
56
|
-
|
79
|
+
def self.insert_record(conn, cfg, table, cols, vals)
|
80
|
+
sql = "INSERT INTO #{table} (#{cols*','}) VALUES (#{vals*','});"
|
81
|
+
execute conn, cfg, sql
|
57
82
|
end
|
58
83
|
|
59
84
|
# --
|
@@ -68,16 +93,14 @@ module ActiveDump
|
|
68
93
|
end .map(&:to_s)
|
69
94
|
end # }}}1
|
70
95
|
|
71
|
-
# configuration
|
72
|
-
def self.config(
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
c['models'] = all_models unless ne[c['models']]
|
80
|
-
c
|
96
|
+
# configuration
|
97
|
+
def self.config(cfg = {}) # {{{1
|
98
|
+
c1 = File.exists?(CFG_DUMP) ? YAML.load(File.read(CFG_DUMP)) : {}
|
99
|
+
c2 = Hash[ c1.map { |k,v| [k.to_sym, v] } ]
|
100
|
+
c3 = c2.merge cfg.reject { |k,v| v.nil? }
|
101
|
+
c4 = { file: DUMP } .merge c3.reject { |k,v| v.nil? }
|
102
|
+
c4[:models] && !c4[:models].empty? ? c4
|
103
|
+
: c4.merge(models: all_models)
|
81
104
|
end # }}}1
|
82
105
|
|
83
106
|
# ActiveRecord connection
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: active-dump
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -13,7 +13,7 @@ date: 2013-11-13 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activerecord
|
16
|
-
requirement: &
|
16
|
+
requirement: &12593080 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *12593080
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: rake
|
27
|
-
requirement: &
|
27
|
+
requirement: &12592200 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *12592200
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: rspec
|
38
|
-
requirement: &
|
38
|
+
requirement: &12589880 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,7 +43,7 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *12589880
|
47
47
|
description: ! 'dump and restore activerecord from/to yaml
|
48
48
|
|
49
49
|
|