sandboxy 1.0.0 → 1.1.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 +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" /> [](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
|