chozo 0.3.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/chozo.rb +9 -0
- data/lib/chozo/config/abstract.rb +0 -14
- data/lib/chozo/config/json.rb +4 -15
- data/lib/chozo/core_ext/hash/dotted_paths.rb +3 -1
- data/lib/chozo/varia_model.rb +43 -0
- data/lib/chozo/version.rb +1 -1
- data/spec/spec_helper.rb +4 -0
- data/spec/unit/chozo/core_ext/{hash_spec.rb → hash/dotted_paths_spec.rb} +17 -0
- data/spec/unit/chozo/varia_model_spec.rb +118 -0
- metadata +5 -5
data/lib/chozo.rb
CHANGED
@@ -5,6 +5,15 @@ module Chozo
|
|
5
5
|
autoload :Platform, 'chozo/platform'
|
6
6
|
autoload :RubyEngine, 'chozo/ruby_engine'
|
7
7
|
autoload :VariaModel, 'chozo/varia_model'
|
8
|
+
|
9
|
+
class << self
|
10
|
+
# Path to the root directory of the Chozo application
|
11
|
+
#
|
12
|
+
# @return [Pathname]
|
13
|
+
def app_root
|
14
|
+
@app_root ||= Pathname.new(File.expand_path('../', File.dirname(__FILE__)))
|
15
|
+
end
|
16
|
+
end
|
8
17
|
end
|
9
18
|
|
10
19
|
require 'chozo/core_ext'
|
@@ -22,23 +22,9 @@ module Chozo
|
|
22
22
|
mass_assign(attributes)
|
23
23
|
end
|
24
24
|
|
25
|
-
def [](key)
|
26
|
-
self.attributes[key]
|
27
|
-
end
|
28
|
-
|
29
|
-
def []=(key, value)
|
30
|
-
self.attributes[key] = value
|
31
|
-
end
|
32
|
-
|
33
25
|
def to_hash
|
34
26
|
self.attributes.to_hash.deep_symbolize_keys
|
35
27
|
end
|
36
|
-
|
37
|
-
protected
|
38
|
-
|
39
|
-
def mass_assign(new_attributes = {})
|
40
|
-
attributes.deep_merge!(new_attributes)
|
41
|
-
end
|
42
28
|
end
|
43
29
|
end
|
44
30
|
end
|
data/lib/chozo/config/json.rb
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
require 'chozo/errors'
|
2
|
-
require 'multi_json'
|
3
2
|
|
4
3
|
module Chozo
|
5
4
|
module Config
|
@@ -27,23 +26,13 @@ module Chozo
|
|
27
26
|
end
|
28
27
|
end
|
29
28
|
|
30
|
-
# @
|
31
|
-
#
|
32
|
-
# @return [String]
|
33
|
-
def to_json(options = {})
|
34
|
-
MultiJson.encode(self.attributes, options)
|
35
|
-
end
|
36
|
-
alias_method :as_json, :to_json
|
37
|
-
|
38
|
-
# @param (see MultiJson.decode) json
|
39
|
-
# @param (see MultiJson.decode) options
|
29
|
+
# @see {VariaModel#from_json}
|
40
30
|
#
|
41
31
|
# @raise [Chozo::Errors::InvalidConfig]
|
42
32
|
#
|
43
|
-
# @return [
|
44
|
-
def from_json(
|
45
|
-
|
46
|
-
self
|
33
|
+
# @return [Chozo::Config::JSON]
|
34
|
+
def from_json(*args)
|
35
|
+
super
|
47
36
|
rescue MultiJson::DecodeError => e
|
48
37
|
raise Chozo::Errors::InvalidConfig, e
|
49
38
|
end
|
@@ -77,6 +77,8 @@ class Hash
|
|
77
77
|
#
|
78
78
|
# @return [Object, nil]
|
79
79
|
def dig(path)
|
80
|
+
return nil unless path.present?
|
81
|
+
|
80
82
|
parts = path.split('.', 2)
|
81
83
|
match = (self[parts[0].to_s] || self[parts[0].to_sym])
|
82
84
|
if !parts[1] or match.nil?
|
@@ -95,7 +97,7 @@ class Hash
|
|
95
97
|
#
|
96
98
|
# @return [Array<String>]
|
97
99
|
def dotted_paths(source = self, acc = Array.new, namespace = Array.new)
|
98
|
-
if source.is_a?(Hash)
|
100
|
+
if source.is_a?(Hash) && !source.empty?
|
99
101
|
source.each do |key, value|
|
100
102
|
branch = namespace.dup
|
101
103
|
branch << key
|
data/lib/chozo/varia_model.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'multi_json'
|
1
2
|
require 'chozo/core_ext'
|
2
3
|
require 'chozo/hashie_ext'
|
3
4
|
|
@@ -170,18 +171,60 @@ module Chozo
|
|
170
171
|
@errors ||= HashWithIndifferentAccess.new
|
171
172
|
end
|
172
173
|
|
174
|
+
def mass_assign(new_attrs = {})
|
175
|
+
attributes.dotted_paths.each do |dotted_path|
|
176
|
+
value = new_attrs.dig(dotted_path)
|
177
|
+
next if value.nil?
|
178
|
+
|
179
|
+
set_attribute(dotted_path, value)
|
180
|
+
end
|
181
|
+
end
|
182
|
+
alias_method :attributes=, :mass_assign
|
183
|
+
|
173
184
|
# @param [#to_s] key
|
174
185
|
#
|
175
186
|
# @return [Object]
|
176
187
|
def get_attribute(key)
|
177
188
|
self.attributes.dig(key.to_s)
|
178
189
|
end
|
190
|
+
alias_method :[], :get_attribute
|
179
191
|
|
180
192
|
# @param [#to_s] key
|
181
193
|
# @param [Object] value
|
182
194
|
def set_attribute(key, value)
|
183
195
|
self.attributes.deep_merge!(attributes.class.from_dotted_path(key.to_s, value))
|
184
196
|
end
|
197
|
+
alias_method :[]=, :set_attribute
|
198
|
+
|
199
|
+
# @param [#to_hash] hash
|
200
|
+
#
|
201
|
+
# @return [self]
|
202
|
+
def from_hash(hash)
|
203
|
+
mass_assign(hash.to_hash)
|
204
|
+
self
|
205
|
+
end
|
206
|
+
|
207
|
+
# @param [String] data
|
208
|
+
#
|
209
|
+
# @return [self]
|
210
|
+
def from_json(data)
|
211
|
+
mass_assign(MultiJson.decode(data))
|
212
|
+
self
|
213
|
+
end
|
214
|
+
|
215
|
+
# @return [Hash]
|
216
|
+
def to_hash
|
217
|
+
self.attributes
|
218
|
+
end
|
219
|
+
|
220
|
+
# @option options [Boolean] :symbolize_keys
|
221
|
+
# @option options [Class, Symbol, String] :adapter
|
222
|
+
#
|
223
|
+
# @return [String]
|
224
|
+
def to_json(options = {})
|
225
|
+
MultiJson.encode(self.attributes, options)
|
226
|
+
end
|
227
|
+
alias_method :as_json, :to_json
|
185
228
|
|
186
229
|
protected
|
187
230
|
|
data/lib/chozo/version.rb
CHANGED
data/spec/spec_helper.rb
CHANGED
@@ -73,6 +73,10 @@ describe Hash do
|
|
73
73
|
subject.dig("we.found.something").should eql(:symbol_value)
|
74
74
|
end
|
75
75
|
end
|
76
|
+
|
77
|
+
it "returns nil if given a blank string" do
|
78
|
+
subject.dig("").should be_nil
|
79
|
+
end
|
76
80
|
end
|
77
81
|
|
78
82
|
describe "#dotted_paths" do
|
@@ -93,6 +97,19 @@ describe Hash do
|
|
93
97
|
end
|
94
98
|
end
|
95
99
|
|
100
|
+
context "given a hash with empty hashes as values" do
|
101
|
+
subject do
|
102
|
+
{
|
103
|
+
"one" => Hash.new,
|
104
|
+
"two" => Hash.new
|
105
|
+
}
|
106
|
+
end
|
107
|
+
|
108
|
+
it "returns an array of the top level keys as strings" do
|
109
|
+
subject.dotted_paths.should eql(["one", "two"])
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
96
113
|
context "given a hash with nested keys" do
|
97
114
|
subject do
|
98
115
|
{
|
@@ -451,4 +451,122 @@ describe Chozo::VariaModel do
|
|
451
451
|
subject.get_attribute('brooke.costantini').should be_nil
|
452
452
|
end
|
453
453
|
end
|
454
|
+
|
455
|
+
describe "#mass_assign" do
|
456
|
+
subject do
|
457
|
+
Class.new do
|
458
|
+
include Chozo::VariaModel
|
459
|
+
|
460
|
+
attribute 'brooke.winsor', type: String, default: 'sister'
|
461
|
+
attribute 'jamie.winsor', type: String, default: 'brother'
|
462
|
+
attribute 'gizmo', type: String, default: 'dog'
|
463
|
+
end.new
|
464
|
+
end
|
465
|
+
|
466
|
+
it "sets the values of all matching defined attributes" do
|
467
|
+
new_attrs = {
|
468
|
+
brooke: {
|
469
|
+
winsor: "other"
|
470
|
+
},
|
471
|
+
jamie: {
|
472
|
+
winsor: "other_two"
|
473
|
+
}
|
474
|
+
}
|
475
|
+
|
476
|
+
subject.mass_assign(new_attrs)
|
477
|
+
subject.brooke.winsor.should eql("other")
|
478
|
+
subject.jamie.winsor.should eql("other_two")
|
479
|
+
end
|
480
|
+
|
481
|
+
it "leaves the values of untouched attributes" do
|
482
|
+
new_attrs = {
|
483
|
+
brooke: {
|
484
|
+
winsor: "other"
|
485
|
+
},
|
486
|
+
jamie: {
|
487
|
+
winsor: "other_two"
|
488
|
+
}
|
489
|
+
}
|
490
|
+
|
491
|
+
subject.mass_assign(new_attrs)
|
492
|
+
subject.gizmo.should eql("dog")
|
493
|
+
end
|
494
|
+
|
495
|
+
it "ignores values which are not defined attributes" do
|
496
|
+
new_attrs = {
|
497
|
+
undefined_attribute: "value"
|
498
|
+
}
|
499
|
+
|
500
|
+
subject.mass_assign(new_attrs)
|
501
|
+
subject.should_not respond_to(:undefined_attribute)
|
502
|
+
end
|
503
|
+
end
|
504
|
+
|
505
|
+
describe "#from_json" do
|
506
|
+
subject do
|
507
|
+
Class.new do
|
508
|
+
include Chozo::VariaModel
|
509
|
+
|
510
|
+
attribute 'first_name', type: String
|
511
|
+
attribute 'nick', type: String
|
512
|
+
end.new
|
513
|
+
end
|
514
|
+
|
515
|
+
it "returns self" do
|
516
|
+
subject.from_json(MultiJson.encode(first_name: "jamie", nick: "reset")).should be_a(described_class)
|
517
|
+
end
|
518
|
+
|
519
|
+
it "updates self from JSON data" do
|
520
|
+
subject.from_json(MultiJson.encode(first_name: "jamie", nick: "reset"))
|
521
|
+
|
522
|
+
subject.first_name.should eql("jamie")
|
523
|
+
subject.nick.should eql("reset")
|
524
|
+
end
|
525
|
+
end
|
526
|
+
|
527
|
+
describe "#from_hash" do
|
528
|
+
subject do
|
529
|
+
Class.new do
|
530
|
+
include Chozo::VariaModel
|
531
|
+
|
532
|
+
attribute 'first_name', type: String
|
533
|
+
attribute 'nick', type: String
|
534
|
+
end.new
|
535
|
+
end
|
536
|
+
|
537
|
+
it "returns self" do
|
538
|
+
subject.from_hash(first_name: "jamie", nick: "reset").should be_a(described_class)
|
539
|
+
end
|
540
|
+
|
541
|
+
it "updates and returns self from a Hash" do
|
542
|
+
subject.from_hash(first_name: "jamie", nick: "reset")
|
543
|
+
|
544
|
+
subject.first_name.should eql("jamie")
|
545
|
+
subject.nick.should eql("reset")
|
546
|
+
end
|
547
|
+
end
|
548
|
+
|
549
|
+
describe "#to_json" do
|
550
|
+
subject do
|
551
|
+
Class.new do
|
552
|
+
include Chozo::VariaModel
|
553
|
+
|
554
|
+
attribute 'first_name', type: String
|
555
|
+
attribute 'nick', type: String
|
556
|
+
end.new
|
557
|
+
end
|
558
|
+
|
559
|
+
it "returns a JSON string containin the serialized attributes" do
|
560
|
+
subject.first_name = "brooke"
|
561
|
+
subject.nick = "leblanc"
|
562
|
+
|
563
|
+
subject.to_json.should eql(MultiJson.encode(first_name: "brooke", nick: "leblanc"))
|
564
|
+
end
|
565
|
+
end
|
566
|
+
|
567
|
+
describe "#to_hash" do
|
568
|
+
it "returns the attributes" do
|
569
|
+
subject.to_hash.should eql(subject.attributes)
|
570
|
+
end
|
571
|
+
end
|
454
572
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: chozo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2013-01-11 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activesupport
|
@@ -100,7 +100,7 @@ files:
|
|
100
100
|
- spec/support/matchers/each.rb
|
101
101
|
- spec/unit/chozo/config/abstract_spec.rb
|
102
102
|
- spec/unit/chozo/config/json_spec.rb
|
103
|
-
- spec/unit/chozo/core_ext/
|
103
|
+
- spec/unit/chozo/core_ext/hash/dotted_paths_spec.rb
|
104
104
|
- spec/unit/chozo/platform_spec.rb
|
105
105
|
- spec/unit/chozo/ruby_engine_spec.rb
|
106
106
|
- spec/unit/chozo/varia_model_spec.rb
|
@@ -125,7 +125,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
125
125
|
version: '0'
|
126
126
|
segments:
|
127
127
|
- 0
|
128
|
-
hash:
|
128
|
+
hash: -4510203401888880792
|
129
129
|
requirements: []
|
130
130
|
rubyforge_project:
|
131
131
|
rubygems_version: 1.8.23
|
@@ -139,7 +139,7 @@ test_files:
|
|
139
139
|
- spec/support/matchers/each.rb
|
140
140
|
- spec/unit/chozo/config/abstract_spec.rb
|
141
141
|
- spec/unit/chozo/config/json_spec.rb
|
142
|
-
- spec/unit/chozo/core_ext/
|
142
|
+
- spec/unit/chozo/core_ext/hash/dotted_paths_spec.rb
|
143
143
|
- spec/unit/chozo/platform_spec.rb
|
144
144
|
- spec/unit/chozo/ruby_engine_spec.rb
|
145
145
|
- spec/unit/chozo/varia_model_spec.rb
|