sandboxy 1.0.0 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +9 -0
- data/README.md +37 -9
- data/examples/rails_example/config/sandboxy.yml +13 -0
- data/lib/generators/sandboxy_generator.rb +4 -3
- data/lib/generators/templates/configuration.yml.erb +13 -0
- data/lib/sandboxy/configuration.rb +42 -0
- data/lib/sandboxy/middleware.rb +15 -0
- data/lib/sandboxy/railtie.rb +6 -1
- data/lib/sandboxy/sandboxed.rb +1 -1
- data/lib/sandboxy/version.rb +1 -1
- data/lib/sandboxy.rb +3 -1
- data/sandboxy.gemspec +3 -3
- data/test/dummy30/config/sandboxy.yml +1 -0
- data/test/sandbox_test.rb +12 -2
- metadata +16 -13
- data/examples/rails_example/config/initializers/sandboxy.rb +0 -7
- data/lib/generators/templates/initializer.rb.erb +0 -7
- data/test/dummy30/config/initializers/sandboxy.rb +0 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3af3fd5a81896b5f9480bf645add749cbd57d009
|
4
|
+
data.tar.gz: 6ebb750a5ec79e5a91d71446b0f60987da39f72a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6029e39f313ae946fb6fdfa413dfbc88e0437c080873d6c073a01490c02c71b6dd3ee7d9de3cff54b61e24b7285bb5aaf1bcbae8e1d488bd5a0deb724c6c71b7
|
7
|
+
data.tar.gz: 9f8bb2178a429068a9389b1df16dd49f1a614269a18479fffadd9503c9e75d0b67585d1c882512adf792f55dcbee670b40ef72f0b8fbd1370f4e20757b2bde1c
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
<img src="https://travis-ci.org/slooob/sandboxy.svg?branch=master" /> [![Gem Version](https://badge.fury.io/rb/sandboxy.svg)](https://badge.fury.io/rb/sandboxy)
|
4
4
|
|
5
|
-
Sandboxy allows you to use
|
5
|
+
Sandboxy allows you to use virtual data-oriented environments inside a Rails application while being able to switch in between at runtime. It achieves that by using a combination of Rack Middleware and ActiveRecord.
|
6
6
|
|
7
7
|
---
|
8
8
|
|
@@ -11,7 +11,9 @@ Sandboxy allows you to use two virtual data-oriented environments inside a Rails
|
|
11
11
|
* [Installation](#installation)
|
12
12
|
* [Usage](#usage)
|
13
13
|
* [Setup](#setup)
|
14
|
+
* [Configuration](#configuration)
|
14
15
|
* [Sandboxed methods](#sandboxed-methods)
|
16
|
+
* [Sandboxy methods](#sandboxy-methods)
|
15
17
|
* [Switching environments](#switching-environments)
|
16
18
|
* [Sandbox & APIs](#sandbox--apis)
|
17
19
|
* [To Do](#to-do)
|
@@ -47,7 +49,11 @@ Now run the generator:
|
|
47
49
|
|
48
50
|
$ rails g sandboxy
|
49
51
|
|
50
|
-
You can specify
|
52
|
+
You can specify your applications default environment by passing `--default live` or `--default sandbox`. Learn more about switching environments [here](#switching-environments).
|
53
|
+
|
54
|
+
To set that your app should retain it's environment at runtime on new requests pass `--retain_environment true`.
|
55
|
+
|
56
|
+
You can always update your [configuration](#configuration) later.
|
51
57
|
|
52
58
|
To wrap things up, migrate the changes into your database:
|
53
59
|
|
@@ -55,13 +61,13 @@ To wrap things up, migrate the changes into your database:
|
|
55
61
|
|
56
62
|
**Note:** Use `rake db:migrate` instead if you run Rails < 5.
|
57
63
|
|
58
|
-
This will create
|
64
|
+
This will create a configuration file under `config/sandboxy.yml` as well as a migration file and the `Sandbox` model.
|
59
65
|
|
60
66
|
## Usage
|
61
67
|
|
62
68
|
### Setup
|
63
69
|
|
64
|
-
Add Sandboxy to the models where you want to separate live & sandbox
|
70
|
+
Add Sandboxy to the models where you want to separate live & sandbox records:
|
65
71
|
|
66
72
|
```ruby
|
67
73
|
class Foo < ApplicationRecord
|
@@ -72,14 +78,20 @@ end
|
|
72
78
|
In most use cases you would want to add sandboxy to a lot of ActiveRecord models if not all. To simplify that you could create a new class and let all your models inherit from it:
|
73
79
|
|
74
80
|
```ruby
|
75
|
-
class
|
81
|
+
class SharedSandbox < ApplicationRecord
|
76
82
|
sandboxy
|
77
83
|
end
|
78
84
|
|
79
|
-
class Foo <
|
85
|
+
class Foo < SharedSandbox
|
80
86
|
end
|
81
87
|
```
|
82
88
|
|
89
|
+
### Configuration
|
90
|
+
|
91
|
+
In `config/sandboxy.yml` you define your app's default environment. This can be either set to `live` or `sandbox`. It defaults to `live`.
|
92
|
+
|
93
|
+
Now this default gets refreshed before every new request. To retain any environment you [switched in at runtime](#switching-environments), you need to set `retain_environment` to `true`. Defaults to `false`.
|
94
|
+
|
83
95
|
### Sandboxed methods
|
84
96
|
|
85
97
|
By default you can only access records belonging to the current environment (`live` or `sandbox`):
|
@@ -116,11 +128,27 @@ foo.make_sandboxed
|
|
116
128
|
foo.sandboxed? # => true
|
117
129
|
```
|
118
130
|
|
119
|
-
###
|
131
|
+
### Sandboxy methods
|
132
|
+
|
133
|
+
To access your default environment setting:
|
134
|
+
|
135
|
+
```ruby
|
136
|
+
Sandboxy.environment # => 'live' / 'sandbox'
|
137
|
+
Sandboxy.sandbox? # => true / false
|
138
|
+
Sandboxy.live? # => true / false
|
139
|
+
```
|
140
|
+
|
141
|
+
**Note:** `Sandboxy.environment` does *NOT* return the apps current environment. For that use the [`$sandbox` variable](#switching-environments) instead.
|
142
|
+
|
143
|
+
You can also access whether your app retains your environment throughout request:
|
120
144
|
|
121
|
-
|
145
|
+
```ruby
|
146
|
+
Sandboxy.retain_environment # => true / false
|
147
|
+
```
|
148
|
+
|
149
|
+
### Switching environments
|
122
150
|
|
123
|
-
|
151
|
+
At runtime you can always switch environments by using the `$sandbox` variable anywhere in your application. Set it to `true` to enable the `sandbox` environment. Set it to `false` to enable the `live` environment. That makes Sandboxy super flexible.
|
124
152
|
|
125
153
|
#### Sandbox & APIs
|
126
154
|
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# ----------
|
2
|
+
# Sandboxy
|
3
|
+
# ----------
|
4
|
+
|
5
|
+
# Set your environment default: Must be either `live` or `sandbox`.
|
6
|
+
# This is the environment that your app boots with.
|
7
|
+
# By default it gets refreshed with every new request to your server.
|
8
|
+
# environment: 'live'
|
9
|
+
|
10
|
+
# Specify whether to retain your current app environment on new requests.
|
11
|
+
# If set to true, your app will only load your environment default when starting.
|
12
|
+
# Every additional switch of your environment at runtime will then not be automatically resolved to your environment default on a new request.
|
13
|
+
# retain_environment: false
|
@@ -7,7 +7,8 @@ class SandboxyGenerator < Rails::Generators::Base
|
|
7
7
|
|
8
8
|
source_root File.join File.dirname(__FILE__), 'templates'
|
9
9
|
desc 'Install sandboxy'
|
10
|
-
class_option :default, desc: 'Set
|
10
|
+
class_option :default, desc: 'Set to default environment. Accepts either `live` or `sandbox`.', type: :boolean, default: false, aliases: '-d'
|
11
|
+
class_option :retain_environment, desc: "Whether your app should retain it's environment at runtime on new requests.", type: :boolean, default: false, aliases: '-re'
|
11
12
|
|
12
13
|
def self.next_migration_number dirname
|
13
14
|
if ActiveRecord::Base.timestamped_migrations
|
@@ -21,8 +22,8 @@ class SandboxyGenerator < Rails::Generators::Base
|
|
21
22
|
migration_template 'migration.rb.erb', 'db/migrate/sandboxy_migration.rb', migration_version: migration_version
|
22
23
|
end
|
23
24
|
|
24
|
-
def
|
25
|
-
template '
|
25
|
+
def create_configuration
|
26
|
+
template 'configuration.yml.erb', 'config/sandboxy.yml'
|
26
27
|
end
|
27
28
|
|
28
29
|
def create_model
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# ----------
|
2
|
+
# Sandboxy
|
3
|
+
# ----------
|
4
|
+
|
5
|
+
# Set your environment default: Must be either `live` or `sandbox`.
|
6
|
+
# This is the environment that your app boots with.
|
7
|
+
# By default it gets refreshed with every new request to your server.
|
8
|
+
<% if options[:default] %>environment: <%= options[:default] %><% else %># environment: 'live'<% end %>
|
9
|
+
|
10
|
+
# Specify whether to retain your current app environment on new requests.
|
11
|
+
# If set to true, your app will only load your environment default when starting.
|
12
|
+
# Every additional switch of your environment at runtime will then not be automatically resolved to your environment default on a new request.
|
13
|
+
<% if options[:retain_environment] %>retain_environment: <%= options[:retain_environment] %><% else %># retain_environment: false<% end %>
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module Sandboxy
|
2
|
+
|
3
|
+
def self.environment
|
4
|
+
config = get_config
|
5
|
+
if config&.key :environment
|
6
|
+
config[:environment]
|
7
|
+
else
|
8
|
+
'live'
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.sandbox?
|
13
|
+
Sandboxy.environment == 'sandbox' ? true : false
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.live?
|
17
|
+
!Sandboxy.sandbox?
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.retain_environment
|
21
|
+
config = get_config
|
22
|
+
if config&.key :retain_environment
|
23
|
+
config[:retain_environment]
|
24
|
+
else
|
25
|
+
false
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
|
33
|
+
def self.get_config
|
34
|
+
require 'yaml'
|
35
|
+
|
36
|
+
begin
|
37
|
+
YAML.load_file 'config/sandboxy.yml'
|
38
|
+
rescue Exception
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Sandboxy
|
2
|
+
class Middleware
|
3
|
+
|
4
|
+
def initialize app
|
5
|
+
@app = app
|
6
|
+
end
|
7
|
+
|
8
|
+
def call env
|
9
|
+
previous_sandbox = $sandbox
|
10
|
+
$sandbox = Sandboxy.environment == 'sandbox' ? true : false
|
11
|
+
puts 'Sandbox: Moved to ' + Sandboxy.environment + ' environment' if $sandbox != previous_sandbox
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
15
|
+
end
|
data/lib/sandboxy/railtie.rb
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
require 'rails'
|
2
|
-
require 'sandboxy/sandboxed'
|
3
2
|
|
4
3
|
|
5
4
|
module Sandboxy
|
@@ -11,5 +10,11 @@ module Sandboxy
|
|
11
10
|
end
|
12
11
|
end
|
13
12
|
|
13
|
+
initializer 'sandboxy.configure_rails_initialization' do |app|
|
14
|
+
puts 'Sandboxy: Using ' + Sandboxy.environment + ' environment'
|
15
|
+
$sandbox = Sandboxy.environment == 'sandbox' ? true : false
|
16
|
+
app.middleware.use(Sandboxy::Middleware) unless Sandboxy.retain_environment
|
17
|
+
end
|
18
|
+
|
14
19
|
end
|
15
20
|
end
|
data/lib/sandboxy/sandboxed.rb
CHANGED
data/lib/sandboxy/version.rb
CHANGED
data/lib/sandboxy.rb
CHANGED
data/sandboxy.gemspec
CHANGED
@@ -6,7 +6,7 @@ Gem::Specification.new do |gem|
|
|
6
6
|
gem.version = Sandboxy::VERSION
|
7
7
|
gem.platform = Gem::Platform::RUBY
|
8
8
|
gem.summary = 'Virtual data-oriented environments for Rails'
|
9
|
-
gem.description = 'Sandboxy allows you to use
|
9
|
+
gem.description = 'Sandboxy allows you to use virtual data-oriented environments inside a Rails application while being able to switch in between at runtime. It achieves that by using a combination of Rack Middleware and ActiveRecord.'
|
10
10
|
gem.authors = 'Slooob'
|
11
11
|
gem.email = 'developer@slooob.com'
|
12
12
|
gem.homepage = 'https://developer.slooob.com/open-source'
|
@@ -17,13 +17,13 @@ Gem::Specification.new do |gem|
|
|
17
17
|
|
18
18
|
gem.post_install_message = IO.read('INSTALL.md')
|
19
19
|
|
20
|
-
gem.required_ruby_version = '>= 2.
|
20
|
+
gem.required_ruby_version = '>= 2.3'
|
21
21
|
|
22
22
|
gem.add_dependency 'activerecord', '>= 4.0'
|
23
23
|
|
24
24
|
gem.add_development_dependency 'sqlite3', '~> 1.3'
|
25
|
-
gem.add_development_dependency 'shoulda_create', '~> 0.0'
|
26
25
|
gem.add_development_dependency 'shoulda', '~> 3.5'
|
26
|
+
gem.add_development_dependency 'shoulda_create', '~> 0.0'
|
27
27
|
gem.add_development_dependency 'factory_girl', '~> 4.8'
|
28
28
|
gem.add_development_dependency 'rails', '>= 4.0'
|
29
29
|
gem.add_development_dependency 'tzinfo-data', '~> 1.2017'
|
@@ -0,0 +1 @@
|
|
1
|
+
# Use defaults
|
data/test/sandbox_test.rb
CHANGED
@@ -2,7 +2,17 @@ require File.dirname(__FILE__) + '/test_helper'
|
|
2
2
|
|
3
3
|
class SandboxTest < ActiveSupport::TestCase
|
4
4
|
|
5
|
-
context '
|
5
|
+
context 'scopes' do
|
6
|
+
should 'be defined' do
|
7
|
+
assert Some.respond_to? :live_scoped
|
8
|
+
assert Some.respond_to? :sandboxed_scoped
|
9
|
+
assert Some.respond_to? :live
|
10
|
+
assert Some.respond_to? :sandboxed
|
11
|
+
assert Some.respond_to? :desandbox
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
context 'sandbox' do
|
6
16
|
setup do
|
7
17
|
@post = FactoryGirl.create :post
|
8
18
|
@purchase = FactoryGirl.create :purchase
|
@@ -11,7 +21,7 @@ class SandboxTest < ActiveSupport::TestCase
|
|
11
21
|
@receipt = FactoryGirl.create :receipt
|
12
22
|
end
|
13
23
|
|
14
|
-
context 'desandbox' do
|
24
|
+
context '#desandbox' do
|
15
25
|
should 'return all records' do
|
16
26
|
assert_equal Some.unscope(:joins, :where).all, Some.desandbox
|
17
27
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sandboxy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Slooob
|
@@ -39,33 +39,33 @@ dependencies:
|
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '1.3'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
42
|
+
name: shoulda
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
47
|
+
version: '3.5'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
54
|
+
version: '3.5'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
56
|
+
name: shoulda_create
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: '
|
61
|
+
version: '0.0'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: '
|
68
|
+
version: '0.0'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: factory_girl
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -108,8 +108,9 @@ dependencies:
|
|
108
108
|
- - "~>"
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: '1.2017'
|
111
|
-
description: Sandboxy allows you to use
|
112
|
-
a Rails application
|
111
|
+
description: Sandboxy allows you to use virtual data-oriented environments inside
|
112
|
+
a Rails application while being able to switch in between at runtime. It achieves
|
113
|
+
that by using a combination of Rack Middleware and ActiveRecord.
|
113
114
|
email: developer@slooob.com
|
114
115
|
executables: []
|
115
116
|
extensions: []
|
@@ -201,11 +202,11 @@ files:
|
|
201
202
|
- examples/rails_example/config/initializers/filter_parameter_logging.rb
|
202
203
|
- examples/rails_example/config/initializers/inflections.rb
|
203
204
|
- examples/rails_example/config/initializers/mime_types.rb
|
204
|
-
- examples/rails_example/config/initializers/sandboxy.rb
|
205
205
|
- examples/rails_example/config/initializers/wrap_parameters.rb
|
206
206
|
- examples/rails_example/config/locales/en.yml
|
207
207
|
- examples/rails_example/config/puma.rb
|
208
208
|
- examples/rails_example/config/routes.rb
|
209
|
+
- examples/rails_example/config/sandboxy.yml
|
209
210
|
- examples/rails_example/config/secrets.yml
|
210
211
|
- examples/rails_example/db/migrate/20170826222427_sandboxy_migration.rb
|
211
212
|
- examples/rails_example/db/migrate/20170826223227_create_foos.rb
|
@@ -245,10 +246,12 @@ files:
|
|
245
246
|
- init.rb
|
246
247
|
- lib/generators/sandboxy_generator.rb
|
247
248
|
- lib/generators/templates/README.md
|
248
|
-
- lib/generators/templates/
|
249
|
+
- lib/generators/templates/configuration.yml.erb
|
249
250
|
- lib/generators/templates/migration.rb.erb
|
250
251
|
- lib/generators/templates/model.rb
|
251
252
|
- lib/sandboxy.rb
|
253
|
+
- lib/sandboxy/configuration.rb
|
254
|
+
- lib/sandboxy/middleware.rb
|
252
255
|
- lib/sandboxy/railtie.rb
|
253
256
|
- lib/sandboxy/sandboxed.rb
|
254
257
|
- lib/sandboxy/version.rb
|
@@ -266,11 +269,11 @@ files:
|
|
266
269
|
- test/dummy30/config/environment.rb
|
267
270
|
- test/dummy30/config/environments/development.rb
|
268
271
|
- test/dummy30/config/environments/test.rb
|
269
|
-
- test/dummy30/config/initializers/sandboxy.rb
|
270
272
|
- test/dummy30/config/initializers/secret_token.rb
|
271
273
|
- test/dummy30/config/initializers/session_store.rb
|
272
274
|
- test/dummy30/config/locales/en.yml
|
273
275
|
- test/dummy30/config/routes.rb
|
276
|
+
- test/dummy30/config/sandboxy.yml
|
274
277
|
- test/factories/somes.rb
|
275
278
|
- test/factories/users.rb
|
276
279
|
- test/sandbox_test.rb
|
@@ -292,7 +295,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
292
295
|
requirements:
|
293
296
|
- - ">="
|
294
297
|
- !ruby/object:Gem::Version
|
295
|
-
version: '2.
|
298
|
+
version: '2.3'
|
296
299
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
297
300
|
requirements:
|
298
301
|
- - ">="
|
@@ -1,7 +0,0 @@
|
|
1
|
-
# ----------
|
2
|
-
# Sandboxy
|
3
|
-
# ----------
|
4
|
-
|
5
|
-
# Specify your default environment by setting `$sandbox`. Learn more: https://github.com/slooob/sandboxy
|
6
|
-
<% if options[:default] == true %># <% end %>$sandbox = false
|
7
|
-
<% if options[:default] == false %># <% end %>$sandbox = true
|
@@ -1 +0,0 @@
|
|
1
|
-
$sandbox = false
|