rapid-core 0.1

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.
Files changed (132) hide show
  1. data/.gitignore +7 -0
  2. data/.rspec +2 -0
  3. data/Gemfile +11 -0
  4. data/Gemfile.lock +53 -0
  5. data/Rakefile +61 -0
  6. data/cucumber.yml +3 -0
  7. data/doc/plan.txt +89 -0
  8. data/doc/scaffold/controller.rb +83 -0
  9. data/doc/scaffold/helper.rb +2 -0
  10. data/doc/scaffold/model.rb +5 -0
  11. data/doc/scaffold/rapid_scaffold.rb +5 -0
  12. data/doc/scaffold/views/_form.html.erb +25 -0
  13. data/doc/scaffold/views/edit.html.erb +6 -0
  14. data/doc/scaffold/views/index.html.erb +25 -0
  15. data/doc/scaffold/views/new.html.erb +5 -0
  16. data/doc/scaffold/views/show.html.erb +15 -0
  17. data/features/settings/boolean/default.feature +36 -0
  18. data/features/settings/double-nested/default.feature +50 -0
  19. data/features/settings/double-nested/if.feature +41 -0
  20. data/features/settings/double-nested/unless.feature +39 -0
  21. data/features/settings/double-nested/validates/exclusion_of.feature +30 -0
  22. data/features/settings/double-nested/validates/format_of.feature +30 -0
  23. data/features/settings/double-nested/validates/inclusion_of.feature +30 -0
  24. data/features/settings/double-nested/validates/length_of.feature +30 -0
  25. data/features/settings/double-nested/validates/presence_of.feature +37 -0
  26. data/features/settings/double-nested/validates/size_of.feature +30 -0
  27. data/features/settings/integer/default.feature +49 -0
  28. data/features/settings/nested/default.feature +50 -0
  29. data/features/settings/nested/if.feature +53 -0
  30. data/features/settings/nested/unless.feature +32 -0
  31. data/features/settings/nested/validates/exclusion_of.feature +30 -0
  32. data/features/settings/nested/validates/format_of.feature +30 -0
  33. data/features/settings/nested/validates/inclusion_of.feature +30 -0
  34. data/features/settings/nested/validates/length_of.feature +30 -0
  35. data/features/settings/nested/validates/presence_of.feature +37 -0
  36. data/features/settings/nested/validates/size_of.feature +30 -0
  37. data/features/settings/not_found.feature +33 -0
  38. data/features/settings/string/default.feature +36 -0
  39. data/features/settings/string/validates/exclusion_of.feature +30 -0
  40. data/features/settings/string/validates/format_of.feature +30 -0
  41. data/features/settings/string/validates/inclusion_of.feature +30 -0
  42. data/features/settings/string/validates/length_of.feature +30 -0
  43. data/features/settings/string/validates/presence_of.feature +37 -0
  44. data/features/settings/string/validates/size_of.feature +30 -0
  45. data/features/step_definitions/settings_steps.rb +92 -0
  46. data/features/step_definitions/skeleton_steps.rb +68 -0
  47. data/features/step_definitions/template_steps.rb +39 -0
  48. data/features/support/env.rb +6 -0
  49. data/features/templates/comment_if.feature +55 -0
  50. data/features/templates/comment_unless.feature +56 -0
  51. data/features/templates/for/for.feature +51 -0
  52. data/features/templates/if/else.feature +60 -0
  53. data/features/templates/if/elsif.feature +82 -0
  54. data/features/templates/if/if.feature +55 -0
  55. data/features/templates/namespaces/exist.feature +54 -0
  56. data/features/templates/static.feature +37 -0
  57. data/features/templates/variables.feature +61 -0
  58. data/lib/rapid/check.rb +162 -0
  59. data/lib/rapid/core.rb +37 -0
  60. data/lib/rapid/error.rb +84 -0
  61. data/lib/rapid/module.rb +35 -0
  62. data/lib/rapid/railtie.rb +18 -0
  63. data/lib/rapid/setting/base.rb +35 -0
  64. data/lib/rapid/setting/boolean_setting.rb +17 -0
  65. data/lib/rapid/setting/class_hash.rb +34 -0
  66. data/lib/rapid/setting/comments.rb +25 -0
  67. data/lib/rapid/setting/definer.rb +151 -0
  68. data/lib/rapid/setting/instance_hash.rb +132 -0
  69. data/lib/rapid/setting/instance_root.rb +107 -0
  70. data/lib/rapid/setting/integer_setting.rb +24 -0
  71. data/lib/rapid/setting/namespace/base.rb +113 -0
  72. data/lib/rapid/setting/namespace/instance.rb +84 -0
  73. data/lib/rapid/setting/nested_validations.rb +86 -0
  74. data/lib/rapid/setting/string_setting.rb +13 -0
  75. data/lib/rapid/settings.rb +129 -0
  76. data/lib/rapid/skeleton/base.rb +164 -0
  77. data/lib/rapid/skeleton/helpers/directory.rb +53 -0
  78. data/lib/rapid/skeleton/helpers/gem.rb +133 -0
  79. data/lib/rapid/skeleton/helpers/migration.rb +46 -0
  80. data/lib/rapid/skeleton/helpers/route.rb +115 -0
  81. data/lib/rapid/skeleton/helpers/script.rb +33 -0
  82. data/lib/rapid/skeleton/helpers/template.rb +73 -0
  83. data/lib/rapid/skeleton/helpers/view.rb +35 -0
  84. data/lib/rapid/spec/template.rb +104 -0
  85. data/lib/rapid/spec.rb +1 -0
  86. data/lib/rapid/tasks.rb +29 -0
  87. data/lib/rapid/template/base.rb +49 -0
  88. data/lib/rapid/template/node/base.rb +43 -0
  89. data/lib/rapid/template/node/comment_node.rb +42 -0
  90. data/lib/rapid/template/node/if_node.rb +109 -0
  91. data/lib/rapid/template/node/root.rb +51 -0
  92. data/lib/rapid/template/node/static.rb +29 -0
  93. data/lib/rapid/template/node/variable.rb +86 -0
  94. data/lib/rapid/template/parser.rb +167 -0
  95. data/lib/rapid/template/pulling/base.rb +91 -0
  96. data/lib/rapid/template/pulling/explicit.rb +92 -0
  97. data/lib/rapid/template/pulling/forgiving.rb +58 -0
  98. data/lib/rapid/version.rb +3 -0
  99. data/lib/rapid.rb +37 -0
  100. data/rapid-core.gemspec +26 -0
  101. data/spec/rapid/check_spec.rb +119 -0
  102. data/spec/rapid/error_spec.rb +14 -0
  103. data/spec/rapid/module_spec.rb +28 -0
  104. data/spec/rapid/setting/base_spec.rb +17 -0
  105. data/spec/rapid/setting/definer_spec.rb +318 -0
  106. data/spec/rapid/setting/instance_root_spec.rb +161 -0
  107. data/spec/rapid/setting/namespace/base_spec.rb +93 -0
  108. data/spec/rapid/setting/namespace/instance_spec.rb +12 -0
  109. data/spec/rapid/setting/nested_validations_spec.rb +72 -0
  110. data/spec/rapid/settings_spec.rb +51 -0
  111. data/spec/rapid/skeleton/base_spec.rb +224 -0
  112. data/spec/rapid/skeleton/helpers/directory_spec.rb +104 -0
  113. data/spec/rapid/skeleton/helpers/gem_spec.rb +180 -0
  114. data/spec/rapid/skeleton/helpers/migration_spec.rb +23 -0
  115. data/spec/rapid/skeleton/helpers/route_spec.rb +120 -0
  116. data/spec/rapid/skeleton/helpers/script_spec.rb +57 -0
  117. data/spec/rapid/skeleton/helpers/template_spec.rb +142 -0
  118. data/spec/rapid/skeleton/helpers/view_spec.rb +54 -0
  119. data/spec/rapid/spec/template_spec.rb +168 -0
  120. data/spec/rapid/template/base_spec.rb +290 -0
  121. data/spec/rapid/template/node/base_spec.rb +9 -0
  122. data/spec/rapid/template/node/comment_node_spec.rb +46 -0
  123. data/spec/rapid/template/node/if_node_spec.rb +28 -0
  124. data/spec/rapid/template/node/root_spec.rb +9 -0
  125. data/spec/rapid/template/node/static_spec.rb +17 -0
  126. data/spec/rapid/template/node/variable_spec.rb +87 -0
  127. data/spec/rapid/template/parser_spec.rb +187 -0
  128. data/spec/rapid/template/pulling/base_spec.rb +81 -0
  129. data/spec/rapid/template/pulling/explicit_spec.rb +33 -0
  130. data/spec/rapid/template/pulling/forgiving_spec.rb +132 -0
  131. data/spec/spec_helper.rb +10 -0
  132. metadata +325 -0
