safer_rails_console 0.1.4 → 0.2.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 +4 -4
- data/CHANGELOG.md +14 -0
- data/README.md +4 -1
- data/lib/safer_rails_console/consoles/irb.rb +1 -1
- data/lib/safer_rails_console/patches/boot/sandbox_flag.rb +14 -10
- data/lib/safer_rails_console/patches/railtie/sandbox.rb +9 -2
- data/lib/safer_rails_console/patches/sandbox/auto_rollback.rb +16 -8
- data/lib/safer_rails_console/patches/sandbox/transaction_read_only.rb +26 -0
- data/lib/safer_rails_console/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fdba797ed52f07225b6f16b76e99a9dac4731b4b
|
4
|
+
data.tar.gz: 7ecdb4551bb8c70d3d01d7aa964198cb667ed852
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c792c0b4684d712180eb6a963144faf05a68a28bc9565725b71987f17c8bff788362f839219faf2945952fcb025ac4ee9d76287cd0eff660882617b8c798020d
|
7
|
+
data.tar.gz: 5cda5a4537478ab21d1cbce6629e081e33864d650a9eb56c932c50c7e673efce188c114f6447c71c67041901d14159f4534f46005938f3b483b8551cbecb7787
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,19 @@
|
|
1
1
|
# Change Log
|
2
2
|
|
3
|
+
## [v0.2.0](https://github.com/salsify/safer_rails_console/tree/v0.2.0) (2017-09-07)
|
4
|
+
[Full Changelog](https://github.com/salsify/safer_rails_console/compare/v0.1.4...v0.2.0)
|
5
|
+
|
6
|
+
**Implemented enhancements:**
|
7
|
+
|
8
|
+
- Sandbox mode should make it clear that edits don't stick [\#19](https://github.com/salsify/safer_rails_console/issues/19)
|
9
|
+
- Writes made in sandbox mode take out DB locks [\#18](https://github.com/salsify/safer_rails_console/issues/18)
|
10
|
+
- Confusion over unsandboxed/sandboxed terminology in command prompt [\#17](https://github.com/salsify/safer_rails_console/issues/17)
|
11
|
+
|
12
|
+
**Merged pull requests:**
|
13
|
+
|
14
|
+
- Set DB transactions to read-only and provide messaging for non-read operations [\#21](https://github.com/salsify/safer_rails_console/pull/21) ([timothysu](https://github.com/timothysu))
|
15
|
+
- Change 'sandboxed' and 'unsandboxed' to 'read-only' and 'writable' and add respective flags [\#20](https://github.com/salsify/safer_rails_console/pull/20) ([timothysu](https://github.com/timothysu))
|
16
|
+
|
3
17
|
## [v0.1.4](https://github.com/salsify/safer_rails_console/tree/v0.1.4) (2017-08-15)
|
4
18
|
[Full Changelog](https://github.com/salsify/safer_rails_console/compare/v0.1.3...v0.1.4)
|
5
19
|
|
data/README.md
CHANGED
@@ -27,11 +27,14 @@ require 'safer_rails_console/patches/boot'
|
|
27
27
|
|
28
28
|
The quickest way to demo this gem is to run `bundle exec rails console --sandbox`.
|
29
29
|
|
30
|
-
|
30
|
+
Several ways to explicitly enable or disable the sandbox are added to Rails console as flags with the last install step. The order of precedence is `-s`, `-r`, then `-w` if multiple sandbox related flags are specified.
|
31
31
|
```ruby
|
32
32
|
bundle exec rails console --help
|
33
33
|
|
34
|
+
Usage: rails console [environment] [options]
|
34
35
|
-s, --[no-]sandbox Explicitly enable/disable sandbox mode.
|
36
|
+
-w, --writable Alias for --no-sandbox.
|
37
|
+
-r, --read-only Alias for --sandbox.
|
35
38
|
-e, --environment=name Specifies the environment to run this console under (test/development/production).
|
36
39
|
Default: development
|
37
40
|
--debugger Enable the debugger.
|
@@ -2,7 +2,7 @@ include SaferRailsConsole::Colors
|
|
2
2
|
|
3
3
|
app_name = ::Rails.application.class.parent.to_s.underscore.dasherize
|
4
4
|
env_name = SaferRailsConsole.environment_name
|
5
|
-
status = ::Rails.application.sandbox ? '
|
5
|
+
status = ::Rails.application.sandbox ? 'read-only' : 'writable'
|
6
6
|
color = SaferRailsConsole.prompt_color
|
7
7
|
|
8
8
|
prompt = "#{app_name}(#{env_name})(#{status}):%03n:%i"
|
@@ -4,6 +4,16 @@ module SaferRailsConsole
|
|
4
4
|
module Patches
|
5
5
|
module Boot
|
6
6
|
module SandboxFlag
|
7
|
+
def self.console_options(opt, options = {})
|
8
|
+
opt.banner = 'Usage: rails console [environment] [options]'
|
9
|
+
opt.on('-s', '--[no-]sandbox', 'Explicitly enable/disable sandbox mode.') { |v| options[:sandbox] = v }
|
10
|
+
opt.on('-w', '--writable', 'Alias for --no-sandbox.') { |v| options[:writable] = v }
|
11
|
+
opt.on('-r', '--read-only', 'Alias for --sandbox.') { |v| options[:'read-only'] = v }
|
12
|
+
opt.on('-e', '--environment=name', String,
|
13
|
+
'Specifies the environment to run this console under (test/development/production).',
|
14
|
+
'Default: development') { |v| options[:environment] = v.strip }
|
15
|
+
end
|
16
|
+
|
7
17
|
module Rails
|
8
18
|
module CommandsTasks4
|
9
19
|
def console
|
@@ -18,11 +28,7 @@ module SaferRailsConsole
|
|
18
28
|
options = {}
|
19
29
|
|
20
30
|
OptionParser.new do |opt|
|
21
|
-
opt
|
22
|
-
opt.on('-s', '--[no-]sandbox', 'Explicitly enable/disable sandbox mode.') { |v| options[:sandbox] = v }
|
23
|
-
opt.on('-e', '--environment=name', String,
|
24
|
-
'Specifies the environment to run this console under (test/development/production).',
|
25
|
-
'Default: development') { |v| options[:environment] = v.strip }
|
31
|
+
::SaferRailsConsole::Patches::Boot::SandboxFlag.console_options(opt, options)
|
26
32
|
opt.on('--debugger', 'Enable the debugger.') { |v| options[:debugger] = v }
|
27
33
|
opt.parse!(arguments)
|
28
34
|
end
|
@@ -53,11 +59,7 @@ module SaferRailsConsole
|
|
53
59
|
options = {}
|
54
60
|
|
55
61
|
OptionParser.new do |opt|
|
56
|
-
opt
|
57
|
-
opt.on('-s', '--[no-]sandbox', 'Explicitly enable/disable sandbox mode.') { |v| options[:sandbox] = v }
|
58
|
-
opt.on('-e', '--environment=name', String,
|
59
|
-
'Specifies the environment to run this console under (test/development/production).',
|
60
|
-
'Default: development') { |v| options[:environment] = v.strip }
|
62
|
+
::SaferRailsConsole::Patches::Boot::SandboxFlag.console_options(opt, options)
|
61
63
|
opt.parse!(arguments)
|
62
64
|
end
|
63
65
|
|
@@ -83,6 +85,8 @@ elsif SaferRailsConsole::RailsVersion.five_one?
|
|
83
85
|
::Rails::Command::ConsoleCommand.class_eval do
|
84
86
|
remove_class_option :sandbox
|
85
87
|
class_option :sandbox, aliases: '-s', type: :boolean, desc: 'Explicitly enable/disable sandbox mode.'
|
88
|
+
class_option :writable, aliases: '-w', type: :boolean, desc: 'Alias for --no-sandbox.'
|
89
|
+
class_option :'read-only', aliases: '-r', type: :boolean, desc: 'Alias for --sandbox.'
|
86
90
|
end
|
87
91
|
else
|
88
92
|
unless SaferRailsConsole::RailsVersion.supported?
|
@@ -6,8 +6,15 @@ module SaferRailsConsole
|
|
6
6
|
def start(*args)
|
7
7
|
options = args.last
|
8
8
|
|
9
|
-
|
10
|
-
|
9
|
+
if options[:sandbox].nil?
|
10
|
+
options[:sandbox] = if options[:'read-only']
|
11
|
+
true
|
12
|
+
elsif options[:writable]
|
13
|
+
false
|
14
|
+
else
|
15
|
+
SaferRailsConsole.sandbox_environment? && SaferRailsConsole.config.sandbox_prompt ? SaferRailsConsole::Console.sandbox_user_prompt : SaferRailsConsole.sandbox_environment?
|
16
|
+
end
|
17
|
+
end
|
11
18
|
|
12
19
|
super *args
|
13
20
|
end
|
@@ -2,27 +2,37 @@ module SaferRailsConsole
|
|
2
2
|
module Patches
|
3
3
|
module Sandbox
|
4
4
|
module AutoRollback
|
5
|
+
extend SaferRailsConsole::Colors
|
6
|
+
|
5
7
|
def self.rollback_and_begin_new_transaction
|
6
8
|
connection = ::ActiveRecord::Base.connection
|
7
9
|
connection.rollback_db_transaction
|
8
10
|
connection.begin_db_transaction
|
9
11
|
end
|
10
12
|
|
13
|
+
def self.handle_and_reraise_exception(e)
|
14
|
+
if e.message.include?('PG::ReadOnlySqlTransaction')
|
15
|
+
puts color_text('An operation could not be completed due to read-only mode.', RED) # rubocop:disable Rails/Output
|
16
|
+
else
|
17
|
+
rollback_and_begin_new_transaction
|
18
|
+
end
|
19
|
+
|
20
|
+
raise e
|
21
|
+
end
|
22
|
+
|
11
23
|
module ActiveRecord
|
12
24
|
module ConnectionAdapters
|
13
25
|
module PostgreSQLAdapter41
|
14
26
|
def exec_no_cache(sql, name, binds)
|
15
27
|
super
|
16
28
|
rescue => e
|
17
|
-
SaferRailsConsole::Patches::Sandbox::AutoRollback.
|
18
|
-
raise e
|
29
|
+
SaferRailsConsole::Patches::Sandbox::AutoRollback.handle_and_reraise_exception(e)
|
19
30
|
end
|
20
31
|
|
21
32
|
def exec_cache(sql, name, binds)
|
22
33
|
super
|
23
34
|
rescue => e
|
24
|
-
SaferRailsConsole::Patches::Sandbox::AutoRollback.
|
25
|
-
raise e
|
35
|
+
SaferRailsConsole::Patches::Sandbox::AutoRollback.handle_and_reraise_exception(e)
|
26
36
|
end
|
27
37
|
end
|
28
38
|
|
@@ -30,8 +40,7 @@ module SaferRailsConsole
|
|
30
40
|
def execute_and_clear(sql, name, binds)
|
31
41
|
super
|
32
42
|
rescue => e
|
33
|
-
SaferRailsConsole::Patches::Sandbox::AutoRollback.
|
34
|
-
raise e
|
43
|
+
SaferRailsConsole::Patches::Sandbox::AutoRollback.handle_and_reraise_exception(e)
|
35
44
|
end
|
36
45
|
end
|
37
46
|
|
@@ -39,8 +48,7 @@ module SaferRailsConsole
|
|
39
48
|
def execute_and_clear(sql, name, binds, prepare: false)
|
40
49
|
super
|
41
50
|
rescue => e
|
42
|
-
SaferRailsConsole::Patches::Sandbox::AutoRollback.
|
43
|
-
raise e
|
51
|
+
SaferRailsConsole::Patches::Sandbox::AutoRollback.handle_and_reraise_exception(e)
|
44
52
|
end
|
45
53
|
end
|
46
54
|
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module SaferRailsConsole
|
2
|
+
module Patches
|
3
|
+
module Sandbox
|
4
|
+
module TransactionReadOnly
|
5
|
+
module ActiveRecord
|
6
|
+
module ConnectionAdapters
|
7
|
+
module PostgreSQLAdapter
|
8
|
+
def begin_db_transaction
|
9
|
+
super
|
10
|
+
execute 'SET TRANSACTION READ ONLY'
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
if defined?(::ActiveRecord::ConnectionAdapters::PostgreSQLAdapter)
|
21
|
+
::ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.prepend(SaferRailsConsole::Patches::Sandbox::TransactionReadOnly::ActiveRecord::ConnectionAdapters::PostgreSQLAdapter)
|
22
|
+
|
23
|
+
# Ensure transaction is read-only if it was began before this patch was loaded
|
24
|
+
connection = ::ActiveRecord::Base.connection
|
25
|
+
connection.execute 'SET TRANSACTION READ ONLY' if connection.open_transactions > 0
|
26
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: safer_rails_console
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Salsify, Inc
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-09-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: appraisal
|
@@ -206,6 +206,7 @@ files:
|
|
206
206
|
- lib/safer_rails_console/patches/railtie/sandbox.rb
|
207
207
|
- lib/safer_rails_console/patches/sandbox.rb
|
208
208
|
- lib/safer_rails_console/patches/sandbox/auto_rollback.rb
|
209
|
+
- lib/safer_rails_console/patches/sandbox/transaction_read_only.rb
|
209
210
|
- lib/safer_rails_console/rails_version.rb
|
210
211
|
- lib/safer_rails_console/railtie.rb
|
211
212
|
- lib/safer_rails_console/version.rb
|