Checked 1.2.3 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Checked.gemspec +1 -1
- data/lib/Checked/Arch.rb +63 -0
- data/lib/Checked/Ask/Arrays.rb +11 -12
- data/lib/Checked/Ask/Ask.rb +2 -13
- data/lib/Checked/Ask/Strings.rb +5 -21
- data/lib/Checked/Ask/Vars.rb +21 -13
- data/lib/Checked/Clean/Clean.rb +5 -33
- data/lib/Checked/Clean/Strings.rb +38 -36
- data/lib/Checked/DSL.rb +238 -0
- data/lib/Checked/Demand/Arrays.rb +37 -42
- data/lib/Checked/Demand/Bools.rb +14 -12
- data/lib/Checked/Demand/Demand.rb +4 -39
- data/lib/Checked/Demand/File_Paths.rb +22 -23
- data/lib/Checked/Demand/Hashs.rb +11 -16
- data/lib/Checked/Demand/Strings.rb +29 -34
- data/lib/Checked/Demand/Symbols.rb +11 -17
- data/lib/Checked/Demand/Vars.rb +68 -28
- data/lib/Checked/version.rb +4 -2
- data/lib/Checked.rb +49 -13
- data/spec/main.rb +7 -3
- data/spec/tests/Ask.rb +39 -48
- data/spec/tests/Clean.rb +14 -9
- data/spec/tests/DSL.rb +138 -19
- data/spec/tests/Demand.rb +64 -41
- metadata +13 -15
- data/lib/Checked/Base/Arch.rb +0 -33
- data/lib/Checked/Base/Base.rb +0 -108
- data/lib/Checked/Base/DSL.rb +0 -81
- data/lib/Checked/Base/DSL_Obj.rb +0 -35
data/Checked.gemspec
CHANGED
@@ -21,7 +21,7 @@ Gem::Specification.new do |s|
|
|
21
21
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
22
22
|
s.require_paths = ["lib"]
|
23
23
|
|
24
|
-
s.add_runtime_dependency "
|
24
|
+
s.add_runtime_dependency "Sin_Arch"
|
25
25
|
|
26
26
|
s.add_development_dependency 'rake'
|
27
27
|
s.add_development_dependency 'bacon'
|
data/lib/Checked/Arch.rb
ADDED
@@ -0,0 +1,63 @@
|
|
1
|
+
class Checked
|
2
|
+
|
3
|
+
module Arch
|
4
|
+
include DSL::Ruby
|
5
|
+
|
6
|
+
def self.included klass
|
7
|
+
klass.send :include, Sin_Arch::Arch
|
8
|
+
end
|
9
|
+
|
10
|
+
def target_name
|
11
|
+
request.env['target_name']
|
12
|
+
end
|
13
|
+
|
14
|
+
def original_target
|
15
|
+
request.env['original_target']
|
16
|
+
end
|
17
|
+
|
18
|
+
def matcher
|
19
|
+
@matcher ||= begin
|
20
|
+
m = args_hash['args'].first
|
21
|
+
if !m
|
22
|
+
raise Sin_Arch::Missing_Argument, "Missing argument for matcher."
|
23
|
+
end
|
24
|
+
m
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
#
|
29
|
+
# ::Checked::Demand::Arrays => demand
|
30
|
+
# ::Checked::Clean::Arrays => clean
|
31
|
+
# ::Checked::Ask::Arrays => ask
|
32
|
+
#
|
33
|
+
def purpose
|
34
|
+
@purpose ||= begin
|
35
|
+
temp = self.class.name.split('::')[-2]
|
36
|
+
(temp && temp.downcase) || raise("Unknown purpose")
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def strip_target
|
43
|
+
return! return!.strip
|
44
|
+
end
|
45
|
+
|
46
|
+
def not_empty_args!
|
47
|
+
not_empty! args_hash['args']
|
48
|
+
end
|
49
|
+
|
50
|
+
def fail! raw_msg
|
51
|
+
msg = if raw_msg['...'] == 0
|
52
|
+
raw_msg.sub '...', target_name
|
53
|
+
else
|
54
|
+
raw_msg
|
55
|
+
end
|
56
|
+
|
57
|
+
super(msg)
|
58
|
+
end
|
59
|
+
|
60
|
+
end # === module Arch
|
61
|
+
|
62
|
+
end # === module Checked
|
63
|
+
|
data/lib/Checked/Ask/Arrays.rb
CHANGED
@@ -1,28 +1,27 @@
|
|
1
1
|
|
2
2
|
|
3
|
-
|
3
|
+
class Checked
|
4
4
|
class Ask
|
5
|
-
class Arrays
|
5
|
+
class Arrays < Sinatra::Base
|
6
6
|
|
7
|
-
include
|
8
|
-
include Ask::Base
|
7
|
+
include Checked::Arch
|
9
8
|
|
10
|
-
|
9
|
+
map '/array!'
|
11
10
|
|
12
|
-
|
11
|
+
get
|
13
12
|
def symbols?
|
14
|
-
return false if
|
15
|
-
|
13
|
+
return false if return!.empty?
|
14
|
+
return!.all? { |val| val.is_a? Symbol }
|
16
15
|
end
|
17
16
|
|
18
|
-
|
17
|
+
get
|
19
18
|
def include?
|
20
|
-
|
19
|
+
return!.include?(*args_hash['args'])
|
21
20
|
end
|
22
21
|
|
23
|
-
|
22
|
+
get
|
24
23
|
def exclude?
|
25
|
-
!
|
24
|
+
!return!.include?(*args_hash['args'])
|
26
25
|
end
|
27
26
|
|
28
27
|
end # === class Arrays
|
data/lib/Checked/Ask/Ask.rb
CHANGED
@@ -1,21 +1,10 @@
|
|
1
1
|
|
2
|
-
|
2
|
+
class Checked
|
3
3
|
class Ask
|
4
|
-
module Base
|
5
|
-
|
6
|
-
include ::Checked::Base
|
7
|
-
|
8
|
-
def records
|
9
|
-
@records ||= []
|
10
|
-
end
|
11
|
-
|
12
|
-
private # ==============================
|
13
|
-
|
14
|
-
end # === module Base
|
15
4
|
|
16
5
|
def initialize *args
|
17
6
|
raise "Not allowed to use this Class directly."
|
18
7
|
end
|
19
8
|
|
20
9
|
end # === class Ask
|
21
|
-
end # ===
|
10
|
+
end # === class Checked
|
data/lib/Checked/Ask/Strings.rb
CHANGED
@@ -1,28 +1,12 @@
|
|
1
1
|
|
2
|
-
|
2
|
+
class Checked
|
3
3
|
class Ask
|
4
|
-
class Strings
|
4
|
+
class Strings < Sinatra::Base
|
5
5
|
|
6
|
-
include
|
7
|
-
include Ask::Base
|
6
|
+
include Checked::Arch
|
8
7
|
|
9
|
-
|
10
|
-
|
11
|
-
route
|
12
|
-
def empty?
|
13
|
-
target.strip.empty?
|
14
|
-
end
|
15
|
-
|
16
|
-
route
|
17
|
-
def include?
|
18
|
-
!!target[*args]
|
19
|
-
end
|
20
|
-
|
21
|
-
route
|
22
|
-
def exclude?
|
23
|
-
!target[*args]
|
24
|
-
end
|
8
|
+
map '/string!'
|
25
9
|
|
26
10
|
end # === class Strings
|
27
11
|
end # === class Ask
|
28
|
-
end # ===
|
12
|
+
end # === class Checked
|
data/lib/Checked/Ask/Vars.rb
CHANGED
@@ -1,22 +1,30 @@
|
|
1
1
|
|
2
|
-
|
2
|
+
class Checked
|
3
3
|
class Ask
|
4
|
-
class Vars
|
4
|
+
class Vars < Sinatra::Base
|
5
5
|
|
6
|
-
include
|
7
|
-
include Ask::Base
|
6
|
+
include Checked::Arch
|
8
7
|
|
9
|
-
|
8
|
+
map '/var!'
|
10
9
|
|
11
|
-
|
12
|
-
def
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
10
|
+
get
|
11
|
+
def respond_to_all?
|
12
|
+
a = not_empty_args!
|
13
|
+
|
14
|
+
a.all? { |a|
|
15
|
+
return!.respond_to? a
|
16
|
+
}
|
18
17
|
end
|
19
18
|
|
19
|
+
get
|
20
|
+
def respond_to_any?
|
21
|
+
a = not_empty_args!
|
22
|
+
|
23
|
+
a.any? { |a|
|
24
|
+
return!.respond_to? a
|
25
|
+
}
|
26
|
+
end
|
27
|
+
|
20
28
|
end # === class Vars
|
21
29
|
end # === class Ask
|
22
|
-
end # ===
|
30
|
+
end # === class Checked
|
data/lib/Checked/Clean/Clean.rb
CHANGED
@@ -1,38 +1,10 @@
|
|
1
1
|
|
2
|
-
|
2
|
+
class Checked
|
3
3
|
class Clean
|
4
|
-
module Base
|
5
|
-
|
6
|
-
private # =============================
|
7
|
-
include ::Checked::DSL
|
8
|
-
|
9
|
-
public # ==============================
|
10
|
-
include ::Checked::Base
|
11
|
-
|
12
|
-
def < meth, *args
|
13
|
-
val = super
|
14
|
-
named_demand!("Cleaned val", val, :not_nil!)
|
15
|
-
|
16
|
-
self.target= super
|
17
|
-
end
|
18
|
-
|
19
|
-
def << *args
|
20
|
-
args.flatten.each { |name|
|
21
|
-
self.< name
|
22
|
-
}
|
23
|
-
end
|
24
|
-
|
25
|
-
private # ===========================================
|
26
|
-
|
27
|
-
def target= val
|
28
|
-
named_demand! "Clean target", val, :not_nil!
|
29
|
-
|
30
|
-
@target = val
|
31
|
-
end
|
32
|
-
|
33
|
-
end # === module Base
|
34
|
-
|
35
|
-
include Base
|
36
4
|
|
5
|
+
def initialize *args
|
6
|
+
raise "Not allowed to use this Class directly."
|
7
|
+
end
|
8
|
+
|
37
9
|
end # === class Clean
|
38
10
|
end # === class Checked
|
@@ -1,33 +1,36 @@
|
|
1
1
|
|
2
|
-
|
2
|
+
class Checked
|
3
3
|
class Clean
|
4
|
-
class Strings
|
4
|
+
class Strings < Sinatra::Base
|
5
5
|
|
6
|
-
include
|
7
|
-
include Clean::Base
|
6
|
+
include Checked::Arch
|
8
7
|
|
9
|
-
|
8
|
+
map '/string!'
|
10
9
|
|
11
|
-
|
12
|
-
def
|
13
|
-
|
10
|
+
before '/:name'
|
11
|
+
def strip_val
|
12
|
+
return!( return!.strip ) if strippable_route?
|
13
|
+
end
|
14
|
+
|
15
|
+
def strippable_route?
|
16
|
+
params['name'][%r![^\?\!]\Z!] && !%w{chop_slash_r}.include?(params['name'])
|
14
17
|
end
|
15
18
|
|
16
|
-
|
19
|
+
get
|
17
20
|
def untar
|
18
|
-
|
21
|
+
return!
|
19
22
|
.sub(/\.tar\.gz$/, '')
|
20
23
|
.sub(/\.tar/, '')
|
21
24
|
end
|
22
25
|
|
23
|
-
|
26
|
+
get
|
24
27
|
def file_names
|
25
|
-
(
|
28
|
+
( return!.split.select { |word| word[*args] } )
|
26
29
|
end
|
27
30
|
|
28
|
-
|
31
|
+
get
|
29
32
|
def file_names_by_ext
|
30
|
-
names = CHECK.string!(
|
33
|
+
names = CHECK.string!(return!).file_names(*args)
|
31
34
|
bases = names.map { |s|
|
32
35
|
s.sub(%r!#{ext}$!, '')
|
33
36
|
}
|
@@ -35,61 +38,60 @@ module Checked
|
|
35
38
|
names.zip bases
|
36
39
|
end
|
37
40
|
|
38
|
-
|
41
|
+
get
|
39
42
|
def shell
|
40
|
-
|
41
|
-
.strip
|
43
|
+
return!
|
42
44
|
.split("\n")
|
43
45
|
.map(&:strip)
|
44
46
|
.reject { |line| line.empty? }
|
45
47
|
.join(' && ')
|
46
48
|
end
|
47
49
|
|
48
|
-
|
50
|
+
get
|
49
51
|
def chop_ext
|
50
|
-
|
52
|
+
return!.sub /\.[^\.]+$/, ''
|
51
53
|
end
|
52
54
|
|
53
|
-
|
55
|
+
get
|
54
56
|
def ruby_name
|
55
|
-
|
57
|
+
File.basename chop_rb
|
56
58
|
end
|
57
59
|
|
58
|
-
|
60
|
+
get
|
59
61
|
def chop_rb
|
60
|
-
|
62
|
+
return!.sub %r!\.rb$!, ''
|
61
63
|
end
|
62
64
|
|
63
|
-
|
65
|
+
get
|
64
66
|
def chop_slash_r
|
65
|
-
|
67
|
+
return!.gsub "\r", ''
|
66
68
|
end
|
67
69
|
|
68
|
-
|
70
|
+
get
|
69
71
|
def os_stardard
|
70
|
-
|
72
|
+
chop_slash_r
|
71
73
|
end
|
72
74
|
|
73
|
-
|
75
|
+
get
|
74
76
|
def to_single
|
75
|
-
|
77
|
+
return!.gsub( /s\Z/, '' )
|
76
78
|
end
|
77
79
|
|
78
|
-
|
80
|
+
get
|
79
81
|
def to_plural
|
80
|
-
|
82
|
+
return!.to_single + 's'
|
81
83
|
end
|
82
84
|
|
83
|
-
|
85
|
+
get
|
84
86
|
def to_class_name
|
85
|
-
|
87
|
+
return!.split('_').map(&:capitalize).join('_')
|
86
88
|
end
|
87
89
|
|
88
|
-
|
90
|
+
get
|
89
91
|
def to_camel_case
|
90
|
-
|
92
|
+
return!.split('_').map(&:capitalize).join
|
91
93
|
end
|
92
94
|
|
93
95
|
end # === class Strings
|
94
96
|
end # === class Clean
|
95
|
-
end # ===
|
97
|
+
end # === class Checked
|
data/lib/Checked/DSL.rb
ADDED
@@ -0,0 +1,238 @@
|
|
1
|
+
class Object
|
2
|
+
|
3
|
+
def Checked
|
4
|
+
@sin_arch ||= begin
|
5
|
+
o = ::Checked::Obj.new
|
6
|
+
o.value = self
|
7
|
+
o
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def Checked_applys?
|
12
|
+
(instance_variable_defined?(:@sin_arch) && Checked().on?)
|
13
|
+
end
|
14
|
+
|
15
|
+
def method_missing meth_name, *args
|
16
|
+
return(super) if !Checked_applys?
|
17
|
+
|
18
|
+
# Keep count after :Checked_applys? call
|
19
|
+
# because sometimes value is frozen.
|
20
|
+
@count ||= 1
|
21
|
+
@count += 1
|
22
|
+
return(super) if @count > 6
|
23
|
+
|
24
|
+
raise "Unknown block." if block_given?
|
25
|
+
begin
|
26
|
+
result = Checked().get!(meth_name, *args)
|
27
|
+
rescue Sin_Arch::Not_Found
|
28
|
+
return super
|
29
|
+
end
|
30
|
+
@count = 1
|
31
|
+
|
32
|
+
result.Checked.<< Checked()
|
33
|
+
result
|
34
|
+
end
|
35
|
+
|
36
|
+
end # === class Object
|
37
|
+
|
38
|
+
class Checked
|
39
|
+
|
40
|
+
class Obj
|
41
|
+
|
42
|
+
module Base
|
43
|
+
|
44
|
+
attr_accessor :map, :name, :value, :app
|
45
|
+
|
46
|
+
def initialize
|
47
|
+
off!
|
48
|
+
self.map = nil
|
49
|
+
self.name = nil
|
50
|
+
end
|
51
|
+
|
52
|
+
def << checked
|
53
|
+
on! checked.map
|
54
|
+
self.name = checked.name
|
55
|
+
end
|
56
|
+
|
57
|
+
def on?
|
58
|
+
@on
|
59
|
+
end
|
60
|
+
|
61
|
+
def on! new_map
|
62
|
+
raise ArgumentError, "Map value unacceptable: #{new_map.inspect}" unless new_map
|
63
|
+
self.map = new_map
|
64
|
+
@on = true
|
65
|
+
end
|
66
|
+
|
67
|
+
def off?
|
68
|
+
!@on
|
69
|
+
end
|
70
|
+
|
71
|
+
def off!
|
72
|
+
@on = false
|
73
|
+
end
|
74
|
+
|
75
|
+
def get! meth_name, *args
|
76
|
+
self.app = Checked::App.new
|
77
|
+
app.get!("/#{map}/#{meth_name}", 'name'=>name, 'value'=>value, 'args'=>args)
|
78
|
+
end
|
79
|
+
|
80
|
+
end # === module Base
|
81
|
+
|
82
|
+
include Base
|
83
|
+
|
84
|
+
end # === class Obj
|
85
|
+
|
86
|
+
end # === class Checked
|
87
|
+
|
88
|
+
class Checked
|
89
|
+
module DSL
|
90
|
+
|
91
|
+
module Ruby
|
92
|
+
|
93
|
+
def demand *args
|
94
|
+
case args.size
|
95
|
+
when 2
|
96
|
+
bool, raw_msg = args
|
97
|
+
msg = raw_msg.sub(%r!\A\.\.\.!, "#{target_name || return!.class}, #{return!.inspect}, ")
|
98
|
+
fail!(msg) unless bool
|
99
|
+
return!
|
100
|
+
when 3
|
101
|
+
val, bool, raw_msg = args
|
102
|
+
if respond_to?(:return!) && return! == val
|
103
|
+
return demand( bool, raw_msg )
|
104
|
+
end
|
105
|
+
msg = raw_msg.sub(%r!\A\.\.\.!, "#{val.class}, #{val.inspect}, ")
|
106
|
+
fail!(msg) unless bool
|
107
|
+
val
|
108
|
+
else
|
109
|
+
raise ArgumentError, "Too many arguments: #{args.inspect}"
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
def fail! msg
|
114
|
+
raise Checked::Demand::Failed, msg
|
115
|
+
end
|
116
|
+
|
117
|
+
def respond_to_all? val, *meths
|
118
|
+
meths.map { |m|
|
119
|
+
val.respond_to? m
|
120
|
+
}.uniq == [true]
|
121
|
+
end
|
122
|
+
|
123
|
+
def array? val
|
124
|
+
respond_to_all?( val, :[], :pop )
|
125
|
+
end
|
126
|
+
|
127
|
+
def hash? val
|
128
|
+
respond_to_all?( val, :[], :keys, :values )
|
129
|
+
end
|
130
|
+
|
131
|
+
def array! val
|
132
|
+
demand val, array?(val), '...is not an array.'
|
133
|
+
val
|
134
|
+
end
|
135
|
+
|
136
|
+
def hash! val
|
137
|
+
demand val, hash?(val), '...must be a hash.'
|
138
|
+
val
|
139
|
+
end
|
140
|
+
|
141
|
+
def string? val
|
142
|
+
val.is_a?(String)
|
143
|
+
end
|
144
|
+
|
145
|
+
def string! val
|
146
|
+
demand val, val.is_a?(String), '...must be a string.'
|
147
|
+
val
|
148
|
+
end
|
149
|
+
|
150
|
+
def bool! val
|
151
|
+
demand val, val.is_a?(TrueClass) || val.is_a?(FalseClass), '...must be either true (TrueClass) or false (FalseClass).'
|
152
|
+
val
|
153
|
+
end
|
154
|
+
|
155
|
+
def true! val
|
156
|
+
demand val, val === true, '...must be true (TrueClass).'
|
157
|
+
val
|
158
|
+
end
|
159
|
+
|
160
|
+
def false! val
|
161
|
+
demand val, val === false, '...must be false (FalseClass).'
|
162
|
+
val
|
163
|
+
end
|
164
|
+
|
165
|
+
def not_empty! val
|
166
|
+
demand val, !val.empty?, "...can't be empty."
|
167
|
+
val
|
168
|
+
end
|
169
|
+
|
170
|
+
def keys! h, *args
|
171
|
+
missing = args.select { |k| !h.has_key?(k) }
|
172
|
+
unless missing.empty?
|
173
|
+
raise Checked::Demand::Fail, "Missing keys: #{missing.inspect} in #{h}"
|
174
|
+
end
|
175
|
+
true
|
176
|
+
end
|
177
|
+
|
178
|
+
end # === module Ruby
|
179
|
+
|
180
|
+
module Racked
|
181
|
+
|
182
|
+
include Ruby
|
183
|
+
|
184
|
+
def self.eval! m
|
185
|
+
caller(1).first =~ %r!([^\:]+):(\d+):in `.!
|
186
|
+
if $1 && $2
|
187
|
+
eval m, nil, $1, $2.to_i - m.split("\n").size + 1
|
188
|
+
else
|
189
|
+
eval m, nil
|
190
|
+
end
|
191
|
+
end
|
192
|
+
|
193
|
+
%w{ Array Bool File_Path Hash String Symbol Var }.each { |name|
|
194
|
+
eval! %~
|
195
|
+
def #{name}!( *args )
|
196
|
+
Check!( '#{name.downcase}!', *args ).check!
|
197
|
+
end
|
198
|
+
~
|
199
|
+
}
|
200
|
+
|
201
|
+
def Stripped! *args
|
202
|
+
v = String!(*args)
|
203
|
+
String!(v.strip)
|
204
|
+
end
|
205
|
+
|
206
|
+
def Check! ns, *name_and_or_val
|
207
|
+
name, val = case name_and_or_val.size
|
208
|
+
when 1
|
209
|
+
[ nil, name_and_or_val.first ]
|
210
|
+
when 2
|
211
|
+
name_and_or_val
|
212
|
+
else
|
213
|
+
raise ArgumentError, "Unknown values for name/value: #{name_and_or_val.inspect}"
|
214
|
+
end
|
215
|
+
|
216
|
+
val.Checked.on! ns
|
217
|
+
val.Checked.name = name
|
218
|
+
val.Checked.get! 'check!'
|
219
|
+
val
|
220
|
+
end
|
221
|
+
|
222
|
+
# ============= Ask ================
|
223
|
+
|
224
|
+
def any? target, *args
|
225
|
+
raise "No block allowed." if block_given?
|
226
|
+
|
227
|
+
args.map { |a|
|
228
|
+
send "#{klass}?", target, a
|
229
|
+
check_it( 'ask', _main_class_(target), nil, target).send( a ).request.response.body
|
230
|
+
}.compact == [true]
|
231
|
+
end
|
232
|
+
|
233
|
+
|
234
|
+
end # === module Rack_Arch
|
235
|
+
|
236
|
+
end # === module DSL
|
237
|
+
|
238
|
+
end # === class Checked
|