ydd 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/.rvmrc ADDED
@@ -0,0 +1,6 @@
1
+
2
+ if [[ -d "$rvm_path/environments" && -s "$rvm_path/environments/ree-1.8.7-2010.02@ydd" ]] ; then
3
+ \. "$rvm_path/environments/ree-1.8.7-2010.02@ydd"
4
+ else
5
+ rvm --create use "ree-1.8.7-2010.02@ydd"
6
+ fi
@@ -0,0 +1,44 @@
1
+ # ydd - Yaml DB Dumber
2
+
3
+ A fork of the awesome [yaml_db](http://github.com/ludicast/yaml_db).
4
+
5
+ ## Installation
6
+
7
+ This plugin can now be installed as a gem via
8
+
9
+ gem install ydd
10
+
11
+ Note that when doing this, the rake tasks won't automatically be available to your app. You'll have to explicitly include them via the approaches followed: [here](http://ggr.com/how-to-include-a-gems-rake-tasks-in-your-rails-app.html), [here](https://rails.lighthouseapp.com/projects/8994/tickets/510-rake-tasks-not-included-for-gems), [and here](https://rails.lighthouseapp.com/projects/8994/tickets/59)
12
+
13
+ ## Usage
14
+
15
+ rake db:data:dump -> Dump contents of Rails database to db/data.yml
16
+ rake db:data:load -> Load contents of db/data.yml into the database
17
+
18
+ Further, there are tasks db:dump and db:load which do the entire database (the equivalent of running db:schema:dump followed by db:data:load). Also, there are other tasks recently added that allow the export of the database contents to/from multiple files (each one named after the table being dumped or loaded).
19
+
20
+ rake db:data:dump_dir -> Dump contents of database to curr_dir_name/tablename.extension (defaults to yaml)
21
+ rake db:data:load_dir -> Load contents of db/data_dir into database
22
+
23
+ In addition, we have plugins whereby you can export your database to/from various formats. We only deal with yaml and csv right now, but you can easily write tools for your own formats (such as Excel or XML). To use another format, just load setting the "class" parameter to the class you are using. This defaults to "YamlDb::Helper" which is a refactoring of the old yaml_db code. We'll shorten this to use class nicknames in a little bit.
24
+
25
+ ## Examples
26
+
27
+ One common use would be to switch your data from one database backend to another. For example, let's say you wanted to switch from SQLite to MySQL. You might execute the following steps:
28
+
29
+ 1. rake db:dump
30
+
31
+ 2. Edit config/database.yml and change your adapter to mysql, set up database params
32
+
33
+ 3. mysqladmin create [database name]
34
+
35
+ 4. rake db:load
36
+
37
+ ## Credits
38
+
39
+ Created by Orion Henry and Adam Wiggins. Major updates by Ricardo Chimal, Jr.
40
+
41
+ Patches contributed by Michael Irwin, Tom Locke, and Tim Galeckas.
42
+
43
+ Send questions, feedback, or patches to the Heroku mailing list: http://groups.google.com/group/heroku
44
+
@@ -0,0 +1,23 @@
1
+ require 'rake'
2
+
3
+ begin
4
+ require 'jeweler'
5
+ Jeweler::Tasks.new do |gem|
6
+ gem.name = "ydd"
7
+ gem.summary = %Q{ydd dumps / loads rails app databases for backup purposes.}
8
+ gem.description = %Q{
9
+ YDD is a tool (a fork of yaml_db really) to make it generally easy
10
+ to use it for things like copying databases from production to staging
11
+ and the like.
12
+ }
13
+ gem.email = "sutto@sutto.net"
14
+ gem.homepage = "http://github.com/YouthTree/ydd"
15
+ gem.authors = ["Adam Wiggins","Orion Henry", "Darcy Laycock"]
16
+ gem.add_dependency 'thor', '~> 0.14'
17
+ gem.add_dependency 'activesupport', '~> 3.0.0'
18
+ gem.add_dependency 'activerecord', '~> 3.0.0'
19
+ end
20
+ Jeweler::GemcutterTasks.new
21
+ rescue LoadError
22
+ puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
23
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.0.1
data/bin/ydd ADDED
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $LOAD_PATH.unshift File.expand_path("../lib", File.dirname(__FILE__))
4
+ require 'ydd'
5
+ YDD::Application.start
@@ -0,0 +1,68 @@
1
+ require 'yaml'
2
+ require 'active_support'
3
+ require 'active_record'
4
+ require 'fileutils'
5
+
6
+ module YDD
7
+ class Error < StandardError; end
8
+
9
+ autoload :SchemaManager, 'ydd/schema_manager'
10
+ autoload :DataManager, 'ydd/data_manager'
11
+ autoload :YamlDB, 'ydd/yaml_db'
12
+ autoload :SerializationHelper, 'ydd/serialization_helper'
13
+ autoload :Application, 'ydd/application'
14
+
15
+ def self.env=(value)
16
+ if value.blank?
17
+ @@env = nil
18
+ else
19
+ @@env = value
20
+ end
21
+ end
22
+
23
+ def self.env
24
+ @@env ||= (ENV['YDD_ENV'] || ENV['RAILS_ENV'] || ENV['RACK_ENV'] || 'development')
25
+ end
26
+
27
+ def self.connection
28
+ ActiveRecord::Base.connection
29
+ end
30
+
31
+ def self.configuration_from(file)
32
+ require 'erb'
33
+ parsed = ERB.new(File.read(file)).result
34
+ YAML.load(parsed)[env]
35
+ end
36
+
37
+ def self.connect_from(path)
38
+ raise Error, "Invalid database config at #{path}" if !File.exists?(path)
39
+ connect configuration_from(path)
40
+ end
41
+
42
+ def self.connect(specification)
43
+ ActiveRecord::Base.establish_connection(specification)
44
+ end
45
+
46
+ def self.dump(directory)
47
+ FileUtils.mkdir_p directory
48
+ SchemaManager.dump File.join(directory, "schema.rb")
49
+ DataManager.dump File.join(directory, "data.yml")
50
+ end
51
+
52
+ def self.load(directory)
53
+ if !File.directory?(directory)
54
+ raise Error, "Please provide a valid directory - #{directory} doesn't exist."
55
+ end
56
+ check_files! directory, "schema.rb", "data.yml"
57
+ SchemaManager.load File.join(directory, "schema.rb")
58
+ DataManager.load File.join(directory, "data.yml")
59
+ end
60
+
61
+ def self.check_files!(dir, *files)
62
+ files.each do |file|
63
+ path = File.join(dir, file)
64
+ raise Error, "#{file} doesn't exist in #{dir}" if !File.readable?(path)
65
+ end
66
+ end
67
+
68
+ end
@@ -0,0 +1,61 @@
1
+ require 'thor'
2
+
3
+ module YDD
4
+ class Application < Thor
5
+ include Thor::Actions
6
+
7
+ method_options :env => :string, :force => :boolean
8
+
9
+ desc "dump DUMP_DIR [APP_DIR='.'] [OPTIONS]", "Dumps the database contents and schema."
10
+ def dump(dump_dir, app_dir = ".")
11
+ setup! dump_dir, app_dir, :dump => true
12
+ say "Starting dump..."
13
+ YDD.dump @dump_dir
14
+ end
15
+
16
+ desc "load DUMP_DIR [APP_DIR='.'] [OPTIONS]", "Loads the database contents and schema."
17
+ def load(dump_dir, app_dir = ".")
18
+ setup! dump_dir, app_dir
19
+ say "Starting load..."
20
+ YDD.load @dump_dir
21
+ end
22
+
23
+ protected
24
+
25
+ def setup_directories!(dump_dir, app_dir, extra = {})
26
+ @dump_dir = File.expand_path(dump_dir)
27
+ @app_dir = File.expand_path(app_dir)
28
+ @db_config = File.join(@app_dir, "config", "database.yml")
29
+ if !File.directory?(@app_dir)
30
+ die "The given application directory, #{@application}, does not exist."
31
+ elsif !File.exist?(@db_config)
32
+ die "#{@db_config} does not exist."
33
+ elsif YDD.configuration_from(@db_config).blank?
34
+ die "Unable to find database configuration for #{YDD.env}."
35
+ elsif extra[:dump] && !Dir[File.join(@dump_dir, "**", "*")].empty? && !options.force?
36
+ die "The given dump dir, #{@dump_dir}, is not empty."
37
+ end
38
+ end
39
+
40
+ def setup!(dump_dir, app_dir, extra = {})
41
+ validate_environment!
42
+ setup_directories! dump_dir, app_dir, extra
43
+ connect_to_database!
44
+ end
45
+
46
+ def connect_to_database!
47
+ YDD.connect_from @db_config
48
+ end
49
+
50
+ def validate_environment!
51
+ YDD.env = options.env if options.env.present?
52
+ end
53
+
54
+ def die(error, code = 1)
55
+ say error
56
+ exit code
57
+ end
58
+
59
+ end
60
+
61
+ end
@@ -0,0 +1,15 @@
1
+ module YDD
2
+ class DataManager
3
+
4
+ def self.dump(path)
5
+ SerializationHelper::Base.new(YamlDB::Helper).dump path
6
+ end
7
+
8
+ def self.load(path)
9
+ if File.exists?(path)
10
+ SerializationHelper::Base.new(YamlDB::Helper).load path
11
+ end
12
+ end
13
+
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ module YDD
2
+ class SchemaManager
3
+
4
+ def self.dump(path)
5
+ File.open(path, "w") do |file|
6
+ ActiveRecord::SchemaDumper.dump(YDD.connection, file)
7
+ end
8
+ end
9
+
10
+ def self.load(path)
11
+ Kernel.load path if File.exists?(path)
12
+ end
13
+
14
+ end
15
+ end
@@ -0,0 +1,177 @@
1
+ module YDD
2
+ module SerializationHelper
3
+
4
+ class Base
5
+ attr_reader :extension
6
+
7
+ def initialize(helper)
8
+ @dumper = helper.dumper
9
+ @loader = helper.loader
10
+ @extension = helper.extension
11
+ end
12
+
13
+ def dump(filename)
14
+ disable_logger
15
+ @dumper.dump(File.new(filename, "w"))
16
+ reenable_logger
17
+ end
18
+
19
+ def load(filename, truncate = true)
20
+ disable_logger
21
+ @loader.load(File.new(filename, "r"), truncate)
22
+ reenable_logger
23
+ end
24
+
25
+ def disable_logger
26
+ @@old_logger = ActiveRecord::Base.logger
27
+ ActiveRecord::Base.logger = nil
28
+ end
29
+
30
+ def reenable_logger
31
+ ActiveRecord::Base.logger = @@old_logger
32
+ end
33
+ end
34
+
35
+ class Load
36
+ def self.load(io, truncate = true)
37
+ YDD.connection.transaction do
38
+ load_documents(io, truncate)
39
+ end
40
+ end
41
+
42
+ def self.truncate_table(table)
43
+ begin
44
+ YDD.connection.execute("TRUNCATE #{SerializationHelper::Utils.quote_table(table)}")
45
+ rescue Exception
46
+ YDD.connection.execute("DELETE FROM #{SerializationHelper::Utils.quote_table(table)}")
47
+ end
48
+ end
49
+
50
+ def self.load_table(table, data, truncate = true)
51
+ column_names = data['columns']
52
+ if truncate
53
+ truncate_table(table)
54
+ end
55
+ load_records(table, column_names, data['records'])
56
+ reset_pk_sequence!(table)
57
+ end
58
+
59
+ def self.load_records(table, column_names, records)
60
+ if column_names.nil?
61
+ return
62
+ end
63
+ columns = column_names.map{|cn| YDD.connection.columns(table).detect{|c| c.name == cn}}
64
+ quoted_column_names = column_names.map { |column| YDD.connection.quote_column_name(column) }.join(',')
65
+ quoted_table_name = SerializationHelper::Utils.quote_table(table)
66
+ records.each do |record|
67
+ quoted_values = record.zip(columns).map{|c| YDD.connection.quote(c.first, c.last)}.join(',')
68
+ YDD.connection.execute("INSERT INTO #{quoted_table_name} (#{quoted_column_names}) VALUES (#{quoted_values})")
69
+ end
70
+ end
71
+
72
+ def self.reset_pk_sequence!(table_name)
73
+ if YDD.connection.respond_to?(:reset_pk_sequence!)
74
+ YDD.connection.reset_pk_sequence!(table_name)
75
+ end
76
+ end
77
+
78
+
79
+ end
80
+
81
+ module Utils
82
+
83
+ def self.unhash(hash, keys)
84
+ keys.map { |key| hash[key] }
85
+ end
86
+
87
+ def self.unhash_records(records, keys)
88
+ records.each_with_index do |record, index|
89
+ records[index] = unhash(record, keys)
90
+ end
91
+
92
+ records
93
+ end
94
+
95
+ def self.convert_booleans(records, columns)
96
+ records.each do |record|
97
+ columns.each do |column|
98
+ next if is_boolean(record[column])
99
+ record[column] = (record[column] == 't' or record[column] == '1')
100
+ end
101
+ end
102
+ records
103
+ end
104
+
105
+ def self.boolean_columns(table)
106
+ columns = YDD.connection.columns(table).reject { |c| silence_warnings { c.type != :boolean } }
107
+ columns.map { |c| c.name }
108
+ end
109
+
110
+ def self.is_boolean(value)
111
+ value.kind_of?(TrueClass) or value.kind_of?(FalseClass)
112
+ end
113
+
114
+ def self.quote_table(table)
115
+ YDD.connection.quote_table_name(table)
116
+ end
117
+
118
+ end
119
+
120
+ class Dump
121
+ def self.before_table(io, table)
122
+
123
+ end
124
+
125
+ def self.dump(io)
126
+ tables.each do |table|
127
+ before_table(io, table)
128
+ dump_table(io, table)
129
+ after_table(io, table)
130
+ end
131
+ end
132
+
133
+ def self.after_table(io, table)
134
+
135
+ end
136
+
137
+ def self.tables
138
+ YDD.connection.tables.reject { |table| ['schema_info', 'schema_migrations'].include?(table) }
139
+ end
140
+
141
+ def self.dump_table(io, table)
142
+ return if table_record_count(table).zero?
143
+
144
+ dump_table_columns(io, table)
145
+ dump_table_records(io, table)
146
+ end
147
+
148
+ def self.table_column_names(table)
149
+ YDD.connection.columns(table).map { |c| c.name }
150
+ end
151
+
152
+
153
+ def self.each_table_page(table, records_per_page=1000)
154
+ total_count = table_record_count(table)
155
+ pages = (total_count.to_f / records_per_page).ceil - 1
156
+ id = table_column_names(table).first
157
+ boolean_columns = SerializationHelper::Utils.boolean_columns(table)
158
+ quoted_table_name = SerializationHelper::Utils.quote_table(table)
159
+
160
+ (0..pages).to_a.each do |page|
161
+ sql = YDD.connection.add_limit_offset!("SELECT * FROM #{quoted_table_name} ORDER BY #{id}",
162
+ :limit => records_per_page, :offset => records_per_page * page
163
+ )
164
+ records = YDD.connection.select_all(sql)
165
+ records = SerializationHelper::Utils.convert_booleans(records, boolean_columns)
166
+ yield records
167
+ end
168
+ end
169
+
170
+ def self.table_record_count(table)
171
+ YDD.connection.select_one("SELECT COUNT(*) FROM #{SerializationHelper::Utils.quote_table(table)}").values.first.to_i
172
+ end
173
+
174
+ end
175
+
176
+ end
177
+ end
@@ -0,0 +1,64 @@
1
+ module YDD
2
+ module YamlDB
3
+ module Helper
4
+ def self.loader
5
+ YamlDB::Load
6
+ end
7
+
8
+ def self.dumper
9
+ YamlDB::Dump
10
+ end
11
+
12
+ def self.extension
13
+ "yml"
14
+ end
15
+ end
16
+
17
+
18
+ module Utils
19
+ def self.chunk_records(records)
20
+ yaml = [ records ].to_yaml
21
+ yaml.sub!("--- \n", "")
22
+ yaml.sub!('- - -', ' - -')
23
+ yaml
24
+ end
25
+
26
+ end
27
+
28
+ class Dump < SerializationHelper::Dump
29
+
30
+ def self.dump_table_columns(io, table)
31
+ io.write("\n")
32
+ io.write({ table => { 'columns' => table_column_names(table) } }.to_yaml)
33
+ end
34
+
35
+ def self.dump_table_records(io, table)
36
+ table_record_header(io)
37
+
38
+ column_names = table_column_names(table)
39
+
40
+ each_table_page(table) do |records|
41
+ rows = SerializationHelper::Utils.unhash_records(records, column_names)
42
+ io.write(YamlDB::Utils.chunk_records(records))
43
+ end
44
+ end
45
+
46
+ def self.table_record_header(io)
47
+ io.write(" records: \n")
48
+ end
49
+
50
+ end
51
+
52
+ class Load < SerializationHelper::Load
53
+ def self.load_documents(io, truncate = true)
54
+ YAML.load_documents(io) do |ydoc|
55
+ ydoc.keys.each do |table_name|
56
+ next if ydoc[table_name].nil?
57
+ load_table(table_name, ydoc[table_name], truncate)
58
+ end
59
+ end
60
+ end
61
+ end
62
+
63
+ end
64
+ end
@@ -0,0 +1,45 @@
1
+ namespace :db do
2
+ desc "Dump schema and data to db/schema.rb and db/data.yml"
3
+ task(:dump => [ "db:schema:dump", "db:data:dump" ])
4
+
5
+ desc "Load schema and data from db/schema.rb and db/data.yml"
6
+ task(:load => [ "db:schema:load", "db:data:load" ])
7
+
8
+ namespace :data do
9
+ def db_dump_data_file (extension = "yml")
10
+ "#{dump_dir}/data.#{extension}"
11
+ end
12
+
13
+ def dump_dir(dir = "")
14
+ "#{RAILS_ROOT}/db#{dir}"
15
+ end
16
+
17
+ desc "Dump contents of database to db/data.extension (defaults to yaml)"
18
+ task :dump => :environment do
19
+ format_class = ENV['class'] || "YamlDb::Helper"
20
+ helper = format_class.constantize
21
+ SerializationHelper::Base.new(helper).dump db_dump_data_file helper.extension
22
+ end
23
+
24
+ desc "Dump contents of database to curr_dir_name/tablename.extension (defaults to yaml)"
25
+ task :dump_dir => :environment do
26
+ format_class = ENV['class'] || "YamlDb::Helper"
27
+ dir = ENV['dir'] || "#{Time.now.to_s.gsub(/ /, '_')}"
28
+ SerializationHelper::Base.new(format_class.constantize).dump_to_dir dump_dir("/#{dir}")
29
+ end
30
+
31
+ desc "Load contents of db/data.extension (defaults to yaml) into database"
32
+ task :load => :environment do
33
+ format_class = ENV['class'] || "YamlDb::Helper"
34
+ helper = format_class.constantize
35
+ SerializationHelper::Base.new(helper).load (db_dump_data_file helper.extension)
36
+ end
37
+
38
+ desc "Load contents of db/data_dir into database"
39
+ task :load_dir => :environment do
40
+ dir = ENV['dir'] || "base"
41
+ format_class = ENV['class'] || "YamlDb::Helper"
42
+ SerializationHelper::Base.new(format_class.constantize).load_from_dir dump_dir("/#{dir}")
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,64 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{ydd}
8
+ s.version = "0.0.1"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Adam Wiggins", "Orion Henry", "Darcy Laycock"]
12
+ s.date = %q{2010-09-18}
13
+ s.default_executable = %q{ydd}
14
+ s.description = %q{
15
+ YDD is a tool (a fork of yaml_db really) to make it generally easy
16
+ to use it for things like copying databases from production to staging
17
+ and the like.
18
+ }
19
+ s.email = %q{sutto@sutto.net}
20
+ s.executables = ["ydd"]
21
+ s.extra_rdoc_files = [
22
+ "README.markdown"
23
+ ]
24
+ s.files = [
25
+ ".rvmrc",
26
+ "README.markdown",
27
+ "Rakefile",
28
+ "VERSION",
29
+ "bin/ydd",
30
+ "lib/ydd.rb",
31
+ "lib/ydd/application.rb",
32
+ "lib/ydd/data_manager.rb",
33
+ "lib/ydd/schema_manager.rb",
34
+ "lib/ydd/serialization_helper.rb",
35
+ "lib/ydd/yaml_db.rb",
36
+ "tasks/yaml_db_tasks.rake",
37
+ "ydd.gemspec"
38
+ ]
39
+ s.homepage = %q{http://github.com/YouthTree/ydd}
40
+ s.rdoc_options = ["--charset=UTF-8"]
41
+ s.require_paths = ["lib"]
42
+ s.rubygems_version = %q{1.3.7}
43
+ s.summary = %q{ydd dumps / loads rails app databases for backup purposes.}
44
+
45
+ if s.respond_to? :specification_version then
46
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
47
+ s.specification_version = 3
48
+
49
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
50
+ s.add_runtime_dependency(%q<thor>, ["~> 0.14"])
51
+ s.add_runtime_dependency(%q<activesupport>, ["~> 3.0.0"])
52
+ s.add_runtime_dependency(%q<activerecord>, ["~> 3.0.0"])
53
+ else
54
+ s.add_dependency(%q<thor>, ["~> 0.14"])
55
+ s.add_dependency(%q<activesupport>, ["~> 3.0.0"])
56
+ s.add_dependency(%q<activerecord>, ["~> 3.0.0"])
57
+ end
58
+ else
59
+ s.add_dependency(%q<thor>, ["~> 0.14"])
60
+ s.add_dependency(%q<activesupport>, ["~> 3.0.0"])
61
+ s.add_dependency(%q<activerecord>, ["~> 3.0.0"])
62
+ end
63
+ end
64
+
metadata ADDED
@@ -0,0 +1,132 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ydd
3
+ version: !ruby/object:Gem::Version
4
+ hash: 29
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 1
10
+ version: 0.0.1
11
+ platform: ruby
12
+ authors:
13
+ - Adam Wiggins
14
+ - Orion Henry
15
+ - Darcy Laycock
16
+ autorequire:
17
+ bindir: bin
18
+ cert_chain: []
19
+
20
+ date: 2010-09-18 00:00:00 +08:00
21
+ default_executable: ydd
22
+ dependencies:
23
+ - !ruby/object:Gem::Dependency
24
+ name: thor
25
+ prerelease: false
26
+ requirement: &id001 !ruby/object:Gem::Requirement
27
+ none: false
28
+ requirements:
29
+ - - ~>
30
+ - !ruby/object:Gem::Version
31
+ hash: 23
32
+ segments:
33
+ - 0
34
+ - 14
35
+ version: "0.14"
36
+ type: :runtime
37
+ version_requirements: *id001
38
+ - !ruby/object:Gem::Dependency
39
+ name: activesupport
40
+ prerelease: false
41
+ requirement: &id002 !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ~>
45
+ - !ruby/object:Gem::Version
46
+ hash: 7
47
+ segments:
48
+ - 3
49
+ - 0
50
+ - 0
51
+ version: 3.0.0
52
+ type: :runtime
53
+ version_requirements: *id002
54
+ - !ruby/object:Gem::Dependency
55
+ name: activerecord
56
+ prerelease: false
57
+ requirement: &id003 !ruby/object:Gem::Requirement
58
+ none: false
59
+ requirements:
60
+ - - ~>
61
+ - !ruby/object:Gem::Version
62
+ hash: 7
63
+ segments:
64
+ - 3
65
+ - 0
66
+ - 0
67
+ version: 3.0.0
68
+ type: :runtime
69
+ version_requirements: *id003
70
+ description: |
71
+
72
+ YDD is a tool (a fork of yaml_db really) to make it generally easy
73
+ to use it for things like copying databases from production to staging
74
+ and the like.
75
+
76
+ email: sutto@sutto.net
77
+ executables:
78
+ - ydd
79
+ extensions: []
80
+
81
+ extra_rdoc_files:
82
+ - README.markdown
83
+ files:
84
+ - .rvmrc
85
+ - README.markdown
86
+ - Rakefile
87
+ - VERSION
88
+ - bin/ydd
89
+ - lib/ydd.rb
90
+ - lib/ydd/application.rb
91
+ - lib/ydd/data_manager.rb
92
+ - lib/ydd/schema_manager.rb
93
+ - lib/ydd/serialization_helper.rb
94
+ - lib/ydd/yaml_db.rb
95
+ - tasks/yaml_db_tasks.rake
96
+ - ydd.gemspec
97
+ has_rdoc: true
98
+ homepage: http://github.com/YouthTree/ydd
99
+ licenses: []
100
+
101
+ post_install_message:
102
+ rdoc_options:
103
+ - --charset=UTF-8
104
+ require_paths:
105
+ - lib
106
+ required_ruby_version: !ruby/object:Gem::Requirement
107
+ none: false
108
+ requirements:
109
+ - - ">="
110
+ - !ruby/object:Gem::Version
111
+ hash: 3
112
+ segments:
113
+ - 0
114
+ version: "0"
115
+ required_rubygems_version: !ruby/object:Gem::Requirement
116
+ none: false
117
+ requirements:
118
+ - - ">="
119
+ - !ruby/object:Gem::Version
120
+ hash: 3
121
+ segments:
122
+ - 0
123
+ version: "0"
124
+ requirements: []
125
+
126
+ rubyforge_project:
127
+ rubygems_version: 1.3.7
128
+ signing_key:
129
+ specification_version: 3
130
+ summary: ydd dumps / loads rails app databases for backup purposes.
131
+ test_files: []
132
+