active-dump 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
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.1
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 2 rake tasks that allow you to dump and restore
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`: the default file and models
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/docs?
96
+ * specs! docs?
89
97
  * use model's database connection?!
90
98
  * ...
91
99
 
@@ -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
- m = ENV['MODELS']
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
- c = ActiveDump.config ENV['FILE']
37
- ActiveDump.restore c
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
@@ -1,4 +1,4 @@
1
1
  module ActiveDump
2
- VERSION = '0.0.1'
2
+ VERSION = '0.0.2'
3
3
  DATE = '2013-11-13'
4
4
  end
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(c) # {{{1
26
- data = Hash[ c['models'].map do |m|
27
- model = m.constantize
28
- records = model.all.map(&:attributes)
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 c['file'], YAML.dump(data)
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(c) # {{{1
36
- data = YAML.load File.read(c['file'])
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
- model = m.constantize
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
- insert conn, table, cols, vals
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.insert(conn, table, cols, vals)
55
- sql = "INSERT INTO #{table} (#{cols*','}) VALUES (#{vals*','})"
56
- conn.execute sql
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: file + models
72
- def self.config(file, models = nil) # {{{1
73
- nb = ->(x) { x && !x.blank? }
74
- ne = ->(x) { x && !x.empty? }
75
- c = File.exists?(CFG_DUMP) ? YAML.load(File.read(CFG_DUMP)) : {}
76
- c['file'] = file if nb[file]
77
- c['models'] = models if ne[models]
78
- c['file'] = DUMP unless nb[c['file']]
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.1
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: &11520100 !ruby/object:Gem::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: *11520100
24
+ version_requirements: *12593080
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: rake
27
- requirement: &11519340 !ruby/object:Gem::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: *11519340
35
+ version_requirements: *12592200
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: rspec
38
- requirement: &11517020 !ruby/object:Gem::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: *11517020
46
+ version_requirements: *12589880
47
47
  description: ! 'dump and restore activerecord from/to yaml
48
48
 
49
49