rails_readonly_injector 0.3.0 → 1.0.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/.github/ISSUE_TEMPLATE.md +18 -0
- data/.github/PULL_REQUEST_TEMPLATE.md +24 -0
- data/.gitignore +1 -2
- data/CHANGELOG.md +2 -0
- data/Gemfile.lock +26 -0
- data/README.md +11 -0
- data/cucumber_features/step_definitions/user_steps.rb +2 -0
- data/development_tasks/tests.rake +32 -11
- data/lib/rails_readonly_injector.rb +28 -2
- data/lib/rails_readonly_injector/configuration.rb +84 -27
- data/lib/rails_readonly_injector/version.rb +1 -1
- data/rails_readonly_injector.gemspec +1 -0
- data/rspec_specs/rails_readonly_injector/configuration_spec.rb +163 -0
- data/rspec_specs/{readonly_site_toggle_spec.rb → rails_readonly_injector_spec.rb} +39 -1
- metadata +20 -4
- data/rspec_specs/readonly_site_toggle/configuration_spec.rb +0 -66
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c048af88f0b2c66068ceac474300b94da63bf30a
|
4
|
+
data.tar.gz: 9c2dd969f857a47fa866887c6e1e9bbe467b5dfd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 751bf2c91e9798e777811577792ae4c92d6bea387ea265b13c00e15a4ed9c5598fd5b27da99cc89f6c112a0d3e35398912e6e03f963ef002962cc0b37bc4314d
|
7
|
+
data.tar.gz: 3b90a488f476ccb57ab84bf6a4b255687e0e0688c4dae617222c4d8d35e0ebb867df9ccf7cddffd7a5f8531a5941b3d7a615c9b43980476aa0efc675df7d771a
|
@@ -0,0 +1,24 @@
|
|
1
|
+
## Problem
|
2
|
+
|
3
|
+
<!-- Describe the problem that this PR resolves -->
|
4
|
+
|
5
|
+
#### Related issues:
|
6
|
+
<!-- Link to issues that are related to this problem. If there aren't any, you can remove the heading. -->
|
7
|
+
|
8
|
+
## How this PR resolves the problem
|
9
|
+
|
10
|
+
<!--- Describe how your PR resolves this problem -->
|
11
|
+
|
12
|
+
## Types of changes
|
13
|
+
|
14
|
+
<!--- What types of changes does your code introduce? Put an `x` in all the boxes that apply: -->
|
15
|
+
- [ ] Bug fix (non-breaking change which fixes an issue).
|
16
|
+
- [ ] New feature (non-breaking change which adds functionality).
|
17
|
+
- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected).
|
18
|
+
|
19
|
+
## Checklist:
|
20
|
+
|
21
|
+
<!--- Go over all the following points, and put an `x` in all the boxes that apply. -->
|
22
|
+
- [ ] I've added tests for my code.
|
23
|
+
- [ ] My change requires a change to the documentation.
|
24
|
+
- [ ] I have updated the documentation accordingly.
|
data/.gitignore
CHANGED
data/CHANGELOG.md
CHANGED
data/Gemfile.lock
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
rails_readonly_injector (0.1.0)
|
5
|
+
|
6
|
+
GEM
|
7
|
+
remote: https://rubygems.org/
|
8
|
+
specs:
|
9
|
+
appraisal (2.2.0)
|
10
|
+
bundler
|
11
|
+
rake
|
12
|
+
thor (>= 0.14.0)
|
13
|
+
rake (10.5.0)
|
14
|
+
thor (0.20.0)
|
15
|
+
|
16
|
+
PLATFORMS
|
17
|
+
ruby
|
18
|
+
|
19
|
+
DEPENDENCIES
|
20
|
+
appraisal (~> 2.2.0)
|
21
|
+
bundler (~> 1.16)
|
22
|
+
rails_readonly_injector!
|
23
|
+
rake (~> 10.0)
|
24
|
+
|
25
|
+
BUNDLED WITH
|
26
|
+
1.16.1
|
data/README.md
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
# Rails ReadOnly Injector
|
2
2
|
[](https://travis-ci.org/xtrasimplicity/rails_readonly_injector)
|
3
|
+
[](http://www.rubydoc.info/github/xtrasimplicity/rails_readonly_injector/master)
|
3
4
|
[](https://codeclimate.com/github/xtrasimplicity/rails_readonly_injector/maintainability)
|
4
5
|
[](https://codeclimate.com/github/xtrasimplicity/rails_readonly_injector/test_coverage)
|
5
6
|
[](https://badge.fury.io/rb/rails_readonly_injector)
|
@@ -45,11 +46,14 @@ When you want to switch a site into read-only mode, you can then simply set `Rai
|
|
45
46
|
|
46
47
|
If you want to reset the configuration to the defaults, you can simply call `RailsReadonlyInjector.reset_configuration!` from anywhere in your application.
|
47
48
|
|
49
|
+
If you want to check whether read-only mode is currently enabled, you can use `RailsReadonlyInjector.in_read_only_mode?`.
|
50
|
+
|
48
51
|
## Configuration Options
|
49
52
|
- `read_only` => Whether the site should be in read-only mode. (Default: false)
|
50
53
|
- `classes_to_exclude` => An array of classes that should be _exempt_ from read-only mode. (Default: `[]`)
|
51
54
|
- `classes_to_include` => An array of classes that should be set to read-only mode. (Defaults to `ActiveRecord::Base.descendants` on Rails 3-4, and `ApplicationRecord.descendants` on Rails 5.0+)
|
52
55
|
- `controller_rescue_action` => A lambda expression/Proc to execute when an `ActiveRecord::ReadOnlyRecord` error is raised, from within a controller.
|
56
|
+
|
53
57
|
## Development
|
54
58
|
|
55
59
|
After checking out the repo, run `bundle install` to install the dependencies.
|
@@ -58,6 +62,13 @@ RSpec specs and Cucumber features are stored in `rspec_specs` and `cucumber_feat
|
|
58
62
|
|
59
63
|
To run tests for a specific version of Rails, simply run `bundle exec appraisal {APPRAISAL} bundle exec rake`, where `{APPRAISAL}` is one of the appraisals found under `Appraisals`.
|
60
64
|
|
65
|
+
If you don't want to re-build the application each time you run tests, you can execute one of the following rake tasks against an appraisal:
|
66
|
+
|
67
|
+
* `dev:run_features` => Synchronises features from `cucumber_features` into the temporary rails application, and runs them against the application.
|
68
|
+
* `dev:run_specs` => Synchronises specs from `rspec_specs` into the temporary rails application, and runs them against the application.
|
69
|
+
* `dev:run_tests` => Runs both `dev:run_features` and `dev:run_specs`.
|
70
|
+
|
71
|
+
|
61
72
|
## Contributing
|
62
73
|
|
63
74
|
Bug reports and pull requests are welcome on GitHub at https://github.com/xtrasimplicity/rails_readonly_injector. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
|
@@ -31,17 +31,12 @@ namespace :dev do
|
|
31
31
|
append_to_file 'Gemfile', %{gem "rails_readonly_injector", path: "#{GEM_ROOT_PATH}"\n}
|
32
32
|
|
33
33
|
# Make sure we don't use the gemfile from Appraisal
|
34
|
-
|
35
|
-
ENV.delete('BUNDLE_BIN_PATH')
|
36
|
-
ENV.delete('RUBYOPT')
|
34
|
+
unset_appraisal_environment_variables
|
37
35
|
|
38
36
|
# Install gems
|
39
|
-
system("bundle install
|
37
|
+
system("bundle install")
|
40
38
|
|
41
|
-
puts "Installing Cucumber..."
|
42
39
|
system("bundle exec rails generate cucumber:install")
|
43
|
-
|
44
|
-
puts "Installing RSpec..."
|
45
40
|
system("bundle exec rails generate rspec:install")
|
46
41
|
|
47
42
|
# RSpec: Include all files in support/
|
@@ -67,15 +62,35 @@ namespace :dev do
|
|
67
62
|
end
|
68
63
|
|
69
64
|
desc "Synchronises tests from `cucumber_features` and `rspec_specs` into the rails application in #{RAILS_APP_PATH}, and runs the tests against the application."
|
70
|
-
task :run_tests
|
65
|
+
task :run_tests => [:run_features, :run_specs]
|
66
|
+
|
67
|
+
desc "Synchronises features from `cucumber_features` into the rails application in #{RAILS_APP_PATH}, and runs them against the application."
|
68
|
+
task :run_features do
|
71
69
|
switch_to_rails_app_path
|
72
70
|
|
73
|
-
#
|
71
|
+
# Synchronise the cucumber features
|
74
72
|
FileUtils.cp_r File.join(GEM_ROOT_PATH, 'cucumber_features', '.'), 'features'
|
73
|
+
|
74
|
+
unset_appraisal_environment_variables
|
75
|
+
|
76
|
+
command_executed_successfully = system('bundle exec cucumber')
|
77
|
+
|
78
|
+
exit 1 unless command_executed_successfully
|
79
|
+
end
|
80
|
+
|
81
|
+
desc "Synchronises specs from `rspec_specs` into the rails application in #{RAILS_APP_PATH}, and runs them against the application."
|
82
|
+
task :run_specs do
|
83
|
+
switch_to_rails_app_path
|
84
|
+
|
85
|
+
# Synchronise the cucumber features
|
75
86
|
FileUtils.cp_r File.join(GEM_ROOT_PATH, 'rspec_specs', '.'), 'spec'
|
76
87
|
|
77
|
-
|
78
|
-
|
88
|
+
unset_appraisal_environment_variables
|
89
|
+
|
90
|
+
|
91
|
+
command_executed_successfully = system('bundle exec rspec')
|
92
|
+
|
93
|
+
exit 1 unless command_executed_successfully
|
79
94
|
end
|
80
95
|
|
81
96
|
def parse_gemfile(file_path)
|
@@ -127,4 +142,10 @@ namespace :dev do
|
|
127
142
|
f.write content
|
128
143
|
end
|
129
144
|
end
|
145
|
+
|
146
|
+
def unset_appraisal_environment_variables
|
147
|
+
ENV.delete('BUNDLE_GEMFILE')
|
148
|
+
ENV.delete('BUNDLE_BIN_PATH')
|
149
|
+
ENV.delete('RUBYOPT')
|
150
|
+
end
|
130
151
|
end
|
@@ -2,16 +2,20 @@ require "rails_readonly_injector/version"
|
|
2
2
|
require "rails_readonly_injector/configuration"
|
3
3
|
|
4
4
|
module RailsReadonlyInjector
|
5
|
+
|
6
|
+
# Applies changes defined in the `config` object
|
7
|
+
# and resets `config.dirty?` to false
|
5
8
|
def self.reload!
|
6
9
|
config.classes_to_include.each do |klass|
|
7
10
|
|
8
|
-
# Ensure we
|
11
|
+
# Ensure we restore classes that we want to exclude, to their defaults
|
12
|
+
# in case they were previously marked as read-only.
|
9
13
|
if config.classes_to_exclude.include? klass
|
10
14
|
restore_readonly_method(klass)
|
11
15
|
next
|
12
16
|
end
|
13
17
|
|
14
|
-
if self.config.read_only
|
18
|
+
if self.config.send(:read_only)
|
15
19
|
override_readonly_method(klass)
|
16
20
|
else
|
17
21
|
restore_readonly_method(klass)
|
@@ -19,6 +23,28 @@ module RailsReadonlyInjector
|
|
19
23
|
end
|
20
24
|
|
21
25
|
inject_error_handler_into_actioncontroller_base
|
26
|
+
|
27
|
+
self.config.send(:reset_dirty_status!)
|
28
|
+
end
|
29
|
+
|
30
|
+
# Returns the currently loaded `config.read_only` value.
|
31
|
+
# @return [Boolean] Whether the currently loaded config is set to read-only.
|
32
|
+
def self.in_read_only_mode?
|
33
|
+
if self.config.dirty? && self.config.changed_attributes.has_key?(:read_only)
|
34
|
+
# Return the previously stored value
|
35
|
+
self.config.changed_attributes[:read_only]
|
36
|
+
else
|
37
|
+
self.config.send(:read_only)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
# Sets the desired configuration object, if a block is provided,
|
42
|
+
# and then returns the current configuration object.
|
43
|
+
# @return [Configuration] The current configuration object.
|
44
|
+
def self.config
|
45
|
+
yield self.configuration if block_given?
|
46
|
+
|
47
|
+
self.configuration
|
22
48
|
end
|
23
49
|
|
24
50
|
private
|
@@ -1,25 +1,20 @@
|
|
1
1
|
module RailsReadonlyInjector
|
2
|
-
class Configuration
|
3
|
-
attr_writer :read_only, :classes_to_exclude, :classes_to_include
|
4
|
-
|
5
|
-
def read_only
|
6
|
-
@read_only || false
|
7
|
-
end
|
8
|
-
|
9
|
-
def controller_rescue_action=(action)
|
10
|
-
raise 'A lambda or proc must be specified' unless action.respond_to? :call
|
11
2
|
|
12
|
-
|
13
|
-
|
3
|
+
class Configuration
|
4
|
+
attr_reader :controller_rescue_action, :classes_to_include, :classes_to_exclude
|
14
5
|
|
15
|
-
def
|
16
|
-
@
|
17
|
-
|
6
|
+
def initialize
|
7
|
+
@read_only = false
|
8
|
+
@controller_rescue_action = Proc.new {}
|
9
|
+
@classes_to_exclude = []
|
18
10
|
|
19
|
-
|
20
|
-
@classes_to_exclude || []
|
11
|
+
@changed_attributes = Hash.new
|
21
12
|
end
|
22
13
|
|
14
|
+
# @return [Array<Class>] An array of classes to include
|
15
|
+
# If not specified upon initialisation, it defaults to:
|
16
|
+
# ActiveRecord::Base.descendants on Rails < 5.0.0, or
|
17
|
+
# ApplicationRecord.descendants on Rails >= 5.0.0
|
23
18
|
def classes_to_include
|
24
19
|
return @classes_to_include if defined? @classes_to_include
|
25
20
|
|
@@ -31,26 +26,88 @@ module RailsReadonlyInjector
|
|
31
26
|
ApplicationRecord.descendants
|
32
27
|
end
|
33
28
|
end
|
34
|
-
end
|
35
|
-
private_constant :Configuration
|
36
29
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
yield self.configuration if block_given?
|
30
|
+
#######################
|
31
|
+
# Setter Methods #
|
32
|
+
#######################
|
41
33
|
|
42
|
-
|
43
|
-
|
34
|
+
# @param new_value [Boolean] Whether the site should be in read-only mode
|
35
|
+
def read_only=(new_value)
|
36
|
+
update_instance_variable('@read_only', new_value)
|
37
|
+
end
|
44
38
|
|
45
|
-
|
46
|
-
|
39
|
+
# @param action [Lambda, Proc] The action to execute when rescuing from
|
40
|
+
# `ActiveRecord::RecordReadOnly` errors, within a controller
|
41
|
+
def controller_rescue_action=(action)
|
42
|
+
raise 'A lambda or proc must be specified' unless action.respond_to? :call
|
47
43
|
|
48
|
-
|
44
|
+
update_instance_variable('@controller_rescue_action', action)
|
45
|
+
end
|
46
|
+
|
47
|
+
# @param klasses [Array<Class>] The classes to exclude from being marked as read-only
|
48
|
+
def classes_to_exclude=(klasses)
|
49
|
+
update_instance_variable('@classes_to_exclude', klasses)
|
50
|
+
end
|
51
|
+
|
52
|
+
# @param klasses [Array<Class>] The classes to mark as read-only
|
53
|
+
def classes_to_include=(klasses)
|
54
|
+
update_instance_variable('@classes_to_include', klasses)
|
55
|
+
end
|
56
|
+
|
57
|
+
#####################
|
58
|
+
# Instance methods #
|
59
|
+
#####################
|
60
|
+
|
61
|
+
# @return [Boolean] Whether the configuration
|
62
|
+
# has changed since the config was last reloaded
|
63
|
+
def dirty?
|
64
|
+
!changed_attributes.empty?
|
65
|
+
end
|
66
|
+
|
67
|
+
# @return [Hash] A hash of changed attributes
|
68
|
+
# and their previous values
|
69
|
+
def changed_attributes
|
70
|
+
@changed_attributes
|
71
|
+
end
|
72
|
+
|
73
|
+
private
|
74
|
+
|
75
|
+
# Updates the value of the specified instance variable
|
76
|
+
# and tracks the attribute's previous value (for `#dirty?`)
|
77
|
+
def update_instance_variable(variable_name, new_value)
|
78
|
+
old_value = instance_variable_get(variable_name).freeze
|
79
|
+
|
80
|
+
instance_variable_set(variable_name.to_sym, new_value)
|
81
|
+
|
82
|
+
unless old_value == new_value
|
83
|
+
changed_attributes[variable_name.to_s.gsub('@', '').to_sym] = old_value
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
# Resets the changed attributes hash,
|
88
|
+
# so that `#dirty?` returns false
|
89
|
+
def reset_dirty_status!
|
90
|
+
@changed_attributes = Hash.new
|
91
|
+
end
|
92
|
+
|
93
|
+
def read_only
|
94
|
+
@read_only
|
95
|
+
end
|
49
96
|
end
|
97
|
+
private_constant :Configuration
|
50
98
|
|
51
99
|
private
|
52
100
|
|
101
|
+
# @return [Configuration] The current configuration object
|
53
102
|
def self.configuration
|
54
103
|
@config ||= Configuration.new
|
55
104
|
end
|
105
|
+
|
106
|
+
# Resets the current configuration to the defaults
|
107
|
+
# and reloads RailsReadonlyInjector
|
108
|
+
def self.reset_configuration!
|
109
|
+
@config = Configuration.new
|
110
|
+
|
111
|
+
self.reload!
|
112
|
+
end
|
56
113
|
end
|
@@ -0,0 +1,163 @@
|
|
1
|
+
require 'rails_helper'
|
2
|
+
|
3
|
+
RSpec.describe RailsReadonlyInjector.config do
|
4
|
+
describe '#controller_rescue_action=' do
|
5
|
+
context 'when given a lambda expression' do
|
6
|
+
let(:lambda_expression) { lambda { "This is a test lambda!" } }
|
7
|
+
|
8
|
+
before { RailsReadonlyInjector.config.controller_rescue_action = lambda_expression }
|
9
|
+
|
10
|
+
subject { RailsReadonlyInjector.config.controller_rescue_action }
|
11
|
+
|
12
|
+
it { is_expected.to eq(lambda_expression) }
|
13
|
+
end
|
14
|
+
|
15
|
+
context 'when given a Proc' do
|
16
|
+
let(:proc) { Proc.new { "This is a test Proc!" } }
|
17
|
+
|
18
|
+
before { RailsReadonlyInjector.config.controller_rescue_action = proc }
|
19
|
+
|
20
|
+
subject { RailsReadonlyInjector.config.controller_rescue_action }
|
21
|
+
|
22
|
+
it { is_expected.to eq(proc) }
|
23
|
+
end
|
24
|
+
|
25
|
+
context 'when an invalid value is assigned' do
|
26
|
+
it 'raises an error message' do
|
27
|
+
expect { RailsReadonlyInjector.config.controller_rescue_action = nil }.to raise_error 'A lambda or proc must be specified'
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe '#classes_to_include' do
|
33
|
+
context 'when not defined' do
|
34
|
+
context 'when using Rails < 5.0' do
|
35
|
+
before do
|
36
|
+
stub_const('Rails::VERSION::STRING', '4.1.0')
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'returns the descendants of ActiveRecord::Base' do
|
40
|
+
expect(ActiveRecord::Base).to receive(:descendants)
|
41
|
+
|
42
|
+
RailsReadonlyInjector.config.classes_to_include
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
context 'when using Rails >= 5.0' do
|
48
|
+
before do
|
49
|
+
stub_const('Rails::VERSION::STRING', '5.0.0')
|
50
|
+
|
51
|
+
unless defined? ApplicationRecord
|
52
|
+
class ApplicationRecord
|
53
|
+
def descendants
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
it 'returns the descendants of ActiveRecord::Base' do
|
60
|
+
expect(ApplicationRecord).to receive(:descendants)
|
61
|
+
|
62
|
+
RailsReadonlyInjector.config.classes_to_include
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
describe '#changed_attributes' do
|
70
|
+
setup do
|
71
|
+
RailsReadonlyInjector.reset_configuration!
|
72
|
+
|
73
|
+
RailsReadonlyInjector.config.read_only = false
|
74
|
+
end
|
75
|
+
|
76
|
+
context 'when one attribute is changed' do
|
77
|
+
before(:each) do
|
78
|
+
RailsReadonlyInjector.config.read_only = true
|
79
|
+
end
|
80
|
+
|
81
|
+
context 'and `reload!` is not called' do
|
82
|
+
subject { RailsReadonlyInjector.config.changed_attributes }
|
83
|
+
|
84
|
+
it 'returns a hash with the attribute and its old value' do
|
85
|
+
expect(subject).to eq({ read_only: false })
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
context 'and `reload!` is called' do
|
90
|
+
before { RailsReadonlyInjector.reload! }
|
91
|
+
subject { RailsReadonlyInjector.config.changed_attributes }
|
92
|
+
|
93
|
+
it 'returns an empty hash' do
|
94
|
+
expect(subject).to eq({})
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
context 'when more than one attribute is changed' do
|
100
|
+
setup { class TestClassA < ActiveRecord::Base; end; }
|
101
|
+
|
102
|
+
before(:each) do
|
103
|
+
RailsReadonlyInjector.config do |c|
|
104
|
+
c.read_only = true
|
105
|
+
c.classes_to_include = [TestClassA]
|
106
|
+
c.classes_to_exclude = [User]
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
context 'and `reload!` is not called' do
|
111
|
+
subject { RailsReadonlyInjector.config.changed_attributes }
|
112
|
+
|
113
|
+
it 'returns a hash with the attribute and its old value' do
|
114
|
+
expect(subject).to eq({
|
115
|
+
read_only: false,
|
116
|
+
classes_to_include: nil, # We expect this to be nil, as the `getter` method _returns_ (but does not assign) dynamic descendants of ActiveRecord::Base/ApplicationRecord, if undefined
|
117
|
+
classes_to_exclude: []
|
118
|
+
})
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
context 'and `reload!` is called' do
|
123
|
+
before { RailsReadonlyInjector.reload! }
|
124
|
+
subject { RailsReadonlyInjector.config.changed_attributes }
|
125
|
+
|
126
|
+
it 'returns an empty hash' do
|
127
|
+
expect(subject).to eq({})
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
context 'when an attribute is not changed' do
|
133
|
+
subject { RailsReadonlyInjector.config.changed_attributes }
|
134
|
+
|
135
|
+
it { is_expected.to eq({}) }
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
|
140
|
+
describe '#dirty?' do
|
141
|
+
setup do
|
142
|
+
RailsReadonlyInjector.config { |config| config.read_only = false }
|
143
|
+
RailsReadonlyInjector.reload!
|
144
|
+
end
|
145
|
+
|
146
|
+
context 'when `read_only` is changed' do
|
147
|
+
before(:each) { RailsReadonlyInjector.config.read_only = true }
|
148
|
+
|
149
|
+
context 'and `reload!` is not called' do
|
150
|
+
subject { RailsReadonlyInjector.config.dirty? }
|
151
|
+
|
152
|
+
it { is_expected.to eq(true) }
|
153
|
+
end
|
154
|
+
|
155
|
+
context 'and `reload!` is called' do
|
156
|
+
before { RailsReadonlyInjector.reload! }
|
157
|
+
subject { RailsReadonlyInjector.config.dirty? }
|
158
|
+
|
159
|
+
it { is_expected.to eq(false) }
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
163
|
+
end
|
@@ -13,7 +13,7 @@ RSpec.describe RailsReadonlyInjector do
|
|
13
13
|
subject { RailsReadonlyInjector.config }
|
14
14
|
|
15
15
|
it 'sets `read_only` to false' do
|
16
|
-
expect(RailsReadonlyInjector.config.read_only).to eq(false)
|
16
|
+
expect(RailsReadonlyInjector.config.send(:read_only)).to eq(false)
|
17
17
|
end
|
18
18
|
end
|
19
19
|
|
@@ -56,4 +56,42 @@ RSpec.describe RailsReadonlyInjector do
|
|
56
56
|
it { is_expected.to eq(false) }
|
57
57
|
end
|
58
58
|
end
|
59
|
+
|
60
|
+
describe '#in_read_only_mode?' do
|
61
|
+
setup do
|
62
|
+
RailsReadonlyInjector.config.read_only = false
|
63
|
+
RailsReadonlyInjector.reload!
|
64
|
+
end
|
65
|
+
|
66
|
+
context 'when `reload!` is called' do
|
67
|
+
before do
|
68
|
+
RailsReadonlyInjector.config.read_only = true
|
69
|
+
RailsReadonlyInjector.reload!
|
70
|
+
end
|
71
|
+
|
72
|
+
it 'returns the correct value' do
|
73
|
+
expect(RailsReadonlyInjector.in_read_only_mode?).to eq(true)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
context 'when `reload!` is not called' do
|
78
|
+
context 'when `config.read_only` is changed' do
|
79
|
+
before do
|
80
|
+
RailsReadonlyInjector.config.read_only = true
|
81
|
+
end
|
82
|
+
|
83
|
+
it 'returns the previous value' do
|
84
|
+
expect(RailsReadonlyInjector.in_read_only_mode?).to eq(false)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
context 'when `config.read_only` is not changed' do
|
89
|
+
before { RailsReadonlyInjector.config.classes_to_exclude = [User] }
|
90
|
+
|
91
|
+
it 'returns the current value' do
|
92
|
+
expect(RailsReadonlyInjector.in_read_only_mode?).to eq(RailsReadonlyInjector.config.send(:read_only))
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
59
97
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rails_readonly_injector
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrew Walter
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-03-
|
11
|
+
date: 2018-03-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -72,6 +72,20 @@ dependencies:
|
|
72
72
|
- - "~>"
|
73
73
|
- !ruby/object:Gem::Version
|
74
74
|
version: '2.2'
|
75
|
+
- !ruby/object:Gem::Dependency
|
76
|
+
name: yard
|
77
|
+
requirement: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - "~>"
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: 0.9.12
|
82
|
+
type: :development
|
83
|
+
prerelease: false
|
84
|
+
version_requirements: !ruby/object:Gem::Requirement
|
85
|
+
requirements:
|
86
|
+
- - "~>"
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: 0.9.12
|
75
89
|
description:
|
76
90
|
email:
|
77
91
|
- andrew.walter@burnet.edu.au
|
@@ -79,6 +93,8 @@ executables: []
|
|
79
93
|
extensions: []
|
80
94
|
extra_rdoc_files: []
|
81
95
|
files:
|
96
|
+
- ".github/ISSUE_TEMPLATE.md"
|
97
|
+
- ".github/PULL_REQUEST_TEMPLATE.md"
|
82
98
|
- ".gitignore"
|
83
99
|
- ".travis.yml"
|
84
100
|
- Appraisals
|
@@ -113,8 +129,8 @@ files:
|
|
113
129
|
- lib/rails_readonly_injector/version.rb
|
114
130
|
- rails_readonly_injector.gemspec
|
115
131
|
- rspec_specs/.gitkeep
|
116
|
-
- rspec_specs/
|
117
|
-
- rspec_specs/
|
132
|
+
- rspec_specs/rails_readonly_injector/configuration_spec.rb
|
133
|
+
- rspec_specs/rails_readonly_injector_spec.rb
|
118
134
|
- rspec_specs/support/.gitkeep
|
119
135
|
homepage: https://www.github.com/xtrasimplicity/rails_readonly_injector
|
120
136
|
licenses:
|
@@ -1,66 +0,0 @@
|
|
1
|
-
require 'rails_helper'
|
2
|
-
|
3
|
-
RSpec.describe RailsReadonlyInjector.config do
|
4
|
-
describe '#controller_rescue_action=' do
|
5
|
-
context 'when given a lambda expression' do
|
6
|
-
let(:lambda_expression) { lambda { "This is a test lambda!" } }
|
7
|
-
|
8
|
-
before { RailsReadonlyInjector.config.controller_rescue_action = lambda_expression }
|
9
|
-
|
10
|
-
subject { RailsReadonlyInjector.config.controller_rescue_action }
|
11
|
-
|
12
|
-
it { is_expected.to eq(lambda_expression) }
|
13
|
-
end
|
14
|
-
|
15
|
-
context 'when given a Proc' do
|
16
|
-
let(:proc) { Proc.new { "This is a test Proc!" } }
|
17
|
-
|
18
|
-
before { RailsReadonlyInjector.config.controller_rescue_action = proc }
|
19
|
-
|
20
|
-
subject { RailsReadonlyInjector.config.controller_rescue_action }
|
21
|
-
|
22
|
-
it { is_expected.to eq(proc) }
|
23
|
-
end
|
24
|
-
|
25
|
-
context 'when an invalid value is assigned' do
|
26
|
-
it 'raises an error message' do
|
27
|
-
expect { RailsReadonlyInjector.config.controller_rescue_action = nil }.to raise_error 'A lambda or proc must be specified'
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
describe '#classes_to_include' do
|
33
|
-
context 'when not defined' do
|
34
|
-
context 'when using Rails < 5.0' do
|
35
|
-
before { stub_const('Rails::VERSION::STRING', '4.1.0') }
|
36
|
-
|
37
|
-
it 'returns the descendants of ActiveRecord::Base' do
|
38
|
-
expect(ActiveRecord::Base).to receive(:descendants)
|
39
|
-
|
40
|
-
RailsReadonlyInjector.config.classes_to_include
|
41
|
-
end
|
42
|
-
|
43
|
-
end
|
44
|
-
|
45
|
-
context 'when using Rails >= 5.0' do
|
46
|
-
before do
|
47
|
-
stub_const('Rails::VERSION::STRING', '5.0.0')
|
48
|
-
|
49
|
-
unless defined? ApplicationRecord
|
50
|
-
class ApplicationRecord
|
51
|
-
def descendants
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
it 'returns the descendants of ActiveRecord::Base' do
|
58
|
-
expect(ApplicationRecord).to receive(:descendants)
|
59
|
-
|
60
|
-
RailsReadonlyInjector.config.classes_to_include
|
61
|
-
end
|
62
|
-
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|