ruby_ext 0.4.12 → 0.4.13
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.
- data/Rakefile +1 -1
- data/lib/rake_ext.rb +14 -0
- data/lib/rspec_ext.rb +29 -8
- data/lib/ruby_ext/core/array.rb +2 -0
- data/lib/ruby_ext/core/false_class.rb +3 -0
- data/lib/ruby_ext/core/hash.rb +1 -0
- data/lib/ruby_ext/core/module.rb +6 -0
- data/lib/ruby_ext/core/nil_class.rb +3 -0
- data/lib/ruby_ext/core/open_object.rb +17 -13
- data/lib/ruby_ext/core/string.rb +2 -0
- data/lib/ruby_ext/core/symbol.rb +2 -0
- data/lib/ruby_ext/core/true_class.rb +3 -0
- data/lib/ruby_ext/core.rb +1 -0
- data/lib/ruby_ext/more/safe_hash.rb +19 -56
- data/spec/more/safe_hash_spec.rb +19 -51
- metadata +5 -2
data/Rakefile
CHANGED
data/lib/rake_ext.rb
CHANGED
@@ -1,6 +1,20 @@
|
|
1
1
|
require 'rake'
|
2
2
|
require 'fileutils'
|
3
3
|
|
4
|
+
#
|
5
|
+
# Code Coverage
|
6
|
+
#
|
7
|
+
begin
|
8
|
+
require 'class_loader/tasks'
|
9
|
+
rescue LoadError
|
10
|
+
end
|
11
|
+
desc "Clean temporary files"
|
12
|
+
task clean: 'class_loader:clean' do
|
13
|
+
require 'fileutils'
|
14
|
+
FileUtils.rm_r '../*/coverage' if File.exist? '../*/coverage'
|
15
|
+
end
|
16
|
+
|
17
|
+
|
4
18
|
#
|
5
19
|
# Spec
|
6
20
|
#
|
data/lib/rspec_ext.rb
CHANGED
@@ -1,3 +1,21 @@
|
|
1
|
+
#
|
2
|
+
# Code Coverage
|
3
|
+
#
|
4
|
+
# require 'simplecov'
|
5
|
+
# SimpleCov.start do
|
6
|
+
# add_filter "/spec/"
|
7
|
+
# end
|
8
|
+
# SimpleCov.at_exit do
|
9
|
+
# SimpleCov.result.format!
|
10
|
+
# Kernel.exec 'open ./coverage/index.html'
|
11
|
+
# end
|
12
|
+
#
|
13
|
+
# CLASS_LOADER_GENERATE_TMP_FILES = true
|
14
|
+
|
15
|
+
|
16
|
+
#
|
17
|
+
# Rspec
|
18
|
+
#
|
1
19
|
require 'rspec'
|
2
20
|
require 'fileutils'
|
3
21
|
|
@@ -22,15 +40,18 @@ rspec do
|
|
22
40
|
end
|
23
41
|
|
24
42
|
rspec do
|
25
|
-
def self.with_load_path *
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
43
|
+
def self.with_load_path *paths
|
44
|
+
before(:all){paths.each{|path| $LOAD_PATH << path}}
|
45
|
+
after(:all){paths.each{|path| $LOAD_PATH.delete path}}
|
46
|
+
end
|
47
|
+
|
48
|
+
def with_load_path *paths, &b
|
49
|
+
begin
|
50
|
+
paths.each{|path| $LOAD_PATH << path}
|
51
|
+
b.call
|
52
|
+
ensure
|
53
|
+
paths.each{|path| $LOAD_PATH.delete path}
|
30
54
|
end
|
31
|
-
|
32
|
-
before(:all){list.each{|path| $LOAD_PATH << path}}
|
33
|
-
after(:all){list.each{|path| $LOAD_PATH.delete path}}
|
34
55
|
end
|
35
56
|
|
36
57
|
def self.with_tmp_spec_dir *args
|
data/lib/ruby_ext/core/array.rb
CHANGED
data/lib/ruby_ext/core/hash.rb
CHANGED
data/lib/ruby_ext/core/module.rb
CHANGED
@@ -126,5 +126,11 @@ Module.class_eval do
|
|
126
126
|
m.to_sym
|
127
127
|
end
|
128
128
|
|
129
|
+
def require_attr *attrs
|
130
|
+
attrs.each do |attr|
|
131
|
+
define_method(attr){instance_variable_get(:"@#{attr}") || raise("key :#{attr} not defined!")}
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
129
135
|
public :include, :define_method
|
130
136
|
end
|
@@ -108,6 +108,22 @@ class OpenObject < Hash
|
|
108
108
|
def respond_to? m
|
109
109
|
true
|
110
110
|
end
|
111
|
+
|
112
|
+
def self.initialize_from hash, deep = false
|
113
|
+
unless deep
|
114
|
+
::OpenObject.new.update hash
|
115
|
+
else
|
116
|
+
r = ::OpenObject.new
|
117
|
+
hash.each do |k, v|
|
118
|
+
r[k] = if v.is_a? Hash
|
119
|
+
v.to_openobject
|
120
|
+
else
|
121
|
+
v
|
122
|
+
end
|
123
|
+
end
|
124
|
+
r
|
125
|
+
end
|
126
|
+
end
|
111
127
|
|
112
128
|
protected
|
113
129
|
def method_missing m, arg = nil, &block
|
@@ -137,19 +153,7 @@ end
|
|
137
153
|
|
138
154
|
class Hash
|
139
155
|
def to_openobject deep = false
|
140
|
-
|
141
|
-
OpenObject.new.update self
|
142
|
-
else
|
143
|
-
r = OpenObject.new
|
144
|
-
each do |k, v|
|
145
|
-
r[k] = if v.is_a? Hash
|
146
|
-
v.to_openobject
|
147
|
-
else
|
148
|
-
v
|
149
|
-
end
|
150
|
-
end
|
151
|
-
r
|
152
|
-
end
|
156
|
+
OpenObject.initialize_from self, deep
|
153
157
|
end
|
154
158
|
alias_method :to_oo, :to_openobject
|
155
159
|
|
data/lib/ruby_ext/core/string.rb
CHANGED
data/lib/ruby_ext/core/symbol.rb
CHANGED
data/lib/ruby_ext/core.rb
CHANGED
@@ -10,16 +10,15 @@ class SafeHash < BasicObject
|
|
10
10
|
end
|
11
11
|
|
12
12
|
def []= key, value
|
13
|
-
::SafeHash.forbidden! key
|
14
|
-
# value = ::SafeHash.new value if value.is_a? ::Hash
|
15
|
-
# @hash[key.to_sym] = value
|
16
|
-
end
|
17
|
-
|
18
|
-
def set! key, value
|
19
13
|
value = ::SafeHash.new value if value.is_a? ::Hash
|
20
14
|
@hash[key.to_sym] = value
|
21
15
|
end
|
22
|
-
|
16
|
+
|
17
|
+
# def set! key, value
|
18
|
+
# value = ::SafeHash.new value if value.is_a? ::Hash
|
19
|
+
# @hash[key.to_sym] = value
|
20
|
+
# end
|
21
|
+
# def set *args; raise "you probably mistyped :set! method!" end
|
23
22
|
|
24
23
|
def include? key
|
25
24
|
@hash.include? key.to_sym
|
@@ -68,8 +67,7 @@ class SafeHash < BasicObject
|
|
68
67
|
raise "invalid usage, can't pass block to (:#{m})!" if b
|
69
68
|
last = m[-1]
|
70
69
|
if last == '='
|
71
|
-
|
72
|
-
# self[m[0..-2]] = obj
|
70
|
+
self[m[0..-2]] = obj
|
73
71
|
else
|
74
72
|
self[m, obj]
|
75
73
|
end
|
@@ -87,42 +85,6 @@ class SafeHash < BasicObject
|
|
87
85
|
@hash.delete key.to_sym
|
88
86
|
end
|
89
87
|
|
90
|
-
def merge! hash, options = {}
|
91
|
-
# parsing arguments
|
92
|
-
deep = options[:deep] || true
|
93
|
-
override = options[:override] || false
|
94
|
-
blank = options[:blank] || false
|
95
|
-
options.validate_options! :deep, :override, :blank
|
96
|
-
raise "invalid options, can't do both :blank and :override simultaneously!" if blank and override
|
97
|
-
|
98
|
-
# merging
|
99
|
-
hash.each do |k, v|
|
100
|
-
k = k.to_sym
|
101
|
-
if @hash.include? k
|
102
|
-
if deep and (old_v = @hash[k]).respond_to(:is_a_safe_hash?) and v.is_a?(::Hash)
|
103
|
-
old_v.merge! v, options
|
104
|
-
else
|
105
|
-
if blank
|
106
|
-
# do nothing
|
107
|
-
elsif override
|
108
|
-
self.set! k, v
|
109
|
-
else
|
110
|
-
raise "can't override :#{k} config value!" unless override
|
111
|
-
end
|
112
|
-
end
|
113
|
-
else
|
114
|
-
self.set! k, v
|
115
|
-
end
|
116
|
-
end
|
117
|
-
end
|
118
|
-
def merge *args; raise "you probably mistyped :merge! method!" end
|
119
|
-
|
120
|
-
def merge_if_blank! hash, options = {}
|
121
|
-
options[:blank] = true
|
122
|
-
merge! hash, options
|
123
|
-
end
|
124
|
-
def merge_if_blank *args; raise "you probably mistyped :merge_if_blank method!" end
|
125
|
-
|
126
88
|
# deep conversion, check and converts nested SafeHashes to Hashes
|
127
89
|
def to_hash options = {}
|
128
90
|
r = {}
|
@@ -141,6 +103,16 @@ class SafeHash < BasicObject
|
|
141
103
|
def is_a_safe_hash?
|
142
104
|
true
|
143
105
|
end
|
106
|
+
|
107
|
+
protected
|
108
|
+
def reinitialize hash
|
109
|
+
@hash = {}
|
110
|
+
hash.each do |k, v|
|
111
|
+
v = ::SafeHash.new v if v.is_a? ::Hash
|
112
|
+
@hash[k.to_sym] = v
|
113
|
+
end
|
114
|
+
@hash
|
115
|
+
end
|
144
116
|
|
145
117
|
|
146
118
|
class SafeNil < BasicObject
|
@@ -167,8 +139,7 @@ class SafeHash < BasicObject
|
|
167
139
|
raise "invalid usage, can't pass block to (:#{m})!" if b
|
168
140
|
last = m[-1]
|
169
141
|
if last == '='
|
170
|
-
|
171
|
-
# raise "No key '#{@key}'!"
|
142
|
+
raise "no key '#{@key}'!"
|
172
143
|
else
|
173
144
|
self[m, if_not_exist]
|
174
145
|
end
|
@@ -197,15 +168,7 @@ class SafeHash < BasicObject
|
|
197
168
|
def inspect
|
198
169
|
nil.inspect
|
199
170
|
end
|
200
|
-
end
|
201
|
-
|
202
|
-
|
203
|
-
class << self
|
204
|
-
def forbidden! key
|
205
|
-
raise "direct modifications of SafeHash is forbidden, use :merge instead (you are trying to assign :#{key} value)!"
|
206
|
-
end
|
207
|
-
end
|
208
|
-
|
171
|
+
end
|
209
172
|
|
210
173
|
protected
|
211
174
|
def p *a
|
data/spec/more/safe_hash_spec.rb
CHANGED
@@ -27,15 +27,15 @@ describe "SafeHash and SafeNil" do
|
|
27
27
|
h.v!.should == nil
|
28
28
|
end
|
29
29
|
|
30
|
-
it "should
|
30
|
+
it "should modify hash" do
|
31
31
|
h = SafeHash.new
|
32
|
-
|
33
|
-
|
34
|
-
|
32
|
+
h.a = 1
|
33
|
+
h.a!.should == 1
|
34
|
+
h[:b] = 1
|
35
|
+
h.b!.should == 1
|
36
|
+
lambda{h.c.d = 1}.should raise_error(/no key/)
|
35
37
|
end
|
36
38
|
|
37
|
-
it "should not allo"
|
38
|
-
|
39
39
|
# it "should allow owerride values" do
|
40
40
|
# h = SafeHash.new a: :b
|
41
41
|
# h.b = :c
|
@@ -76,12 +76,12 @@ describe "SafeHash and SafeNil" do
|
|
76
76
|
lambda{h.j.b.c!}.should raise_error(/no key :c/)
|
77
77
|
end
|
78
78
|
|
79
|
-
it "should be able to update itself" do
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
end
|
79
|
+
# it "should be able to update itself" do
|
80
|
+
# h = SafeHash.new
|
81
|
+
# h.b?.should be_false
|
82
|
+
# h.merge! a: :a
|
83
|
+
# h.a!.should == :a
|
84
|
+
# end
|
85
85
|
|
86
86
|
it "should implement include?" do
|
87
87
|
h = SafeHash.new a: :b
|
@@ -90,44 +90,12 @@ describe "SafeHash and SafeNil" do
|
|
90
90
|
h.include?(:b).should be_false
|
91
91
|
|
92
92
|
h.b.include?(:a).should be_false
|
93
|
-
end
|
93
|
+
end
|
94
94
|
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
it "should skip existing if specified" do
|
102
|
-
h = SafeHash.new a: :b
|
103
|
-
h.merge!({a: :c, d: :e}, blank: true)
|
104
|
-
h.a!.should == :b
|
105
|
-
h.d!.should == :e
|
106
|
-
end
|
107
|
-
|
108
|
-
it "merging hashes should not be countig as overriding" do
|
109
|
-
h = SafeHash.new b: {c: :d}
|
110
|
-
h.merge! b: {e: :f}, override: false
|
111
|
-
end
|
112
|
-
|
113
|
-
it "should override if specified" do
|
114
|
-
h = SafeHash.new a: {b: :c}
|
115
|
-
h.merge!({a: {b: :c2}}, override: true)
|
116
|
-
h.a!.b!.should == :c2
|
117
|
-
end
|
118
|
-
|
119
|
-
it "should perform deep merge by default" do
|
120
|
-
h = SafeHash.new a: {b: {c: :d}}
|
121
|
-
h.merge!({a: {b: {c2: :d2}}})
|
122
|
-
h.a!.b!.c?.should be_true
|
123
|
-
h.a!.b!.c2?.should be_true
|
124
|
-
end
|
125
|
-
end
|
126
|
-
|
127
|
-
it "merge_if_blank" do
|
128
|
-
h = SafeHash.new a: :b
|
129
|
-
h.merge_if_blank! a: :c, d: :e
|
130
|
-
h.a!.should == :b
|
131
|
-
h.d!.should == :e
|
132
|
-
end
|
95
|
+
# it "merge_if_blank" do
|
96
|
+
# h = SafeHash.new a: :b
|
97
|
+
# h.merge_if_blank! a: :c, d: :e
|
98
|
+
# h.a!.should == :b
|
99
|
+
# h.d!.should == :e
|
100
|
+
# end
|
133
101
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby_ext
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.13
|
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: 2011-
|
12
|
+
date: 2011-07-02 00:00:00.000000000 +04:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
description:
|
@@ -28,6 +28,7 @@ files:
|
|
28
28
|
- lib/ruby_ext/core/class.rb
|
29
29
|
- lib/ruby_ext/core/deep_clone.rb
|
30
30
|
- lib/ruby_ext/core/enumerable.rb
|
31
|
+
- lib/ruby_ext/core/false_class.rb
|
31
32
|
- lib/ruby_ext/core/file.rb
|
32
33
|
- lib/ruby_ext/core/hash.rb
|
33
34
|
- lib/ruby_ext/core/kernel.rb
|
@@ -35,11 +36,13 @@ files:
|
|
35
36
|
- lib/ruby_ext/core/module.rb
|
36
37
|
- lib/ruby_ext/core/multiple_inheritance.rb
|
37
38
|
- lib/ruby_ext/core/must.rb
|
39
|
+
- lib/ruby_ext/core/nil_class.rb
|
38
40
|
- lib/ruby_ext/core/not_defined.rb
|
39
41
|
- lib/ruby_ext/core/object.rb
|
40
42
|
- lib/ruby_ext/core/open_object.rb
|
41
43
|
- lib/ruby_ext/core/string.rb
|
42
44
|
- lib/ruby_ext/core/symbol.rb
|
45
|
+
- lib/ruby_ext/core/true_class.rb
|
43
46
|
- lib/ruby_ext/core.rb
|
44
47
|
- lib/ruby_ext/fixes.rb
|
45
48
|
- lib/ruby_ext/gems.rb
|