culturecode_stagehand 0.9.2 → 0.10.0
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.
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8e8e470e10c36d55ed09a55577353f992f4dce33
|
4
|
+
data.tar.gz: 8ff3559aa8264aba97054676c4829cd8930bad1d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 72c42cf30acae539d585e1d8c07abcc8a1bb48c2ac6d0d540e324aa92407bcff9f86acfb86d433abf5fadf7e672472c7ff1694c5e764116d63cfbdaab1111514
|
7
|
+
data.tar.gz: c2da536ed22c74a74db0ba20f41e0891898d02f779cfc870e2d5f46d9aaf7f2e3dd34ed08b0e5917a07e2a36571293dac382ee17f9b4e2d9db83efab1fbb0b93
|
@@ -20,6 +20,11 @@ module Stagehand
|
|
20
20
|
!!Rails.configuration.x.stagehand.ghost_mode
|
21
21
|
end
|
22
22
|
|
23
|
+
# Allow unsynchronized writes directly to the production database? A warning will be logged if set to true.
|
24
|
+
def allow_unsynced_production_writes?
|
25
|
+
!!Rails.configuration.x.stagehand.allow_unsynced_production_writes
|
26
|
+
end
|
27
|
+
|
23
28
|
# Returns true if the production and staging connections are the same.
|
24
29
|
# Use case: Front-end devs may not have a second database set up as they are only concerned with the front end
|
25
30
|
def single_connection?
|
@@ -0,0 +1,76 @@
|
|
1
|
+
module Stagehand
|
2
|
+
module Connection
|
3
|
+
def self.with_production_writes(model, &block)
|
4
|
+
state = model.connection.readonly?
|
5
|
+
model.connection.readonly!(false)
|
6
|
+
return block.call
|
7
|
+
ensure
|
8
|
+
model.connection.readonly!(state)
|
9
|
+
end
|
10
|
+
|
11
|
+
module AdapterExtensions
|
12
|
+
def self.prepended(base)
|
13
|
+
base.set_callback :checkout, :after, :update_readonly_state
|
14
|
+
base.set_callback :checkin, :before, :clear_readonly_state
|
15
|
+
end
|
16
|
+
|
17
|
+
def exec_insert(*)
|
18
|
+
handle_readonly_writes!
|
19
|
+
super
|
20
|
+
end
|
21
|
+
|
22
|
+
def exec_update(*)
|
23
|
+
handle_readonly_writes!
|
24
|
+
super
|
25
|
+
end
|
26
|
+
|
27
|
+
def exec_delete(*)
|
28
|
+
handle_readonly_writes!
|
29
|
+
super
|
30
|
+
end
|
31
|
+
|
32
|
+
def allow_writes(&block)
|
33
|
+
state = readonly?
|
34
|
+
readonly!(true)
|
35
|
+
return block.call
|
36
|
+
ensure
|
37
|
+
readonly!(state)
|
38
|
+
end
|
39
|
+
|
40
|
+
def readonly!(state = true)
|
41
|
+
@readonly = state
|
42
|
+
end
|
43
|
+
|
44
|
+
def readonly?
|
45
|
+
!!@readonly
|
46
|
+
end
|
47
|
+
|
48
|
+
private
|
49
|
+
|
50
|
+
def update_readonly_state
|
51
|
+
readonly! unless Configuration.single_connection? || @config[:database] != Database.production_database_name
|
52
|
+
end
|
53
|
+
|
54
|
+
def clear_readonly_state
|
55
|
+
readonly!(false)
|
56
|
+
end
|
57
|
+
|
58
|
+
def handle_readonly_writes!
|
59
|
+
if !readonly?
|
60
|
+
return
|
61
|
+
elsif Configuration.allow_unsynced_production_writes?
|
62
|
+
Rails.logger.warn "Writing directly to production database"
|
63
|
+
else
|
64
|
+
raise(UnsyncedProductionWrite, "Attempted to write directly to production database")
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
|
71
|
+
# EXCEPTIONS
|
72
|
+
|
73
|
+
class UnsyncedProductionWrite < StandardError; end
|
74
|
+
end
|
75
|
+
|
76
|
+
ActiveRecord::Base.connection.class.prepend(Stagehand::Connection::AdapterExtensions)
|
data/lib/stagehand/engine.rb
CHANGED
@@ -12,6 +12,7 @@ module Stagehand
|
|
12
12
|
require "stagehand/cache"
|
13
13
|
require "stagehand/key"
|
14
14
|
require "stagehand/database"
|
15
|
+
require "stagehand/connection_adapter_extensions"
|
15
16
|
require "stagehand/controller_extensions"
|
16
17
|
require "stagehand/active_record_extensions"
|
17
18
|
require "stagehand/staging"
|
data/lib/stagehand/production.rb
CHANGED
@@ -20,17 +20,21 @@ module Stagehand
|
|
20
20
|
|
21
21
|
return unless attributes.present?
|
22
22
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
record
|
28
|
-
|
23
|
+
Connection.with_production_writes(Record) do
|
24
|
+
is_new = matching(staging_record, table_name).update_all(attributes).zero?
|
25
|
+
|
26
|
+
# Ensure we always return a record, even when updating instead of creating
|
27
|
+
Record.new.tap do |record|
|
28
|
+
record.assign_attributes(attributes)
|
29
|
+
record.save if is_new
|
30
|
+
end
|
29
31
|
end
|
30
32
|
end
|
31
33
|
|
32
34
|
def delete(staging_record, table_name = nil)
|
33
|
-
|
35
|
+
Connection.with_production_writes(Record) do
|
36
|
+
matching(staging_record, table_name).delete_all
|
37
|
+
end
|
34
38
|
end
|
35
39
|
|
36
40
|
def exists?(staging_record, table_name = nil)
|
data/lib/stagehand/version.rb
CHANGED
@@ -19,9 +19,11 @@ namespace :stagehand do
|
|
19
19
|
def rake_both_databases(task, stagehand_task = task.gsub(':','_'))
|
20
20
|
task(stagehand_task => :environment) do
|
21
21
|
Stagehand::Database.each do |connection_name|
|
22
|
-
|
23
|
-
|
24
|
-
|
22
|
+
Stagehand::Connection.with_production_writes(ActiveRecord::Base) do
|
23
|
+
puts "#{connection_name}"
|
24
|
+
Rake::Task[task].reenable
|
25
|
+
Rake::Task[task].invoke
|
26
|
+
end
|
25
27
|
end
|
26
28
|
Rake::Task[task].clear
|
27
29
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: culturecode_stagehand
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.10.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nicholas Jakobsen
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2016-09-
|
12
|
+
date: 2016-09-22 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|
@@ -71,6 +71,7 @@ files:
|
|
71
71
|
- lib/stagehand/auditor.rb
|
72
72
|
- lib/stagehand/cache.rb
|
73
73
|
- lib/stagehand/configuration.rb
|
74
|
+
- lib/stagehand/connection_adapter_extensions.rb
|
74
75
|
- lib/stagehand/controller_extensions.rb
|
75
76
|
- lib/stagehand/database.rb
|
76
77
|
- lib/stagehand/engine.rb
|