/
main.rb
81 lines (78 loc) · 1.73 KB
/
main.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
class Object
def dot_get(str)
str = str.split(".") if str.is_a?(String)
res = self
last_f = last_res = nil
str.each do |f|
if f.num? && !res.kind_of?(Array)
last_res[last_f] = res = []
end
last_res = res
if res.kind_of?(Array)
temp = res[f.safe_to_i]
if !temp
res << {}
temp = res.last
raise "can only add new row at end" unless res.size-1 == f.safe_to_i
end
res = temp
else
res = res[f]
end
last_f = f
end
res
end
def dot_set(str,val=nil,&b)
mylog 'dot_set', :k => str, :v => val, :block_given => block_given?, :self => self
KeyParts.with_parts(str) do |first,lst,mult|
return self[str] = val unless mult
obj = dot_get(first)
return obj unless obj
obj.nested_set(lst,val,&b)
end
end
end
class Object
def nested_set(k,v=nil,&b)
mylog 'dot_set', :context => 'nested_set', :k => k, :v => v, :block_given => block_given?, :self => self
v = yield(self) if block_given?
v = v.tmo if v.respond_to?(:tmo)
self[k] = v
self.delete(k) unless v.present?
v
end
end
module ArrayMod
def nested_set(k,v=nil)
each do |x|
v = yield(x) if block_given?
x.nested_set(k,v)
end
end
end
[Array,ArrayWrapper].each { |cls| cls.send(:include,ArrayMod) }
class String
def num?
size > 0 && self =~ /^[\d\.]*$/
end
def date?
matches = (self =~ /\/\d+\//) || (self =~ /-\d+-/)
matches2 = self =~ /^[ \d\-\/:]+$/
!!(matches && matches2 && Time.parse(self))
rescue
return false
end
def to_time
Time.parse(self)
end
def tmo
if num?
to_f.tmo
elsif blank?
nil
else
self
end
end
end