chrono_model 0.5.0 → 0.5.1
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 +5 -5
- data/lib/chrono_model/adapter.rb +4 -4
- data/lib/chrono_model/railtie.rb +8 -8
- data/lib/chrono_model/schema_format.rake +50 -0
- data/lib/chrono_model/schema_format.rb +78 -0
- data/lib/chrono_model/version.rb +1 -1
- metadata +9 -7
data/README.md
CHANGED
@@ -184,11 +184,11 @@ them in your output, use `rake VERBOSE=true`.
|
|
184
184
|
|
185
185
|
* The rules and temporal indexes cannot be saved in schema.rb. The AR
|
186
186
|
schema dumper is quite basic, and it isn't (currently) extensible.
|
187
|
-
As we're using many database-specific features,
|
188
|
-
the
|
189
|
-
`
|
190
|
-
|
191
|
-
`
|
187
|
+
As we're using many database-specific features, Chronomodel forces the
|
188
|
+
usage of the `:sql` schema dumper, and included rake tasks override
|
189
|
+
`db:schema:dump` and `db:schema:load` to do `db:structure:dump` and
|
190
|
+
`db:structure:load`. Two helper tasks are also added, `db:data:dump`
|
191
|
+
and `db:data:load`.
|
192
192
|
|
193
193
|
* `.includes` still doesn't work, but it'll fixed.
|
194
194
|
|
data/lib/chrono_model/adapter.rb
CHANGED
@@ -432,10 +432,10 @@ module ChronoModel
|
|
432
432
|
end
|
433
433
|
|
434
434
|
TableCache = (Class.new(HashWithIndifferentAccess) do
|
435
|
-
def all ; keys;
|
436
|
-
def add! table ; self[table] = true ; end
|
437
|
-
def del! table ; self[table] = nil ; end
|
438
|
-
def fetch table ; self[table] ||= yield ; end
|
435
|
+
def all ; keys; ; end
|
436
|
+
def add! table ; self[table.to_s] = true ; end
|
437
|
+
def del! table ; self[table.to_s] = nil ; end
|
438
|
+
def fetch table ; self[table.to_s] ||= yield ; end
|
439
439
|
end).new
|
440
440
|
|
441
441
|
# Returns true if the given name references a temporal table.
|
data/lib/chrono_model/railtie.rb
CHANGED
@@ -5,15 +5,15 @@ module ChronoModel
|
|
5
5
|
end
|
6
6
|
|
7
7
|
rake_tasks do
|
8
|
+
load 'chrono_model/schema_format.rake'
|
8
9
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
end
|
10
|
+
namespace :db do
|
11
|
+
namespace :chrono do
|
12
|
+
task :create_schemas do
|
13
|
+
ActiveRecord::Base.connection.chrono_create_schemas!
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
17
|
|
18
18
|
task 'db:schema:load' => 'db:chrono:create_schemas'
|
19
19
|
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
load File.expand_path(File.dirname(__FILE__) + '/schema_format.rb')
|
2
|
+
|
3
|
+
namespace :db do
|
4
|
+
namespace :structure do
|
5
|
+
desc "desc 'Dump the database structure to db/structure.sql. Specify another file with DB_STRUCTURE=db/my_structure.sql"
|
6
|
+
task :dump => :environment do
|
7
|
+
config = PG.config!
|
8
|
+
target = ENV['DB_STRUCTURE'] || Rails.root.join('db', 'structure.sql')
|
9
|
+
schema = config[:schema_search_path] || 'public'
|
10
|
+
|
11
|
+
PG.make_dump target, *config.values_at(:username, :database),
|
12
|
+
'-s', '-O', '-n', schema,
|
13
|
+
'-n', ChronoModel::Adapter::TEMPORAL_SCHEMA,
|
14
|
+
'-n', ChronoModel::Adapter::HISTORY_SCHEMA
|
15
|
+
|
16
|
+
# Add migration information, after resetting the schema to the default one
|
17
|
+
File.open(target, 'a') do |f|
|
18
|
+
f.puts "SET search_path = #{schema}, pg_catalog;"
|
19
|
+
f.puts ActiveRecord::Base.connection.dump_schema_information
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
|
24
|
+
desc "Load structure.sql file into the current environment's database"
|
25
|
+
task :load => :environment do
|
26
|
+
# Loads the db/structure.sql file into current environment's database.
|
27
|
+
#
|
28
|
+
source = ENV['DB_STRUCTURE'] || Rails.root.join('db', 'structure.sql')
|
29
|
+
|
30
|
+
PG.load_dump source, *PG.config!.values_at(:username, :database, :template)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
namespace :data do
|
35
|
+
desc "Save a dump of the database in ENV['DUMP'] or db/data.NOW.sql"
|
36
|
+
task :dump => :environment do
|
37
|
+
target = ENV['DUMP'] || Rails.root.join('db', "data.#{Time.now.to_f}.sql")
|
38
|
+
|
39
|
+
PG.make_dump target, *PG.config!.values_at(:username, :database), '-c'
|
40
|
+
end
|
41
|
+
|
42
|
+
desc "Load a dump of the database from ENV['DUMP']"
|
43
|
+
task :load => :environment do
|
44
|
+
source = ENV['DUMP'].presence or
|
45
|
+
raise ArgumentError, "Invoke as rake db:data:load DUMP=/path/to/data.sql"
|
46
|
+
|
47
|
+
PG.load_dump source, *PG.config!.values_at(:username, :database)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
# h/t http://stackoverflow.com/questions/4698467
|
2
|
+
#
|
3
|
+
Rails.application.config.active_record.schema_format = :sql
|
4
|
+
|
5
|
+
# Clear Rails' ones
|
6
|
+
%w( db:structure:dump db:structure:load ).each {|t| Rake::Task[t].clear }
|
7
|
+
|
8
|
+
# Make schema:dump and schema:load invoke structure:dump and structure:load
|
9
|
+
Rake::Task['db:schema:dump'].clear.enhance(['environment']) do
|
10
|
+
Rake::Task['db:structure:dump'].invoke
|
11
|
+
end
|
12
|
+
|
13
|
+
Rake::Task['db:schema:load'].clear.enhance(['environment']) do
|
14
|
+
Rake::Task['db:structure:load'].invoke
|
15
|
+
end
|
16
|
+
|
17
|
+
# PG utilities
|
18
|
+
#
|
19
|
+
module PG
|
20
|
+
extend self
|
21
|
+
|
22
|
+
def config!
|
23
|
+
ActiveRecord::Base.connection_pool.spec.config.tap do |config|
|
24
|
+
ENV['PGHOST'] = config[:host].to_s if config.key?(:host)
|
25
|
+
ENV['PGPORT'] = config[:port].to_s if config.key?(:port)
|
26
|
+
ENV['PGPASSWORD'] = config[:password].to_s if config.key?(:password)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def make_dump(target, username, database, *options)
|
31
|
+
exec 'pg_dump', '-f', target, '-U', username, database, *options
|
32
|
+
end
|
33
|
+
|
34
|
+
def load_dump(source, username, database, *options)
|
35
|
+
exec 'psql', '-U', username, '-f', source, database, *options
|
36
|
+
end
|
37
|
+
|
38
|
+
def exec(*argv)
|
39
|
+
argv = argv.compact.map(&:to_s)
|
40
|
+
|
41
|
+
print "> \033[1m#{argv.join(' ')}\033[0m... "
|
42
|
+
logger.info "PG: exec #{argv.join(' ')}"
|
43
|
+
|
44
|
+
stdout, stdout_w = IO.pipe
|
45
|
+
stderr, stderr_w = IO.pipe
|
46
|
+
pid = fork {
|
47
|
+
stdout.close; STDOUT.reopen(stdout_w)
|
48
|
+
stderr.close; STDERR.reopen(stderr_w)
|
49
|
+
|
50
|
+
Kernel.exec *argv
|
51
|
+
}
|
52
|
+
stdout_w.close; stderr_w.close
|
53
|
+
pid, status = Process.wait2
|
54
|
+
|
55
|
+
puts "exit #{status.exitstatus}"
|
56
|
+
logger.info "PG: exit #{status.exitstatus}"
|
57
|
+
|
58
|
+
out, err = stdout.read.chomp, stderr.read.chomp
|
59
|
+
stdout.close; stderr.close
|
60
|
+
|
61
|
+
if out.present?
|
62
|
+
logger.info "PG: -----8<----- stdout ----->8-----"
|
63
|
+
logger.info out
|
64
|
+
logger.info "PG: ----8<---- end stdout ---->8----"
|
65
|
+
end
|
66
|
+
|
67
|
+
if err.present?
|
68
|
+
logger.info "PG: -----8<----- stderr ----->8-----"
|
69
|
+
logger.info err
|
70
|
+
logger.info "PG: ----8<---- end stderr ---->8----"
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def logger
|
75
|
+
ActiveRecord::Base.logger
|
76
|
+
end
|
77
|
+
|
78
|
+
end
|
data/lib/chrono_model/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: chrono_model
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-05-30 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activerecord
|
16
|
-
requirement: &
|
16
|
+
requirement: &70273330 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '3.2'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70273330
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: pg
|
27
|
-
requirement: &
|
27
|
+
requirement: &70273120 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,7 +32,7 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70273120
|
36
36
|
description: Give your models as-of date temporal extensions. Built entirely for PostgreSQL
|
37
37
|
>= 9.0
|
38
38
|
email:
|
@@ -55,6 +55,8 @@ files:
|
|
55
55
|
- lib/chrono_model/compatibility.rb
|
56
56
|
- lib/chrono_model/patches.rb
|
57
57
|
- lib/chrono_model/railtie.rb
|
58
|
+
- lib/chrono_model/schema_format.rake
|
59
|
+
- lib/chrono_model/schema_format.rb
|
58
60
|
- lib/chrono_model/time_gate.rb
|
59
61
|
- lib/chrono_model/time_machine.rb
|
60
62
|
- lib/chrono_model/utils.rb
|
@@ -90,7 +92,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
90
92
|
version: '0'
|
91
93
|
requirements: []
|
92
94
|
rubyforge_project:
|
93
|
-
rubygems_version: 1.8.
|
95
|
+
rubygems_version: 1.8.11
|
94
96
|
signing_key:
|
95
97
|
specification_version: 3
|
96
98
|
summary: Temporal extensions (SCD Type II) for Active Record
|