@@ -0,0 +1,167 @@
1
+ module Rapid
2
+ module Template
3
+
4
+ class Parser
5
+
6
+ def initialize content
7
+ @content = content.clone
8
+ @is_first = true
9
+ end
10
+
11
+ def parse
12
+ Engine.new(@content).root
13
+ end
14
+
15
+ class Engine < Erubis::Basic::Engine
16
+
17
+ def initialize *args
18
+ @nodes = []
19
+ @stack = [@nodes]
20
+ super *args
21
+ end
22
+
23
+ def root
24
+ Template::Node::Root.new @nodes
25
+ end
26
+
27
+ protected
28
+
29
+ def add_preamble buf
30
+
31
+ end
32
+
33
+ def add_postamble buf
34
+
35
+ end
36
+
37
+ def add_text buf, text
38
+ push_node Node::Static.new(text) unless text.empty?
39
+ end
40
+
41
+ def add_expr buf, e, indicator
42
+ case indicator
43
+ when "="
44
+ push_variable e.strip
45
+ else
46
+ raise UnknownMethodTemplateError.new("unknown method #{indicator} #{e}")
47
+ end
48
+ end
49
+
50
+ def add_stmt buf, code
51
+ code.strip!
52
+
53
+ if code == "end"
54
+ pop_node
55
+
56
+ elsif code =~ /^if /
57
+ push_if $'
58
+
59
+ elsif code =~ /^elsif /
60
+ push_elsif $'
61
+
62
+
63
+ elsif code =~ /^else/
64
+ push_else
65
+
66
+ elsif code.empty?
67
+ # do nothing
68
+
69
+ else
70
+ raise UnknownMethodTemplateError.new("unknown method #{code.inspect}")
71
+ end
72
+ end
73
+
74
+ def push_node node
75
+ array = nil
76
+
77
+ current = @stack.last
78
+ if current.is_a? Array
79
+ array = current
80
+
81
+ elsif current.is_a? Hash
82
+ case current[:type]
83
+ when :if
84
+
85
+ if current[:else] != nil
86
+ array = current[:else]
87
+ elsif current[:elsif].last
88
+ array = current[:elsif].last[:then]
89
+ else
90
+ array = current[:then]
91
+ end
92
+
93
+ end
94
+ end
95
+
96
+ if node.is_a?(Node::Static) && array.last.is_a?(Node::Static)
97
+ prev = array.pop
98
+ node = Node::Static.new(prev.content + node.content)
99
+ end
100
+
101
+ array.push node
102
+ end
103
+
104
+ def push_variable code
105
+ if code =~ /^comment_unless /
106
+ node = Node::CommentNode.new(false, $')
107
+ elsif code =~ /^comment_if /
108
+ node = Node::CommentNode.new(true, $')
109
+ else
110
+ node = Node::Variable.new(code)
111
+ end
112
+
113
+ push_node node
114
+ end
115
+
116
+ def pop_node
117
+ node = build_node @stack.pop
118
+ push_node node
119
+ end
120
+
121
+ def build_node node
122
+ case node[:type]
123
+ when :if
124
+ build_if_node node
125
+ end
126
+ end
127
+
128
+ def build_if_node node
129
+ else_node = node[:else]
130
+
131
+ node[:elsif].reverse_each do |n|
132
+ else_node = Node::IfNode.new n[:statement], n[:then], else_node
133
+ end
134
+
135
+ Node::IfNode.new node[:statement], node[:then], else_node
136
+ end
137
+
138
+ def push_if statement
139
+ @stack.push :type => :if, :statement => statement, :then => [], :elsif => []
140
+ end
141
+
142
+ def push_elsif statement
143
+ if_node = self.current_if
144
+ if_node[:elsif].push :statement => statement, :then => []
145
+ end
146
+
147
+ def push_else
148
+ if_node = self.current_if
149
+ if_node[:else] ||= [] if if_node
150
+ end
151
+
152
+ def current_if
153
+ if_node = nil
154
+ @stack.reverse_each do |d|
155
+ if d.is_a?(Hash) && d[:type] == :if
156
+ if_node ||= d
157
+ end
158
+ end
159
+ if_node
160
+ end
161
+
162
+ end
163
+
164
+ end
165
+
166
+ end
167
+ end
@@ -0,0 +1,91 @@
1
+ module Rapid
2
+ module Template
3
+ module Pulling
4
+
5
+ class Base
6
+
7
+ attr_reader :result, :previous_content
8
+
9
+ delegate :[], :to => :result
10
+ delegate :[]=, :to => :result
11
+
12
+ def initialize content
13
+ @result = {}
14
+ @previous_content = ""
15
+ end
16
+
17
+ def key? key
18
+ @result.key? key
19
+ end
20
+
21
+ def to_hash
22
+ remove_covered_namespaces!
23
+ @result
24
+ end
25
+
26
+ def raise_not_matching content
27
+ raise Rapid::NotMatchingTemplateError.new(result, content, self.content, :previous => previous_content)
28
+ end
29
+
30
+ def content
31
+ raise NotImplementedError.new
32
+ end
33
+
34
+ def index content
35
+ raise NotImplementedError.new
36
+ end
37
+
38
+ def starts_with? content
39
+ raise NotImplementedError.new
40
+ end
41
+
42
+ def starts_with content
43
+ raise NotImplementedError.new
44
+ end
45
+
46
+ def move! count
47
+ raise NotImplementedError.new
48
+ end
49
+
50
+ def match content
51
+ raise NotImplementedError.new
52
+ end
53
+
54
+ def match! content
55
+ raise NotImplementedError.new
56
+ end
57
+
58
+ def empty!
59
+ raise NotImplementedError.new
60
+ end
61
+
62
+ protected
63
+
64
+ # remove results that cover other nested results:
65
+ # {"app.author"=>true, "app.author.name"=>"Dan"}
66
+ # would remove app.author
67
+ def remove_covered_namespaces!
68
+ # TODO clean up
69
+
70
+ remove = []
71
+ @result.keys.each do |key|
72
+ is_covering = false
73
+ start = "#{key}."
74
+
75
+ covered_keys = @result.keys.each do |k|
76
+ is_covering = is_covering || k.starts_with?(start)
77
+ end
78
+
79
+ remove.push key if is_covering
80
+ end
81
+
82
+ remove.each do |key|
83
+ @result.delete key
84
+ end
85
+ end
86
+
87
+ end
88
+
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,92 @@
1
+ module Rapid
2
+ module Template
3
+ module Pulling
4
+
5
+ class Explicit < Base
6
+
7
+ attr_reader :content, :previous_content
8
+
9
+ def initialize content
10
+ super
11
+ @content = content.clone
12
+ @previous_content = ""
13
+ end
14
+
15
+ def index content
16
+ @content.index content
17
+ end
18
+
19
+ def starts_with? content
20
+ @content.starts_with? content
21
+ end
22
+
23
+ def starts_with content
24
+ content.length if @content.starts_with? content
25
+ end
26
+
27
+ def move! count
28
+ return 0 if count == 0
29
+
30
+ matched = @content.slice!(0..count-1)
31
+ @previous_content << matched
32
+ @previous_content = @previous_content[@previous_content.length - 50..-1] if @previous_content.length > 50
33
+ count
34
+ end
35
+
36
+ def match content
37
+ internal_match @content, content
38
+ end
39
+
40
+ def match! content
41
+ result, a, b = match content
42
+ unless result
43
+ raise_not_matching content
44
+ end
45
+
46
+ move! a
47
+ end
48
+
49
+ def empty!
50
+ unless @content.nil? || @content.empty?
51
+ raise_not_matching ""
52
+ end
53
+ end
54
+
55
+ def raise_not_matching content
56
+ failure, a_count, b_count = internal_match_miss @content, content
57
+
58
+ if a_count > 0
59
+ move! a_count
60
+ end
61
+
62
+ if b_count > 0
63
+ content = content[b_count..-1]
64
+ end
65
+
66
+ raise Rapid::NotMatchingTemplateError.new(result, content, @content, :previous => @previous_content)
67
+ end
68
+
69
+ protected
70
+
71
+ def internal_match a, b
72
+ if a.starts_with? b
73
+ return true, b.length, b.length
74
+ else
75
+ internal_match_miss a, b
76
+ end
77
+ end
78
+
79
+ def internal_match_miss a, b
80
+ count = 0
81
+ while a.length > count && b.length > count && a[count] == b[count]
82
+ count += 1
83
+ end
84
+
85
+ return false, count, count
86
+ end
87
+
88
+ end
89
+
90
+ end
91
+ end
92
+ end
@@ -0,0 +1,58 @@
1
+ module Rapid
2
+ module Template
3
+ module Pulling
4
+
5
+ class Forgiving < Explicit
6
+
7
+ def match content
8
+ result, a, b = super content
9
+ return result, a, b if result
10
+
11
+ if @content =~ starts_with_newline_regex
12
+ len = $1.length
13
+ result, a, b = internal_match $', content
14
+ a += len
15
+ return result, a, b
16
+
17
+ elsif content =~ starts_with_newline_regex
18
+ len = $1.length
19
+ result, a, b = internal_match @content, $'
20
+ b += len
21
+ return result, a, b
22
+
23
+ else
24
+ return result, a, b
25
+ end
26
+ end
27
+
28
+ protected
29
+
30
+ def starts_with_newline_regex
31
+ /\A([\ ]*[\n]+)/
32
+ end
33
+
34
+ def internal_match_miss a, b
35
+ a_count = 0
36
+ b_count = 0
37
+
38
+ if a =~ starts_with_newline_regex
39
+ a_count += $1.length
40
+ end
41
+
42
+ if b =~ starts_with_newline_regex
43
+ b_count += $1.length
44
+ end
45
+
46
+ while a.length > a_count && b.length > b_count && a[a_count] == b[b_count]
47
+ a_count += 1
48
+ b_count += 1
49
+ end
50
+
51
+ return false, a_count, b_count
52
+ end
53
+
54
+ end
55
+
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,3 @@
1
+ module Rapid
2
+ VERSION = "0.1"
3
+ end
data/lib/rapid.rb ADDED
@@ -0,0 +1,37 @@
1
+ require 'yaml'
2
+ require 'erubis'
3
+ require 'active_support/core_ext/string'
4
+ require 'active_support/core_ext/hash/indifferent_access'
5
+ require 'active_model'
6
+
7
+ require "rapid/version"
8
+ require "rapid/error"
9
+ require "rapid/module"
10
+
11
+ require "rapid/settings"
12
+ require "rapid/check"
13
+
14
+ require "rapid/skeleton/helpers/directory"
15
+ require "rapid/skeleton/helpers/gem"
16
+ require "rapid/skeleton/helpers/migration"
17
+ require "rapid/skeleton/helpers/route"
18
+ require "rapid/skeleton/helpers/script"
19
+ require "rapid/skeleton/helpers/template"
20
+ require "rapid/skeleton/helpers/view"
21
+ require "rapid/skeleton/base"
22
+
23
+ require "rapid/template/base"
24
+ require "rapid/template/parser"
25
+
26
+ require "rapid/template/pulling/base"
27
+ require "rapid/template/pulling/explicit"
28
+ require "rapid/template/pulling/forgiving"
29
+
30
+ require "rapid/template/node/base"
31
+ require "rapid/template/node/root"
32
+ require "rapid/template/node/static"
33
+ require "rapid/template/node/variable"
34
+ require "rapid/template/node/if_node"
35
+ require "rapid/template/node/comment_node"
36
+
37
+ require 'rapid/railtie' if defined? Rails
@@ -0,0 +1,26 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "rapid/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "rapid-core"
7
+ s.version = Rapid::VERSION
8
+ s.authors = ["Dan Cunning"]
9
+ s.email = ["dancunning@gmail.com"]
10
+ s.homepage = ""
11
+ s.summary = %q{Code that understands code and can change it programmatically}
12
+ s.description = %q{Code that understands code and can change it programmatically}
13
+
14
+ s.rubyforge_project = "rapid-core"
15
+
16
+ s.files = `git ls-files`.split("\n")
17
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
+ s.require_paths = ["lib"]
20
+
21
+ # specify any dependencies here; for example:
22
+ s.add_dependency("activesupport", ">= 3.0")
23
+ s.add_dependency("activemodel", ">= 3.0")
24
+ s.add_dependency("i18n")
25
+ s.add_dependency("erubis")
26
+ end
@@ -0,0 +1,119 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ describe Rapid::Check do
4
+
5
+ after do
6
+ Rapid::Check.instance_variable_set :@current, nil
7
+ end
8
+
9
+ describe "new_with_detection" do
10
+
11
+ after do
12
+ FileUtils.rm_rf('rapid.rb')
13
+ FileUtils.rm_rf('foo.rb')
14
+ Rapid::Check.file = nil
15
+ end
16
+
17
+ it "should raise an error when nothing is setup" do
18
+ lambda { Rapid::Check.new_with_detection }.should raise_error(Rapid::FileNotFoundCheckError)
19
+ end
20
+
21
+ it "should be Rapid::Check.file if it's set" do
22
+ File.open('foo.rb', 'w') {|f| f.write('hi') }
23
+ Rapid::Check.file = 'foo.rb'
24
+ Rapid::Check.new_with_detection.code.should == 'hi'
25
+ end
26
+
27
+ it "should be one of the custom files if it exists" do
28
+ File.open('rapid.rb', 'w') {|f| f.write('hi') }
29
+ Rapid::Check.new_with_detection.code.should == 'hi'
30
+ end
31
+
32
+ end
33
+
34
+ describe "valid?" do
35
+
36
+ after do
37
+ FileUtils.rm_rf('rapid.rb')
38
+ end
39
+
40
+ it "should allow the code to add errors" do
41
+ @check = Rapid::Check.new "Rapid::Check.current.error 'config.rb', 'is missing'"
42
+ @check.valid?.should == false
43
+ end
44
+
45
+ it "should not let Rapid::Check.current linger" do
46
+ @check = Rapid::Check.new ""
47
+ @check.valid?.should == true
48
+ Rapid::Check.current.should == nil
49
+ end
50
+
51
+ it "should not catch problems in the code" do
52
+ @check = Rapid::Check.new "foo"
53
+ lambda { @check.valid? }.should raise_error(NameError)
54
+ end
55
+
56
+ it "should output to the console if asked" do
57
+ @check = Rapid::Check.new %(
58
+ Rapid::Check.current.ok 'config.rb', 'is great!'
59
+ Rapid::Check.current.warning 'config.rb', 'is missing'
60
+ Rapid::Check.current.error 'config.rb', 'is broken!'
61
+ ), :console => true
62
+
63
+ Rapid.should_receive(:color_puts).exactly(5).times
64
+ @check.valid?.should == false
65
+ @check.check_count.should == 3
66
+ end
67
+
68
+ it "should accept exceptions" do
69
+ Rapid.should_receive(:color_puts).exactly(9).times
70
+
71
+ @exception = Rapid::NotMatchingTemplateError.new({"foo" => "bar" * 40, 4 => "foo"}, "", "bar")
72
+ @check = Rapid::Check.new "", :console => true
73
+ @check.exception "my.rb", @exception
74
+ end
75
+
76
+ it "should output with indention" do
77
+ @check = Rapid::Check.new %(
78
+ Rapid::Check.current.with_section("app") do
79
+ Rapid::Check.current.ok 'config.rb', 'is great!'
80
+ end
81
+ ), :console => true
82
+
83
+ @check.should_receive(:puts).with("")
84
+ @check.should_receive(:puts).with("app")
85
+ Rapid.should_receive(:color_puts).with(:ok, " config.rb is great!")
86
+ @check.valid?.should == true
87
+ end
88
+
89
+ it "should track the amount of calls" do
90
+ @check = Rapid::Check.new %(
91
+ Rapid::Check.current.ok 'config.rb', 'is great!'
92
+ Rapid::Check.current.ok 'config.rb', 'is great!'
93
+ Rapid::Check.current.ok 'config.rb', 'is great!'
94
+
95
+ Rapid::Check.current.warning 'config.rb', 'is missing'
96
+ Rapid::Check.current.warning 'config.rb', 'is missing'
97
+
98
+ Rapid::Check.current.error 'config.rb', 'is broken!'
99
+ )
100
+
101
+ @check.valid?.should == false
102
+ @check.ok_count.should == 3
103
+ @check.warning_count.should == 2
104
+ @check.error_count.should == 1
105
+ end
106
+
107
+ end
108
+
109
+ it "should tell whether encounters an error" do
110
+ @check = Rapid::Check.new ""
111
+ Rapid::Check.current = @check
112
+ Rapid::Check.encounters_error? { @check.error 'hi', 'hi' }.should == true
113
+
114
+ @check = Rapid::Check.new ""
115
+ Rapid::Check.current = @check
116
+ Rapid::Check.encounters_error? { @check.warning 'hi', 'hi' }.should == false
117
+ end
118
+
119
+ end
@@ -0,0 +1,14 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ describe Rapid::Exception do
4
+
5
+ describe "NotMatchingTemplateError" do
6
+
7
+ it "should have a message" do
8
+ @error = Rapid::NotMatchingTemplateError.new({}, "", "")
9
+ @error.message.class.should == String
10
+ end
11
+
12
+ end
13
+
14
+ end
@@ -0,0 +1,28 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ describe Rapid do
4
+
5
+ describe "puts" do
6
+
7
+ it "should puts ok" do
8
+ Rapid.should_receive(:puts).with("\e[32mhi\e[0m")
9
+ Rapid.color_puts :ok, "hi"
10
+ end
11
+
12
+ it "should puts warning" do
13
+ Rapid.should_receive(:puts).with("\e[33mhi\e[0m")
14
+ Rapid.color_puts :warning, "hi"
15
+ end
16
+
17
+ it "should puts error" do
18
+ Rapid.should_receive(:puts).with("\e[31mhi\e[0m")
19
+ Rapid.color_puts :error, "hi"
20
+ end
21
+
22
+ it "should raise an error when invalid type" do
23
+ lambda { Rapid.color_puts(:invalid, "hi") }.should raise_error
24
+ end
25
+
26
+ end
27
+
28
+ end
@@ -0,0 +1,17 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
+
3
+ describe Rapid::Setting::Base do
4
+
5
+ it "should throw an error when loading" do
6
+ lambda { Rapid::Setting::Base.new("foo").load("hi") }.should raise_error
7
+ end
8
+
9
+ it "should not allow settings named _root" do
10
+ lambda { Rapid::Setting::Base.new("_root") }.should raise_error(ArgumentError)
11
+ end
12
+
13
+ it "should not allow settings named valid" do
14
+ lambda { Rapid::Setting::Base.new("valid") }.should raise_error(ArgumentError)
15
+ end
16
+
17
+ end