settingson 1.6.1 → 1.7.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/README.md +11 -8
- data/app/models/concerns/settingson/base.rb +1 -1
- data/lib/settingson/store.rb +55 -9
- data/lib/settingson/utils.rb +0 -0
- data/lib/settingson/version.rb +1 -1
- data/spec/models/settings_spec.rb +44 -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: 35ba5f07c92b264c30cc01ae57b5d27dccd3976e
|
4
|
+
data.tar.gz: 5a260c492f899e609313ffff799a3bf772747124
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 31ee2d331f97bf54a69da8892e32ca847e035443556754238f82df806593213c30e8dcd0f21a5028bbd9ea89401854c43882f759cd0eab9ae903208082b2b769
|
7
|
+
data.tar.gz: 292dc86a675178fd6aeba5365851e41bc3f8fc7b49fc09b4530e2578357ceb584ebd5012f7cce7e3b364e7e2e47f14585bb5524d7d639867da9216e85efcbb21
|
data/README.md
CHANGED
@@ -66,15 +66,21 @@ Settings.from_hash({hello: :world})
|
|
66
66
|
Settings.hello # => :world
|
67
67
|
Settings.hello? # => true
|
68
68
|
|
69
|
-
Settings.
|
70
|
-
Settings.
|
69
|
+
Settings[:greeting].welcome.message = 'Hello'
|
70
|
+
Settings[:greeting].welcome.message # => 'Hello'
|
71
|
+
Settings.greeting[:welcome].message # => 'Hello'
|
72
|
+
Settings.greeting.welcome[:message] # => 'Hello'
|
73
|
+
Settings.greeting.welcome['message'] # => 'Hello'
|
74
|
+
|
75
|
+
Settings.not_found.to_s # => ""
|
76
|
+
Settings.not_found.to_i # => 0
|
71
77
|
Settings.not_found.nil? # => true
|
72
78
|
Settings.not_found.empty? # => true
|
73
79
|
Settings.not_found.blank? # => true
|
74
80
|
Settings.not_found.present? # => false
|
75
81
|
|
76
82
|
# but
|
77
|
-
Settings.not_found.class # =>
|
83
|
+
Settings.not_found.class # => Settingson::Store
|
78
84
|
|
79
85
|
Settings.all # =>
|
80
86
|
# [#<Settings id: 1, key: "server.host", value: "127.0.0.1", created_at: "2015-12-08 15:17:56", updated_at: "2015-12-08 15:17:56">,
|
@@ -109,18 +115,15 @@ end
|
|
109
115
|
```
|
110
116
|
|
111
117
|
## The initial values
|
112
|
-
New way:
|
113
118
|
in config/initializers/settingson.rb
|
114
119
|
```ruby
|
115
120
|
Settings.defaults do |conf|
|
116
121
|
conf.server.smtp.host = 'host'
|
117
122
|
conf.server.smtp.port = 25
|
118
123
|
end
|
119
|
-
```
|
120
124
|
|
121
|
-
|
122
|
-
|
123
|
-
conf.server.smtp.port # => 25
|
125
|
+
Settings.server.smtp.host # => 'host'
|
126
|
+
Settings.server.smtp.port # => 25
|
124
127
|
```
|
125
128
|
|
126
129
|
## Contributing
|
@@ -53,7 +53,7 @@ module Settingson::Base
|
|
53
53
|
def method_missing(symbol, *args)
|
54
54
|
super
|
55
55
|
rescue NameError, NoMethodError
|
56
|
-
Settingson::Store.new(klass: self).send(symbol, args
|
56
|
+
Settingson::Store.new(klass: self).send(symbol, *args)
|
57
57
|
end
|
58
58
|
|
59
59
|
end # module ClassMethods
|
data/lib/settingson/store.rb
CHANGED
@@ -6,25 +6,30 @@ class Settingson::Store
|
|
6
6
|
end
|
7
7
|
|
8
8
|
def to_s
|
9
|
-
|
9
|
+
''
|
10
10
|
end
|
11
11
|
|
12
12
|
def to_i
|
13
|
-
|
13
|
+
0
|
14
14
|
end
|
15
15
|
|
16
16
|
def nil?
|
17
|
-
|
17
|
+
true
|
18
|
+
end
|
19
|
+
|
20
|
+
def to_a
|
21
|
+
[]
|
18
22
|
end
|
19
23
|
|
20
24
|
alias empty? nil?
|
25
|
+
alias to_ary to_a
|
21
26
|
|
22
27
|
def method_missing(symbol, *args)
|
23
|
-
__rescue_action(symbol.to_s, args
|
28
|
+
__rescue_action(symbol.to_s, args)
|
24
29
|
end # method_missing
|
25
30
|
|
26
31
|
protected
|
27
|
-
|
32
|
+
# TODO: move all methods to support class
|
28
33
|
def __debug(message)
|
29
34
|
message = sprintf("%s#%-32s: %s",
|
30
35
|
self.class.name,
|
@@ -34,12 +39,20 @@ class Settingson::Store
|
|
34
39
|
end
|
35
40
|
|
36
41
|
def __rescue_action(key, value)
|
42
|
+
__debug("key: #{key}:#{key.class} value: #{value}:#{value.class} " +
|
43
|
+
"path: '#{@__path}'")
|
37
44
|
case key
|
45
|
+
when '[]' # object reference
|
46
|
+
__debug("reference '#{value.first}'")
|
47
|
+
__get( __reference(value.first) )
|
48
|
+
when '[]=' # object reference setter
|
49
|
+
__debug("reference setter '#{value.first}' '#{value.last}'")
|
50
|
+
__set( __reference(value.first), value.last )
|
38
51
|
when /(.+)=/ # setter
|
39
|
-
__debug("set '#{$1}' value '#{value}'
|
40
|
-
__set($1, value)
|
41
|
-
else
|
42
|
-
__debug("get '#{key}'
|
52
|
+
__debug("set '#{$1}' value '#{value.first}'")
|
53
|
+
__set($1, value.first)
|
54
|
+
else # returns values or self
|
55
|
+
__debug("get '#{key}'")
|
43
56
|
__get(key)
|
44
57
|
end
|
45
58
|
end
|
@@ -68,6 +81,39 @@ class Settingson::Store
|
|
68
81
|
end
|
69
82
|
end
|
70
83
|
|
84
|
+
# @profile = Profile.first # any ActiveRecord::Base object
|
85
|
+
# Settings[@profile].some.host = 'value'
|
86
|
+
def __reference(key)
|
87
|
+
case key
|
88
|
+
when String
|
89
|
+
key
|
90
|
+
when Symbol
|
91
|
+
key.to_s
|
92
|
+
when ActiveRecord::Base
|
93
|
+
class_name = __underscore(key.class)
|
94
|
+
ref_id = __reference_id(key)
|
95
|
+
"#{class_name}_#{ref_id || 'new'}"
|
96
|
+
else
|
97
|
+
raise ArgumentError.new(
|
98
|
+
'String/Symbol/ActiveRecord::Base variable required'
|
99
|
+
)
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
def __underscore(camel_cased_word)
|
104
|
+
word = camel_cased_word.to_s.dup
|
105
|
+
word.gsub!(/::/, '_')
|
106
|
+
word.gsub!(/([A-Z]+)([A-Z][a-z])/, '\1_\2')
|
107
|
+
word.gsub!(/([a-z\d])([A-Z])/, '\1_\2')
|
108
|
+
word.tr!('-', '_')
|
109
|
+
word.downcase!
|
110
|
+
word
|
111
|
+
end
|
112
|
+
|
113
|
+
def __reference_id(key)
|
114
|
+
key.try(:to_key).try(:join, '_') || key.id
|
115
|
+
end
|
116
|
+
|
71
117
|
def __update_search_path(key)
|
72
118
|
@__path = [@__path, key].compact.join('.')
|
73
119
|
end
|
File without changes
|
data/lib/settingson/version.rb
CHANGED
@@ -42,8 +42,14 @@ describe Settings do
|
|
42
42
|
Settings.number = 100
|
43
43
|
expect( Settings.number ).to eq(100)
|
44
44
|
end
|
45
|
-
it '
|
45
|
+
it 'pass simple checks' do
|
46
|
+
expect( Settings.not_found.to_s ).to eq("")
|
46
47
|
expect( Settings.not_found.to_i ).to eq(0)
|
48
|
+
expect( Settings.not_found.to_a ).to eq([])
|
49
|
+
expect( Settings.not_found.nil? ).to eq(true)
|
50
|
+
expect( Settings.not_found.empty? ).to eq(true)
|
51
|
+
expect( Settings.not_found.blank? ).to eq(true)
|
52
|
+
expect( Settings.not_found.present? ).to eq(false)
|
47
53
|
end
|
48
54
|
it 'returns same String' do
|
49
55
|
word = Faker::Lorem.word
|
@@ -125,4 +131,41 @@ describe Settings do
|
|
125
131
|
end
|
126
132
|
end
|
127
133
|
|
134
|
+
describe '::[]' do
|
135
|
+
it 'raises error with unknown class' do
|
136
|
+
expect{ Settings[Time.new] }.to raise_error(ArgumentError)
|
137
|
+
end
|
138
|
+
it 'returns Settingson::Store instance' do
|
139
|
+
expect( Settings['hello'] ).to be_a(Settingson::Store)
|
140
|
+
end
|
141
|
+
it 'returns instance with search path "hello" for simple' do
|
142
|
+
settings = Settings['hello']
|
143
|
+
expect( settings.instance_variable_get(:@__path) ).to eq('hello')
|
144
|
+
end
|
145
|
+
it 'returns instance with search path "hello.message" for complex #1' do
|
146
|
+
settings = Settings[:hello].message
|
147
|
+
expect( settings.instance_variable_get(:@__path) ).to eq('hello.message')
|
148
|
+
end
|
149
|
+
|
150
|
+
it 'Settings[:say] form' do
|
151
|
+
Settings[:say] = 'hello'
|
152
|
+
expect( Settings.say ).to eq('hello')
|
153
|
+
end
|
154
|
+
it 'Settings[:say].hello == Settings.say[:hello]' do
|
155
|
+
Settings[:say].hello = 'hello'
|
156
|
+
expect( Settings.say[:hello] ).to eq('hello')
|
157
|
+
end
|
158
|
+
it 'works with complex check' do
|
159
|
+
Settings[:greeting].welcome.message = 'Hello'
|
160
|
+
expect( Settings[:greeting].welcome.message ).to eq('Hello')
|
161
|
+
expect( Settings.greeting[:welcome].message ).to eq('Hello')
|
162
|
+
expect( Settings.greeting.welcome[:message] ).to eq('Hello')
|
163
|
+
expect( Settings.greeting.welcome['message'] ).to eq('Hello')
|
164
|
+
end
|
165
|
+
it 'returns instance with search path "settings_1"' do
|
166
|
+
s = Settings.create(key: 'hello', value: 'world')
|
167
|
+
expect( Settings[s].instance_variable_get(:@__path) ).to eq("settings_1")
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
128
171
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: settingson
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- dan
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-09-
|
11
|
+
date: 2016-09-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -179,6 +179,7 @@ files:
|
|
179
179
|
- lib/settingson/config.rb
|
180
180
|
- lib/settingson/engine.rb
|
181
181
|
- lib/settingson/store.rb
|
182
|
+
- lib/settingson/utils.rb
|
182
183
|
- lib/settingson/version.rb
|
183
184
|
- settingson.gemspec
|
184
185
|
- spec/dummy/README.rdoc
|