Skip to content

Commit c17ce46

Browse files
authored
Merge pull request #2599 from ruby-grape/refactor_setting_get_or_set
Refactor: Simplify Setting Methods and Remove Dynamic Method Generation
2 parents e35d292 + 4df57e3 commit c17ce46

5 files changed

Lines changed: 38 additions & 82 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
* [#2583](https://github.com/ruby-grape/grape/pull/2583): Optimize api parameter documentation and memory usage - [@ericproulx](https://github.com/ericproulx).
1313
* [#2589](https://github.com/ruby-grape/grape/pull/2589): Replace `send` by `__send__` in codebase - [@ericproulx](https://github.com/ericproulx).
1414
* [#2598](https://github.com/ruby-grape/grape/pull/2598): Refactor settings DSL to use explicit methods instead of dynamic generation - [@ericproulx](https://github.com/ericproulx).
15+
* [#2599](https://github.com/ruby-grape/grape/pull/2599): Simplify settings DSL get_or_set method and optimize logger implementation - [@ericproulx](https://github.com/ericproulx).
1516
* Your contribution here.
1617

1718
#### Fixes

lib/grape/dsl/logger.rb

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,11 @@ module Logger
77
# method will create a new one, logging to stdout.
88
# @param logger [Object] the new logger to use
99
def logger(logger = nil)
10+
global_settings = inheritable_setting.global
1011
if logger
11-
global_setting(:logger, logger)
12+
global_settings[:logger] = logger
1213
else
13-
global_setting(:logger) || global_setting(:logger, ::Logger.new($stdout))
14+
global_settings[:logger] || global_settings[:logger] = ::Logger.new($stdout)
1415
end
1516
end
1617
end

lib/grape/dsl/settings.rb

Lines changed: 20 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -26,46 +26,32 @@ def inheritable_setting
2626
@inheritable_setting ||= Grape::Util::InheritableSetting.new.tap { |new_settings| new_settings.inherit_from top_level_setting }
2727
end
2828

29-
# @param type [Symbol]
30-
# @param key [Symbol]
31-
# @param value [Object] will be stored if the value is currently empty
32-
# @return either the old value, if it wasn't nil, or the given value
33-
def get_or_set(type, key, value)
34-
setting = inheritable_setting.__send__(type)
35-
if value.nil?
36-
setting[key]
37-
else
38-
setting[key] = value
39-
end
29+
def namespace_inheritable(key, value = nil)
30+
get_or_set(inheritable_setting.namespace_inheritable, key, value)
4031
end
4132

42-
# defines the following methods:
43-
# - namespace_inheritable
44-
# - namespace_stackable
33+
def namespace_stackable(key, value = nil)
34+
get_or_set(inheritable_setting.namespace_stackable, key, value)
35+
end
4536

46-
%i[namespace_inheritable namespace_stackable].each do |method_name|
47-
define_method method_name do |key, value = nil|
48-
get_or_set method_name, key, value
49-
end
37+
def global_setting(key, value = nil)
38+
get_or_set(inheritable_setting.global, key, value)
5039
end
5140

52-
# defines the following methods:
53-
# - global_setting
54-
# - route_setting
55-
# - namespace_setting
41+
def route_setting(key, value = nil)
42+
get_or_set(inheritable_setting.route, key, value)
43+
end
5644

57-
%i[global route namespace].each do |method_name|
58-
define_method :"#{method_name}_setting" do |key, value = nil|
59-
get_or_set method_name, key, value
60-
end
45+
def namespace_setting(key, value = nil)
46+
get_or_set(inheritable_setting.namespace, key, value)
6147
end
6248

6349
def namespace_reverse_stackable(key, value = nil)
64-
get_or_set :namespace_reverse_stackable, key, value
50+
get_or_set(inheritable_setting.namespace_reverse_stackable, key, value)
6551
end
6652

6753
def namespace_stackable_with_hash(key)
68-
settings = get_or_set :namespace_stackable, key, nil
54+
settings = namespace_stackable(key)
6955
return if settings.blank?
7056

7157
settings.each_with_object({}) { |value, result| result.deep_merge!(value) }
@@ -89,6 +75,12 @@ def within_namespace
8975

9076
result
9177
end
78+
79+
def get_or_set(setting, key, value)
80+
return setting[key] if value.nil?
81+
82+
setting[key] = value
83+
end
9284
end
9385
end
9486
end

spec/grape/dsl/logger_spec.rb

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,7 @@
44
let(:dummy_logger) do
55
Class.new do
66
extend Grape::DSL::Logger
7-
def self.global_setting(key, value = nil)
8-
if value
9-
global_setting_hash[key] = value
10-
else
11-
global_setting_hash[key]
12-
end
13-
end
14-
15-
def self.global_setting_hash
16-
@global_setting_hash ||= {}
17-
end
7+
extend Grape::DSL::Settings
188
end
199
end
2010

spec/grape/dsl/settings_spec.rb

Lines changed: 13 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -15,47 +15,29 @@ def reset_validations!; end
1515
end
1616
end
1717

18-
describe '#get_or_set' do
19-
it 'sets a values' do
20-
subject.get_or_set :namespace, :dummy, 1
21-
expect(subject.namespace_setting(:dummy)).to eq 1
22-
end
23-
24-
it 'returns a value when nil is new value is provided' do
25-
subject.get_or_set :namespace, :dummy, 1
26-
expect(subject.get_or_set(:namespace, :dummy, nil)).to eq 1
27-
end
28-
end
29-
3018
describe '#global_setting' do
31-
it 'delegates to get_or_set' do
32-
expect(subject).to receive(:get_or_set).with(:global, :dummy, 1)
33-
subject.global_setting(:dummy, 1)
19+
it 'sets a value globally' do
20+
subject.global_setting :some_thing, :foo_bar
21+
expect(subject.global_setting(:some_thing)).to eq :foo_bar
22+
subject.with_namespace do
23+
subject.global_setting :some_thing, :foo_bar_baz
24+
expect(subject.global_setting(:some_thing)).to eq :foo_bar_baz
25+
end
26+
expect(subject.global_setting(:some_thing)).to eq(:foo_bar_baz)
3427
end
3528
end
3629

3730
describe '#route_setting' do
38-
it 'delegates to get_or_set' do
39-
expect(subject).to receive(:get_or_set).with(:route, :dummy, 1)
40-
subject.route_setting(:dummy, 1)
41-
end
42-
43-
it 'sets a value until the next route' do
44-
subject.route_setting :some_thing, :foo_bar
45-
expect(subject.route_setting(:some_thing)).to eq :foo_bar
46-
47-
subject.inheritable_setting.route_end
48-
31+
it 'sets a value until the end of a namespace' do
32+
subject.with_namespace do
33+
subject.route_setting :some_thing, :foo_bar
34+
expect(subject.route_setting(:some_thing)).to eq :foo_bar
35+
end
4936
expect(subject.route_setting(:some_thing)).to be_nil
5037
end
5138
end
5239

5340
describe '#namespace_setting' do
54-
it 'delegates to get_or_set' do
55-
expect(subject).to receive(:get_or_set).with(:namespace, :dummy, 1)
56-
subject.namespace_setting(:dummy, 1)
57-
end
58-
5941
it 'sets a value until the end of a namespace' do
6042
subject.with_namespace do
6143
subject.namespace_setting :some_thing, :foo_bar
@@ -78,11 +60,6 @@ def reset_validations!; end
7860
end
7961

8062
describe '#namespace_inheritable' do
81-
it 'delegates to get_or_set' do
82-
expect(subject).to receive(:get_or_set).with(:namespace_inheritable, :dummy, 1)
83-
subject.namespace_inheritable(:dummy, 1)
84-
end
85-
8663
it 'inherits values from surrounding namespace' do
8764
subject.with_namespace do
8865
subject.namespace_inheritable(:some_thing, :foo_bar)
@@ -98,11 +75,6 @@ def reset_validations!; end
9875
end
9976

10077
describe '#namespace_stackable' do
101-
it 'delegates to get_or_set' do
102-
expect(subject).to receive(:get_or_set).with(:namespace_stackable, :dummy, 1)
103-
subject.namespace_stackable(:dummy, 1)
104-
end
105-
10678
it 'stacks values from surrounding namespace' do
10779
subject.with_namespace do
10880
subject.namespace_stackable(:some_thing, :foo_bar)

0 commit comments

Comments
 (0)