Checked 0.1.4 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Checked.gemspec +2 -3
- data/lib/Checked.rb +21 -9
- data/lib/Checked/Ask/Arrays.rb +31 -0
- data/lib/Checked/Ask/Ask.rb +21 -0
- data/lib/Checked/Ask/Strings.rb +27 -0
- data/lib/Checked/Ask/Vars.rb +21 -0
- data/lib/Checked/Base/Arch.rb +20 -0
- data/lib/Checked/Base/Base.rb +110 -0
- data/lib/Checked/Base/DSL.rb +73 -0
- data/lib/Checked/Base/DSL_Obj.rb +35 -0
- data/lib/Checked/{Clean.rb → Clean/Clean.rb} +1 -4
- data/lib/Checked/Clean/Strings.rb +94 -0
- data/lib/Checked/Demand/Arrays.rb +78 -0
- data/lib/Checked/Demand/Bools.rb +28 -0
- data/lib/Checked/{Demand.rb → Demand/Demand.rb} +12 -11
- data/lib/Checked/Demand/File_Paths.rb +63 -0
- data/lib/Checked/Demand/Hashs.rb +29 -0
- data/lib/Checked/Demand/Strings.rb +66 -0
- data/lib/Checked/Demand/Symbols.rb +21 -0
- data/lib/Checked/Demand/Vars.rb +65 -0
- data/lib/Checked/version.rb +1 -1
- data/spec/main.rb +5 -1
- data/spec/tests/Ask.rb +126 -8
- data/spec/tests/Clean.rb +66 -8
- data/spec/tests/DSL.rb +31 -0
- data/spec/tests/Demand.rb +220 -29
- metadata +38 -32
- data/lib/Checked/Args.rb +0 -55
- data/lib/Checked/Ask.rb +0 -69
- data/lib/Checked/Ask/DSL.rb +0 -31
- data/lib/Checked/Ask/Mods/Arrays.rb +0 -25
- data/lib/Checked/Ask/Mods/Strings.rb +0 -26
- data/lib/Checked/Ask/Mods/Vars.rb +0 -12
- data/lib/Checked/Base.rb +0 -119
- data/lib/Checked/Clean/DSL.rb +0 -16
- data/lib/Checked/Clean/Mods/Strings.rb +0 -104
- data/lib/Checked/Demand/DSL.rb +0 -29
- data/lib/Checked/Demand/Mods/Arrays.rb +0 -72
- data/lib/Checked/Demand/Mods/Bools.rb +0 -37
- data/lib/Checked/Demand/Mods/File_Addresses.rb +0 -59
- data/lib/Checked/Demand/Mods/Strings.rb +0 -51
- data/lib/Checked/Demand/Mods/Symbols.rb +0 -20
- data/lib/Checked/Demand/Mods/Vars.rb +0 -91
- data/spec/tests/Ask_Strings.rb +0 -57
- data/spec/tests/Checked.rb +0 -43
- data/spec/tests/Clean_Strings.rb +0 -76
- data/spec/tests/Demand_Arrays.rb +0 -31
- data/spec/tests/Demand_File_Addresses.rb +0 -61
- data/spec/tests/Demand_Vars.rb +0 -19
@@ -0,0 +1,78 @@
|
|
1
|
+
module Checked
|
2
|
+
class Demand
|
3
|
+
class Arrays
|
4
|
+
|
5
|
+
include Demand::Base
|
6
|
+
|
7
|
+
namespace '/array!'
|
8
|
+
|
9
|
+
before
|
10
|
+
def validate_target_class
|
11
|
+
fail! "...is not an Array." unless array?(target)
|
12
|
+
end
|
13
|
+
|
14
|
+
route
|
15
|
+
def no_nils!
|
16
|
+
if target.include?(nil)
|
17
|
+
fail!("...can't contain nils.")
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
route
|
22
|
+
def no_empty_strings!
|
23
|
+
target.each { |s|
|
24
|
+
|
25
|
+
if s.respond_to?(:rewind)
|
26
|
+
s.rewind
|
27
|
+
end
|
28
|
+
|
29
|
+
final = if s.respond_to?(:readlines)
|
30
|
+
s.readlines
|
31
|
+
else
|
32
|
+
s
|
33
|
+
end
|
34
|
+
|
35
|
+
if !final.is_a?(::String)
|
36
|
+
fail!("Array contains unknown class: #{final.inspect}")
|
37
|
+
end
|
38
|
+
|
39
|
+
if final.is_a?(String) && final.strip.empty?
|
40
|
+
fail!("...can't contain empty strings.")
|
41
|
+
end
|
42
|
+
}
|
43
|
+
end
|
44
|
+
|
45
|
+
route
|
46
|
+
def symbols!
|
47
|
+
not_empty!
|
48
|
+
if !target.all? { |v| v.is_a?(Symbol) }
|
49
|
+
fail! "...contains a non-symbol."
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
route
|
54
|
+
def include!
|
55
|
+
return true if target.include?(matcher)
|
56
|
+
fail!("...must contain: #{matcher.inspect}")
|
57
|
+
end
|
58
|
+
|
59
|
+
route
|
60
|
+
def exclude!
|
61
|
+
raise_e = val.include?(matcher)
|
62
|
+
return true unless raise_e
|
63
|
+
fail!("...can't contain #{matcher.inspect}")
|
64
|
+
end
|
65
|
+
|
66
|
+
route
|
67
|
+
def matches_only!
|
68
|
+
arr = target.reject { |val| val == matcher }
|
69
|
+
fail!( "...invalid elements: #{arr.inspect}" ) if !arr.empty?
|
70
|
+
end
|
71
|
+
|
72
|
+
private
|
73
|
+
|
74
|
+
|
75
|
+
end # === class Arrays
|
76
|
+
end # === class Demand
|
77
|
+
end # === module Checked
|
78
|
+
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Checked
|
2
|
+
class Demand
|
3
|
+
class Bools
|
4
|
+
|
5
|
+
include Demand::Base
|
6
|
+
|
7
|
+
namespace '/bool!'
|
8
|
+
|
9
|
+
before
|
10
|
+
def validate
|
11
|
+
fail!("...must be either of TrueClass or FalseClass.") unless [TrueClass, FalseClass].include?(target.class)
|
12
|
+
end
|
13
|
+
|
14
|
+
route
|
15
|
+
def true!
|
16
|
+
fail! "...must be true (TrueClass)." unless target.class == TrueClass
|
17
|
+
end
|
18
|
+
|
19
|
+
route
|
20
|
+
def false!
|
21
|
+
fail! "...must be false (FalseClass)." unless target.class == FalseClass
|
22
|
+
end
|
23
|
+
|
24
|
+
end # === class Bools
|
25
|
+
end # === class Demand
|
26
|
+
end # === module Checked
|
27
|
+
|
28
|
+
|
@@ -1,19 +1,19 @@
|
|
1
|
-
require "Checked/Base"
|
2
|
-
require "Checked/Demand/DSL"
|
3
1
|
|
4
2
|
|
5
3
|
module Checked
|
6
|
-
|
7
4
|
class Demand
|
8
5
|
|
9
6
|
Failed = Class.new(RuntimeError)
|
10
|
-
|
7
|
+
|
11
8
|
module Base
|
12
9
|
|
13
|
-
include
|
14
|
-
|
15
|
-
|
16
|
-
|
10
|
+
include Checked::Base
|
11
|
+
|
12
|
+
route "/!w!!/check!/"
|
13
|
+
def check!
|
14
|
+
# do nothing
|
15
|
+
end
|
16
|
+
|
17
17
|
def err_msg msg = "...is invalid."
|
18
18
|
message = if msg.strip[ %r!^\.\.\.! ]
|
19
19
|
msg.sub('...', '').strip
|
@@ -21,7 +21,7 @@ module Checked
|
|
21
21
|
msg
|
22
22
|
end
|
23
23
|
|
24
|
-
@err_msg || "#{target_name} #{message}"
|
24
|
+
@err_msg || "#{target_name}, #{original_target.inspect}, #{message}"
|
25
25
|
end
|
26
26
|
|
27
27
|
def err_msg= msg
|
@@ -37,10 +37,11 @@ module Checked
|
|
37
37
|
|
38
38
|
end # === module Base
|
39
39
|
|
40
|
-
|
40
|
+
def initialize *args
|
41
|
+
raise "Demand not allowed to be used."
|
42
|
+
end
|
41
43
|
|
42
44
|
end # === class Demand
|
43
|
-
|
44
45
|
end # === module Checked
|
45
46
|
|
46
47
|
|
@@ -0,0 +1,63 @@
|
|
1
|
+
module Checked
|
2
|
+
class Demand
|
3
|
+
class File_Paths
|
4
|
+
|
5
|
+
include Demand::Base
|
6
|
+
|
7
|
+
namespace '/file_path!'
|
8
|
+
|
9
|
+
before
|
10
|
+
def validate
|
11
|
+
fail!('...must be a String.') unless target.is_a?(String)
|
12
|
+
|
13
|
+
strip_target
|
14
|
+
not_empty!
|
15
|
+
validate_format!
|
16
|
+
expand_target if fs_path?
|
17
|
+
end
|
18
|
+
|
19
|
+
route
|
20
|
+
def hostname!
|
21
|
+
matches_only! %r![\dA-Za-z_-]!
|
22
|
+
end
|
23
|
+
|
24
|
+
route
|
25
|
+
def not_dir!
|
26
|
+
if File.directory?(target)
|
27
|
+
fail! "...can't be an existing directory."
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
route
|
32
|
+
def not_file!
|
33
|
+
fail! "...can't be a file." if File.file?(target)
|
34
|
+
end
|
35
|
+
|
36
|
+
route
|
37
|
+
def dir!
|
38
|
+
fail! "...must be an existing directory." unless File.directory?(target)
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
def validate_format!
|
44
|
+
if target[%r!([^a-zA-Z0-9\.\_\-\/~,]+)!]
|
45
|
+
fail! "...has invalid characters: #{$1.inspect}"
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def expand_target
|
50
|
+
request.response.body= File.expand_path(target)
|
51
|
+
end
|
52
|
+
|
53
|
+
#
|
54
|
+
# fs_path => File system object path
|
55
|
+
#
|
56
|
+
def fs_path?
|
57
|
+
request.path[%r!(_|/)(dir|file)[^a-zA-Z]+\Z!]
|
58
|
+
end
|
59
|
+
|
60
|
+
end # === class File_Addresses
|
61
|
+
end # === class Demand
|
62
|
+
end # === module Checked
|
63
|
+
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Checked
|
2
|
+
class Demand
|
3
|
+
class Hashs
|
4
|
+
|
5
|
+
include Demand::Base
|
6
|
+
|
7
|
+
namespace '/hash!'
|
8
|
+
|
9
|
+
before
|
10
|
+
def validate_target_class
|
11
|
+
fail!("...must be a Hash") unless hash?(target)
|
12
|
+
end
|
13
|
+
|
14
|
+
route
|
15
|
+
def symbol_keys!
|
16
|
+
keys = target.keys
|
17
|
+
|
18
|
+
if keys.all? { |k| k.is_a?(Symbol) }
|
19
|
+
# do nothing
|
20
|
+
else
|
21
|
+
fail! '...must have all symbol keys.'
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
end # === class Hashs
|
26
|
+
end # === class Demand
|
27
|
+
end # === module Checked
|
28
|
+
|
29
|
+
|
@@ -0,0 +1,66 @@
|
|
1
|
+
|
2
|
+
module Checked
|
3
|
+
class Demand
|
4
|
+
class Strings
|
5
|
+
|
6
|
+
include Demand::Base
|
7
|
+
|
8
|
+
namespace '/string!'
|
9
|
+
|
10
|
+
before
|
11
|
+
def validate
|
12
|
+
case target
|
13
|
+
when String
|
14
|
+
when StringIO
|
15
|
+
target.rewind
|
16
|
+
request.response.body= target.readlines
|
17
|
+
target.rewind
|
18
|
+
else
|
19
|
+
fail! "...must be a String or StringIO"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
route
|
24
|
+
def include!
|
25
|
+
included = target[matcher]
|
26
|
+
return true if included
|
27
|
+
fail!("...must contain: #{matcher.inspect}")
|
28
|
+
end
|
29
|
+
|
30
|
+
route
|
31
|
+
def exclude! matcher
|
32
|
+
raise_e = val[matcher]
|
33
|
+
return true unless raise_e
|
34
|
+
fail!("...can't contain #{matcher.inspect}")
|
35
|
+
end
|
36
|
+
|
37
|
+
route
|
38
|
+
def matches_only!
|
39
|
+
str = target.gsub(matcher, '')
|
40
|
+
if !str.empty?
|
41
|
+
fail!( "...has invalid characters: #{str.inspect}" )
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
route
|
46
|
+
def not_empty!
|
47
|
+
if target.strip.empty?
|
48
|
+
fail!("...can't be empty.")
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
route
|
53
|
+
def file_read!
|
54
|
+
request.response.body= target.gsub("\r\n", "\n")
|
55
|
+
end
|
56
|
+
|
57
|
+
route
|
58
|
+
def file_content!
|
59
|
+
not_empty!
|
60
|
+
file_read!
|
61
|
+
end
|
62
|
+
|
63
|
+
end # === class String
|
64
|
+
end # === class Demand
|
65
|
+
end # === module Checked
|
66
|
+
|
@@ -0,0 +1,21 @@
|
|
1
|
+
|
2
|
+
module Checked
|
3
|
+
class Demand
|
4
|
+
class Symbols
|
5
|
+
|
6
|
+
include Demand::Base
|
7
|
+
|
8
|
+
namespace '/symbol!'
|
9
|
+
|
10
|
+
before
|
11
|
+
def validate
|
12
|
+
case target
|
13
|
+
when Symbol
|
14
|
+
else
|
15
|
+
fail! '...must be a Symbol.'
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
end # === class Symbols
|
20
|
+
end # === class Demand
|
21
|
+
end # === module Checked
|
@@ -0,0 +1,65 @@
|
|
1
|
+
module Checked
|
2
|
+
class Demand
|
3
|
+
class Vars
|
4
|
+
|
5
|
+
include Demand::Base
|
6
|
+
|
7
|
+
namespace '/var!'
|
8
|
+
|
9
|
+
route
|
10
|
+
def either!
|
11
|
+
request.headers.args.flatten.detect { |m|
|
12
|
+
begin
|
13
|
+
target.send m
|
14
|
+
true
|
15
|
+
rescue Failed
|
16
|
+
false
|
17
|
+
end
|
18
|
+
}
|
19
|
+
end
|
20
|
+
|
21
|
+
route
|
22
|
+
def be!
|
23
|
+
rejected = request.headers.args.flatten.select { |m|
|
24
|
+
!(target.send m)
|
25
|
+
}
|
26
|
+
fail!("...must be: #{rejected.map(&:to_s).join(', ')}") unless rejected.empty?
|
27
|
+
end
|
28
|
+
|
29
|
+
route
|
30
|
+
def not_be!
|
31
|
+
rejected = request.headers.args.flatten.select { |m|
|
32
|
+
!!(target.send m)
|
33
|
+
}
|
34
|
+
fail!("...must not be: #{rejected.map(&:to_s).join(', ')}") unless rejected.empty?
|
35
|
+
end
|
36
|
+
|
37
|
+
route
|
38
|
+
def one_of!
|
39
|
+
klasses = request.headers.args
|
40
|
+
return true if klasses.flatten.any? { |k| target.is_a?(k) }
|
41
|
+
fail! "...can only be of class/module: #{klasses.map(&:to_s).join(', ')}"
|
42
|
+
end
|
43
|
+
|
44
|
+
route
|
45
|
+
def nil!
|
46
|
+
fail!("...must be nil.") unless target.nil?
|
47
|
+
end
|
48
|
+
|
49
|
+
route
|
50
|
+
def not_nil!
|
51
|
+
fail!("...can't be nil.") if target.nil?
|
52
|
+
end
|
53
|
+
|
54
|
+
route
|
55
|
+
def respond_to!
|
56
|
+
rejected = request.headers.args.reject { |m|
|
57
|
+
!target.respond_to?(m)
|
58
|
+
}
|
59
|
+
fail!("...must respond to #{rejected.inspect}") unless rejected.empty?
|
60
|
+
end
|
61
|
+
|
62
|
+
end # === class Vars
|
63
|
+
end # === class Demand
|
64
|
+
end # === module Checked
|
65
|
+
|
data/lib/Checked/version.rb
CHANGED
data/spec/main.rb
CHANGED
@@ -3,6 +3,11 @@ require File.expand_path('spec/helper')
|
|
3
3
|
require "Bacon_Colored"
|
4
4
|
require 'Checked'
|
5
5
|
|
6
|
+
class Box
|
7
|
+
include Checked::DSL
|
8
|
+
end
|
9
|
+
|
10
|
+
BOX = Box.new
|
6
11
|
|
7
12
|
FOLDER = ("/tmp/Checked_Test")
|
8
13
|
%x! mkdir -p #{FOLDER}!
|
@@ -26,7 +31,6 @@ def ruby_e cmd
|
|
26
31
|
end
|
27
32
|
end
|
28
33
|
|
29
|
-
|
30
34
|
Dir.glob('spec/tests/*.rb').each { |file|
|
31
35
|
require File.expand_path(file.sub('.rb', '')) if File.file?(file)
|
32
36
|
}
|
data/spec/tests/Ask.rb
CHANGED
@@ -1,13 +1,131 @@
|
|
1
1
|
|
2
2
|
|
3
|
-
|
3
|
+
# ============================
|
4
|
+
# ============================ ARRAYS
|
5
|
+
# ============================
|
6
|
+
|
7
|
+
describe "array! :include?" do
|
8
|
+
|
9
|
+
it "returns true if array contains element." do
|
10
|
+
BOX.array!([:a]).include?(:a)
|
11
|
+
.should.be == true
|
12
|
+
end
|
13
|
+
|
14
|
+
it "returns false if array does not contain element" do
|
15
|
+
BOX.array!([:a]).include?(:b)
|
16
|
+
.should.be == false
|
17
|
+
end
|
18
|
+
|
19
|
+
end # === describe Ask :includes
|
20
|
+
|
21
|
+
describe "array! :exclude?" do
|
22
|
+
|
23
|
+
it "returns true if array excludes element." do
|
24
|
+
BOX.array!([:a]).exclude?(:b)
|
25
|
+
.should.be == true
|
26
|
+
end
|
27
|
+
|
28
|
+
it "returns false if array does contains element" do
|
29
|
+
BOX.array!([:a]).exclude?(:a)
|
30
|
+
.should.be == false
|
31
|
+
end
|
32
|
+
|
33
|
+
end # === describe Ask :exclude
|
34
|
+
|
35
|
+
describe "array! symbols?" do
|
36
|
+
|
37
|
+
it 'returns true if all elements are symbols' do
|
38
|
+
BOX.array!([:a, :b]).symbols?
|
39
|
+
.should.be == true
|
40
|
+
end
|
41
|
+
|
42
|
+
end # === describe array! symbols?
|
43
|
+
#
|
44
|
+
# describe "Ask :excludes" do
|
45
|
+
#
|
46
|
+
# behaves_like 'Ask'
|
47
|
+
#
|
48
|
+
# it "returns true if string excludes a Regexp matcher" do
|
49
|
+
# Checked::Ask.new(" :a ") { |a|
|
50
|
+
# a.< :excludes?, / :b /
|
51
|
+
# }.true?.should.be == true
|
52
|
+
# end
|
53
|
+
#
|
54
|
+
# it 'returns false if string includes a Regexp matcher' do
|
55
|
+
# Checked::Ask.new(" :a ") { |a|
|
56
|
+
# a.< :excludes?, / :a /
|
57
|
+
# }.true?.should.be == false
|
58
|
+
# end
|
59
|
+
#
|
60
|
+
# end # === describe Ask :excludes
|
61
|
+
|
62
|
+
|
63
|
+
|
64
|
+
# ============================
|
65
|
+
# ============================ STRINGS
|
66
|
+
# ============================
|
67
|
+
|
68
|
+
describe "string! :include?" do
|
69
|
+
|
70
|
+
it "returns true if string contains regexp." do
|
71
|
+
BOX.string!(": a").include?(/: a/)
|
72
|
+
.should.be == true
|
73
|
+
end
|
74
|
+
|
75
|
+
it "returns false if string does not element" do
|
76
|
+
BOX.string!(" :a ").include?(/ :b /)
|
77
|
+
.should.be == false
|
78
|
+
end
|
79
|
+
|
80
|
+
end # === describe Ask :includes
|
81
|
+
|
82
|
+
describe "string! :exclude?" do
|
83
|
+
|
84
|
+
it "returns true if string excludes regexp." do
|
85
|
+
BOX.string!(": a").exclude?(/: b/)
|
86
|
+
.should.be == true
|
87
|
+
end
|
88
|
+
|
89
|
+
it "returns false if string does not excludes element" do
|
90
|
+
BOX.string!(" :a ").exclude?(/ :a /)
|
91
|
+
.should.be == false
|
92
|
+
end
|
93
|
+
|
94
|
+
end # === describe Ask :excludes
|
95
|
+
|
96
|
+
|
97
|
+
describe "ask empty?" do
|
98
|
+
|
99
|
+
it "returns true if string is :empty? after applying :strip" do
|
100
|
+
BOX.string!(" \n ").empty?.should.be === true
|
101
|
+
end
|
102
|
+
|
103
|
+
it "returns false if string is not :empty? after applying :strip" do
|
104
|
+
BOX.string!(" n ").empty?.should.be === false
|
105
|
+
end
|
106
|
+
|
107
|
+
|
108
|
+
end # === describe Ask Strings
|
109
|
+
|
110
|
+
# ============================
|
111
|
+
# ============================ VARS
|
112
|
+
# ============================
|
113
|
+
|
114
|
+
describe "var! :respond_to?" do
|
115
|
+
|
116
|
+
it 'returns true if it responds to methods' do
|
117
|
+
BOX.var!( [] ).respond_to?(:[], :to_s, :pop)
|
118
|
+
.should == true
|
119
|
+
end
|
120
|
+
|
121
|
+
it 'returns false if it does not to at least one method' do
|
122
|
+
BOX.var!( [] ).respond_to?(:[], :to_s, :keys)
|
123
|
+
.should == false
|
124
|
+
end
|
4
125
|
|
5
|
-
it '
|
6
|
-
|
7
|
-
|
8
|
-
puts Checked::Ask::DSL.to_s
|
9
|
-
!)
|
10
|
-
.should.be == 'Checked::Ask::DSL'
|
126
|
+
it 'returns false if arg list is empty' do
|
127
|
+
BOX.var!( [] ).respond_to?
|
128
|
+
.should == false
|
11
129
|
end
|
12
130
|
|
13
|
-
end # === describe
|
131
|
+
end # === describe var! :respond_to?
|