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 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