waw 0.2.2

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 (199) hide show
  1. data/LICENCE.rdoc +25 -0
  2. data/README.rdoc +32 -0
  3. data/bin/waw +32 -0
  4. data/bin/waw-profile +26 -0
  5. data/bin/waw-start +26 -0
  6. data/bin/wspec +33 -0
  7. data/layouts/empty/Rakefile +14 -0
  8. data/layouts/empty/config.ru +5 -0
  9. data/layouts/empty/config/commons.cfg +31 -0
  10. data/layouts/empty/config/devel.cfg +21 -0
  11. data/layouts/empty/ignore +7 -0
  12. data/layouts/empty/logs/dontforgetme +0 -0
  13. data/layouts/empty/resources/messages.rs +1 -0
  14. data/layouts/empty/test/wspec/site_respond.wspec +3 -0
  15. data/layouts/empty/test/wspec/test_all.rb +13 -0
  16. data/layouts/empty/waw.deploy +1 -0
  17. data/layouts/empty/waw.routing +6 -0
  18. data/layouts/static/dependencies +1 -0
  19. data/layouts/static/public/.wawaccess +18 -0
  20. data/layouts/static/public/css/style.css +0 -0
  21. data/layouts/static/public/images/dontforgetme +0 -0
  22. data/layouts/static/public/js/project.js +0 -0
  23. data/layouts/static/public/pages/.wawaccess +30 -0
  24. data/layouts/static/public/pages/404.wtpl +1 -0
  25. data/layouts/static/public/pages/index.wtpl +5 -0
  26. data/layouts/static/public/templates/.wawaccess +9 -0
  27. data/layouts/static/public/templates/layout.wtpl +17 -0
  28. data/layouts/static/test/wspec/static_pages_are_served.wspec +21 -0
  29. data/layouts/static/waw.routing +8 -0
  30. data/lib/waw.rb +99 -0
  31. data/lib/waw/commands/command.rb +115 -0
  32. data/lib/waw/commands/profile_command.rb +66 -0
  33. data/lib/waw/commands/start_command.rb +59 -0
  34. data/lib/waw/config.rb +110 -0
  35. data/lib/waw/controller.rb +25 -0
  36. data/lib/waw/controllers/action/action.rb +91 -0
  37. data/lib/waw/controllers/action/action_utils.rb +30 -0
  38. data/lib/waw/controllers/action/js_generation.rb +116 -0
  39. data/lib/waw/controllers/action_controller.rb +133 -0
  40. data/lib/waw/controllers/error/backtrace.rb +54 -0
  41. data/lib/waw/controllers/error_handler.rb +62 -0
  42. data/lib/waw/controllers/json_controller.rb +31 -0
  43. data/lib/waw/controllers/no_cache.rb +22 -0
  44. data/lib/waw/controllers/static/match.rb +80 -0
  45. data/lib/waw/controllers/static/waw_access.rb +235 -0
  46. data/lib/waw/controllers/static/waw_access_dsl.rb +48 -0
  47. data/lib/waw/controllers/static_controller.rb +37 -0
  48. data/lib/waw/default_config.cfg +14 -0
  49. data/lib/waw/environment_utils.rb +57 -0
  50. data/lib/waw/errors.rb +4 -0
  51. data/lib/waw/ext.rb +3 -0
  52. data/lib/waw/ext/core.rb +4 -0
  53. data/lib/waw/ext/core/hash.rb +47 -0
  54. data/lib/waw/ext/core/logger.rb +10 -0
  55. data/lib/waw/ext/core/module.rb +20 -0
  56. data/lib/waw/ext/core/object.rb +29 -0
  57. data/lib/waw/ext/rack.rb +19 -0
  58. data/lib/waw/ext/rack/builder.rb +43 -0
  59. data/lib/waw/ext/rack/delegator.rb +51 -0
  60. data/lib/waw/ext/rack/urlmap.rb +55 -0
  61. data/lib/waw/ext/wlang.rb +1 -0
  62. data/lib/waw/ext/wlang/hosted_language.rb +21 -0
  63. data/lib/waw/fullstate.rb +8 -0
  64. data/lib/waw/fullstate/on_class.rb +37 -0
  65. data/lib/waw/fullstate/on_instance.rb +27 -0
  66. data/lib/waw/fullstate/variable.rb +36 -0
  67. data/lib/waw/kern.rb +6 -0
  68. data/lib/waw/kern/app.rb +48 -0
  69. data/lib/waw/kern/empty/waw.deploy +0 -0
  70. data/lib/waw/kern/empty/waw.routing +1 -0
  71. data/lib/waw/kern/freezed_state.rb +32 -0
  72. data/lib/waw/kern/hooks.rb +53 -0
  73. data/lib/waw/kern/lifecycle.rb +248 -0
  74. data/lib/waw/kern/living_state.rb +87 -0
  75. data/lib/waw/kern/utils.rb +27 -0
  76. data/lib/waw/resource_collection.rb +100 -0
  77. data/lib/waw/restart.rb +32 -0
  78. data/lib/waw/routing.rb +43 -0
  79. data/lib/waw/routing/action_routing.rb +78 -0
  80. data/lib/waw/routing/dsl.rb +45 -0
  81. data/lib/waw/routing/feedback.rb +23 -0
  82. data/lib/waw/routing/form_validation_feedback.rb +36 -0
  83. data/lib/waw/routing/javascript.rb +17 -0
  84. data/lib/waw/routing/redirect.rb +26 -0
  85. data/lib/waw/routing/refresh.rb +17 -0
  86. data/lib/waw/routing/routing_rule.rb +16 -0
  87. data/lib/waw/scope_utils.rb +69 -0
  88. data/lib/waw/session.rb +51 -0
  89. data/lib/waw/testing.rb +1 -0
  90. data/lib/waw/tools/mail.rb +4 -0
  91. data/lib/waw/tools/mail/mail.rb +119 -0
  92. data/lib/waw/tools/mail/mail_agent.rb +123 -0
  93. data/lib/waw/tools/mail/mailbox.rb +62 -0
  94. data/lib/waw/tools/mail/template.rb +38 -0
  95. data/lib/waw/utils/dsl_helper.rb +116 -0
  96. data/lib/waw/validation.rb +175 -0
  97. data/lib/waw/validation/and_validator.rb +27 -0
  98. data/lib/waw/validation/array_validations.rb +38 -0
  99. data/lib/waw/validation/boolean_validator.rb +32 -0
  100. data/lib/waw/validation/comparison_validations.rb +45 -0
  101. data/lib/waw/validation/date_validator.rb +31 -0
  102. data/lib/waw/validation/default_validator.rb +30 -0
  103. data/lib/waw/validation/dsl_ruby_extensions.rb +11 -0
  104. data/lib/waw/validation/errors.rb +17 -0
  105. data/lib/waw/validation/ext.rb +3 -0
  106. data/lib/waw/validation/file_validator.rb +30 -0
  107. data/lib/waw/validation/float_validator.rb +19 -0
  108. data/lib/waw/validation/helpers.rb +67 -0
  109. data/lib/waw/validation/integer_validator.rb +16 -0
  110. data/lib/waw/validation/isin_validator.rb +24 -0
  111. data/lib/waw/validation/mandatory_validator.rb +17 -0
  112. data/lib/waw/validation/missing_validator.rb +17 -0
  113. data/lib/waw/validation/not_validator.rb +20 -0
  114. data/lib/waw/validation/or_validator.rb +34 -0
  115. data/lib/waw/validation/regexp_validator.rb +29 -0
  116. data/lib/waw/validation/same_validator.rb +16 -0
  117. data/lib/waw/validation/signature.rb +157 -0
  118. data/lib/waw/validation/size_validations.rb +44 -0
  119. data/lib/waw/validation/string_validator.rb +15 -0
  120. data/lib/waw/validation/validator.rb +48 -0
  121. data/lib/waw/wawgen.rb +2 -0
  122. data/lib/waw/wawgen/create.rb +166 -0
  123. data/lib/waw/wawgen/project.rb +25 -0
  124. data/lib/waw/wspec.rb +5 -0
  125. data/lib/waw/wspec/browser.rb +240 -0
  126. data/lib/waw/wspec/dsl.rb +201 -0
  127. data/lib/waw/wspec/html_analysis.rb +136 -0
  128. data/lib/waw/wspec/html_analysis/tag.rb +56 -0
  129. data/lib/waw/wspec/runner.rb +70 -0
  130. data/lib/waw/wspec/scenario.rb +35 -0
  131. data/lib/waw/wspec/suite.rb +54 -0
  132. data/test/bricks/error_handler/config/test.cfg +2 -0
  133. data/test/bricks/error_handler/logs/webapp.log +1411 -0
  134. data/test/bricks/error_handler/test/error_handler.wspec +16 -0
  135. data/test/bricks/error_handler/waw.deploy +1 -0
  136. data/test/bricks/error_handler/waw.routing +27 -0
  137. data/test/integration/waw_create_integration_test.rb +24 -0
  138. data/test/spec/assumptions_spec.rb +30 -0
  139. data/test/spec/controllers/action_controller_spec.rb +14 -0
  140. data/test/spec/controllers/static/waw_access_spec.rb +112 -0
  141. data/test/spec/environment_utils_spec.rb +15 -0
  142. data/test/spec/ext/core/hash_spec.rb +58 -0
  143. data/test/spec/fixtures.rb +41 -0
  144. data/test/spec/fixtures/action/config/default.cfg +2 -0
  145. data/test/spec/fixtures/action/lib/action_controller_test.rb +12 -0
  146. data/test/spec/fixtures/action/waw.deploy +1 -0
  147. data/test/spec/fixtures/action/waw.routing +6 -0
  148. data/test/spec/fixtures/empty/waw.deploy +0 -0
  149. data/test/spec/fixtures/empty/waw.routing +0 -0
  150. data/test/spec/fullstate/on_class_spec.rb +59 -0
  151. data/test/spec/fullstate/on_instance_spec.rb +59 -0
  152. data/test/spec/fullstate/session_spec.rb +43 -0
  153. data/test/spec/fullstate/variable_spec.rb +55 -0
  154. data/test/spec/resource_collection_spec.rb +50 -0
  155. data/test/spec/test_all.rb +9 -0
  156. data/test/spec/tools/mail/mail_agent_spec.rb +116 -0
  157. data/test/spec/tools/mail/mail_spec.rb +56 -0
  158. data/test/spec/tools/mail/mailbox_spec.rb +57 -0
  159. data/test/spec/tools/mail/template_spec.rb +47 -0
  160. data/test/spec/validation/array_validation_spec.rb +63 -0
  161. data/test/spec/validation/array_validator_spec.rb +17 -0
  162. data/test/spec/validation/date_validation_spec.rb +35 -0
  163. data/test/spec/validation/default_validation_spec.rb +37 -0
  164. data/test/spec/validation/disjuctive_validation_spec.rb +33 -0
  165. data/test/spec/validation/errors_spec.rb +37 -0
  166. data/test/spec/validation/file_validator_spec.rb +34 -0
  167. data/test/spec/validation/mail_validation_spec.rb +51 -0
  168. data/test/spec/validation/missing_validation_spec.rb +43 -0
  169. data/test/spec/validation/same_validation_spec.rb +24 -0
  170. data/test/spec/validation/signature_intuition_spec.rb +37 -0
  171. data/test/spec/validation/signature_spec.rb +164 -0
  172. data/test/spec/validation/validation_spec.rb +28 -0
  173. data/test/spec/wspec/html_analysis/tag_spec.rb +38 -0
  174. data/test/spec/wspec/html_analysis_spec.rb +170 -0
  175. data/test/unit/test_all.rb +8 -0
  176. data/test/unit/waw/app_test.rb +126 -0
  177. data/test/unit/waw/app_test/config/commons.cfg +2 -0
  178. data/test/unit/waw/app_test/config/devel.cfg +1 -0
  179. data/test/unit/waw/config_test.rb +54 -0
  180. data/test/unit/waw/controllers/action_controller_test.rb +76 -0
  181. data/test/unit/waw/controllers/action_test.rb +35 -0
  182. data/test/unit/waw/controllers/example_action_controller_test.rb +24 -0
  183. data/test/unit/waw/controllers/multiple_action_controller_test.rb +78 -0
  184. data/test/unit/waw/controllers/static/example/css/example.css +1 -0
  185. data/test/unit/waw/controllers/static/example/index.html +1 -0
  186. data/test/unit/waw/controllers/static/example/js/example.js +1 -0
  187. data/test/unit/waw/controllers/static/example/pages/hello.wtpl +1 -0
  188. data/test/unit/waw/controllers/static/waw_access_test.rb +76 -0
  189. data/test/unit/waw/ext/rack_test.rb +74 -0
  190. data/test/unit/waw/resource_collection_test.rb +49 -0
  191. data/test/unit/waw/resources.txt +4 -0
  192. data/test/unit/waw/routing/routing_test.rb +26 -0
  193. data/test/unit/waw/utils/dsl_helper_test.rb +79 -0
  194. data/test/unit/waw/utils/dsl_helper_test_extensions1.rb +4 -0
  195. data/test/unit/waw/validation/signature_test.rb +193 -0
  196. data/test/unit/waw/validation_test.rb +319 -0
  197. data/test/unit/waw/wspec/html_analysis_test.html +81 -0
  198. data/test/unit/waw/wspec/html_analysis_test.rb +26 -0
  199. metadata +272 -0
@@ -0,0 +1,27 @@
1
+ module Waw
2
+ module Kern
3
+ #
4
+ # Utilities of the waw kernel
5
+ #
6
+ module Utils
7
+
8
+ #
9
+ # Finds the root of the waw application by traversing the file system
10
+ # up from _from_ until a waw.deploy file can be found. Returns the
11
+ # root_folder that contains the waw.deploy file.
12
+ #
13
+ # This method raises a WawError if the waw.deploy file cannot be found.
14
+ #
15
+ def find_web_root(from)
16
+ web_root = File.expand_path(from)
17
+ from = File.dirname(from) if File.file?(from)
18
+ until File.exists?(File.join(web_root, 'waw.deploy')) or File.exists?(File.join(web_root, 'wawdeploy'))
19
+ web_root = File.expand_path(File.join(web_root, '..'))
20
+ raise WawError, "Unable to find waw.deploy file from folder #{from}" if web_root == '/'
21
+ end
22
+ web_root
23
+ end
24
+
25
+ end # module Utils
26
+ end # module Kern
27
+ end # module Waw
@@ -0,0 +1,100 @@
1
+ module Waw
2
+ # Localized resources
3
+ class ResourceCollection
4
+
5
+ # DSL for resources
6
+ class DSL
7
+
8
+ # Creates a DSL instance
9
+ def initialize(resources)
10
+ @resources = resources
11
+ end
12
+
13
+ # Adds a resource to the collection
14
+ def method_missing(name, *args, &block)
15
+ if args.length==0 and block.nil?
16
+ @resources.send(name)
17
+ elsif args.length==1 and block.nil?
18
+ @resources.send(:add_resource, name, args[0])
19
+ elsif args.length==0 and block
20
+ @resources.send(:add_resource, name, nil, &block)
21
+ elsif block
22
+ raise ArgumentError, "Bad resources usage on #{name} #{args.inspect} #{block.inspect}"
23
+ end
24
+ end
25
+
26
+ end # class Resources
27
+
28
+ # Resource name
29
+ attr_reader :__name
30
+
31
+ # Creates a resource collection
32
+ def initialize(name = "unnamed")
33
+ @resources = {}
34
+ @__name = name
35
+ end
36
+
37
+ # Yields the block with each resource key,value pair
38
+ def each
39
+ @resources.each_pair {|k, v| yield(k, v)}
40
+ end
41
+ alias :each_pair :each
42
+
43
+ # Returns the resource installed under name
44
+ def [](name)
45
+ @resources[name]
46
+ end
47
+
48
+ # Checks if a resource exists
49
+ def has_resource?(name)
50
+ @resources.has_key?(name)
51
+ end
52
+
53
+ # Add a resource
54
+ def add_resource(name, value, &block)
55
+ if not(value.nil?) and block.nil?
56
+ @resources[name.to_s.to_sym] = value
57
+ self.instance_eval <<-EOF
58
+ def #{name}
59
+ @resources[:#{name}]
60
+ end
61
+ EOF
62
+ elsif value.nil? and not(block.nil?)
63
+ @resources[name.to_s.to_sym] = block
64
+ self.instance_eval <<-EOF
65
+ def #{name}
66
+ @resources[:#{name}].call(self)
67
+ end
68
+ EOF
69
+ else
70
+ raise ArgumentError, "ResourceCollection.add_resource expects one argument or a block"
71
+ end
72
+ end
73
+
74
+ # Logs a friendly message and returns nil
75
+ def method_missing(name, *args)
76
+ if args.size==1
77
+ args[0]
78
+ elsif args.size==0
79
+ Waw.logger.warn("No such resource #{name} on #{@__name}, (#{caller[0]})")
80
+ nil
81
+ else
82
+ super
83
+ end
84
+ end
85
+
86
+ # Parses some resource string
87
+ def self.parse_resources(str, name = "unnamed")
88
+ r = ResourceCollection.new(name)
89
+ DSL.new(r).instance_eval str
90
+ r
91
+ end
92
+
93
+ # Parses a resource file
94
+ def self.parse_resource_file(f, name=File.basename(f, '.rs'))
95
+ parse_resources File.read(f), name
96
+ end
97
+
98
+ private :add_resource
99
+ end # class ResourceCollection
100
+ end # module Waw
@@ -0,0 +1,32 @@
1
+ module Waw
2
+ class Restart
3
+ include ::Rack::Delegator
4
+
5
+ # Default options
6
+ DEFAULT_OPTIONS = { :when => :always }
7
+
8
+ # Creates a restarter instance
9
+ def initialize(app, opts = {}, lock = Mutex.new)
10
+ @options = DEFAULT_OPTIONS.merge(opts)
11
+ @app = app
12
+ @lock = lock
13
+ end
14
+
15
+ # Should I need to restart?
16
+ def restart?
17
+ @options[:when] == :always
18
+ end
19
+
20
+ # Handle the call
21
+ def call(env)
22
+ if restart?
23
+ @lock.synchronize do
24
+ root_folder = Waw.root_folder
25
+ Waw.reload
26
+ end
27
+ end
28
+ @app.call(env)
29
+ end
30
+
31
+ end # class Restart
32
+ end # module Waw
@@ -0,0 +1,43 @@
1
+ require 'waw/routing/dsl'
2
+ require 'waw/routing/action_routing'
3
+ require 'waw/routing/routing_rule'
4
+ require 'waw/routing/feedback'
5
+ require 'waw/routing/form_validation_feedback'
6
+ require 'waw/routing/refresh'
7
+ require 'waw/routing/redirect'
8
+ require 'waw/routing/javascript'
9
+ module Waw
10
+ module Routing
11
+ module Methods
12
+
13
+ # Checks if a service response matches some expected pattern
14
+ def matches?(what, json_response = self)
15
+ raise ArgumentError, "Array expected as json_response (#{json_response.inspect} found)" unless Array===json_response
16
+ json_response = json_response.dup
17
+ what.split('/').each do |elm|
18
+ return false if json_response.empty?
19
+ case part = json_response.shift
20
+ when String, Symbol
21
+ if elm == '*'
22
+ # always ok here
23
+ else
24
+ return false unless part.to_s==elm.to_s
25
+ end
26
+ when Array
27
+ if elm == '*'
28
+ return false if part.empty?
29
+ else
30
+ return false unless part.any?{|e| e.to_s == elm.to_s} or (elm=='*')
31
+ end
32
+ else
33
+ raise ArgumentError, "Unexpected part in json_response #{part}"
34
+ end
35
+ end
36
+ true
37
+ end
38
+ alias :=~ :matches?
39
+
40
+ end # module Methods
41
+ extend Methods
42
+ end # module Routing
43
+ end # module Waw
@@ -0,0 +1,78 @@
1
+ module Waw
2
+ module Routing
3
+
4
+ #
5
+ # Routing rules installed on an action
6
+ #
7
+ class ActionRouting
8
+
9
+ # Creates an empty routing table. If a block is given, executes it
10
+ # as a Routing DSL
11
+ def initialize(&block)
12
+ @rules = {}
13
+ DSL.new(self).instance_eval(&block) if block
14
+ end
15
+
16
+ # Add some routing rules
17
+ def add_rules(action_results, exec)
18
+ action_results.each {|actr| @rules[actr] = exec}
19
+ end
20
+
21
+ def generate_js_if_then_else(table, key, level = 0, align = 0)
22
+ case table
23
+ when Hash
24
+ if table.size==1 and table.has_key?('*')
25
+ generate_js_if_then_else(table['*'], key, level, align)
26
+ else
27
+ first, buffer, space = true, "", " "
28
+
29
+ # normal table
30
+ table.each do |key, n|
31
+ next if key=='*'
32
+ code = "#{first ? space*align : ' else '}if (data[#{level}] == '#{key}') {\n" +
33
+ "#{generate_js_if_then_else(n, key, level+1, align+2)}\n" +
34
+ " "*align + "}"
35
+ first = false
36
+ buffer << code
37
+ end
38
+
39
+ if table.has_key?('*')
40
+ buffer << " else {\n"
41
+ buffer << generate_js_if_then_else(table['*'], key, level, align+1)
42
+ buffer << " "*align + "}"
43
+ end
44
+
45
+ buffer
46
+ end
47
+ when RoutingRule
48
+ table.generate_js_code(key, align)
49
+ else
50
+ raise "Unexpected table #{table}"
51
+ end
52
+ end
53
+
54
+ # Generates the javascript routing
55
+ def generate_js_routing(action, align=0)
56
+ # Build the if-then-else table
57
+ table = Hash.new {|h, k| h[k] = Hash.new}
58
+ @rules.each do |pattern, rule|
59
+ elements = pattern.split('/')
60
+ raise "Unsupport action-routing pattern #{pattern}" if elements.size==0 or elements.size>2
61
+ elements << '*' if elements.size == 1
62
+ table[elements[0]][elements[1]] = rule
63
+ end
64
+
65
+ # Build the javascript code now
66
+ generate_js_if_then_else(table, "", 0, align)
67
+ end
68
+
69
+ # Applies this action routing on a browser
70
+ def apply_on_browser(result, browser)
71
+ @rules.each_pair do |pattern, rule|
72
+ rule.apply_on_browser(result, browser) if Waw::Routing.matches?(pattern, result)
73
+ end
74
+ end
75
+
76
+ end # class ActionRouting
77
+ end # module Routing
78
+ end # module Waw
@@ -0,0 +1,45 @@
1
+ module Waw
2
+ module Routing
3
+ # The DSL for routing blocks
4
+ class DSL
5
+
6
+ # Creates a DSL instance for some routing instance
7
+ def initialize(routing)
8
+ @routing = routing
9
+ end
10
+
11
+ # Evaluates the block as routing execution and installs it
12
+ # under all provided action results
13
+ def upon(*action_results)
14
+ raise ArgumentError, "Missing routing block on upon", caller unless block_given?
15
+ @routing.add_rules(action_results, yield)
16
+ end
17
+
18
+ # Feedback routing execution
19
+ def feedback(*args)
20
+ Waw::Routing::Feedback.new(*args)
21
+ end
22
+
23
+ # Form validation feedback routing execution
24
+ def form_validation_feedback(*args)
25
+ Waw::Routing::FormValidationFeedback.new(*args)
26
+ end
27
+
28
+ # Refresh routing execution
29
+ def refresh(*args)
30
+ Waw::Routing::Refresh.new(*args)
31
+ end
32
+
33
+ # Redirect routing execution
34
+ def redirect(*args)
35
+ Waw::Routing::Redirect.new(*args)
36
+ end
37
+
38
+ # Javascript routing execution
39
+ def javascript(*args)
40
+ Waw::Routing::Javascript.new(*args)
41
+ end
42
+
43
+ end # class DSL
44
+ end # module Routing
45
+ end # module Waw
@@ -0,0 +1,23 @@
1
+ module Waw
2
+ module Routing
3
+ # Feedback routing
4
+ class Feedback < RoutingRule
5
+
6
+ # Creates a feedback instance
7
+ def initialize(opts = {})
8
+ @opts = opts
9
+ end
10
+
11
+ def generate_js_code(result, align=0)
12
+ selector = @opts[:css_selector] || '.feedback'
13
+ buffer = ""
14
+ buffer << " "*align + "$(form + ' input').hide();\n" if @opts[:hide_input]
15
+ buffer << " "*align + "$(form + ' #{selector}').show();\n"
16
+ message = @opts[:message] ? "'#{@opts[:message]}'" : 'data[1][0]'
17
+ buffer << " "*align + "$(form + ' #{selector}').html(messages[#{message}]);"
18
+ buffer
19
+ end
20
+
21
+ end # class Feedback
22
+ end # module Routing
23
+ end # module Waw
@@ -0,0 +1,36 @@
1
+ module Waw
2
+ module Routing
3
+ # FormValidationFeedback routing
4
+ class FormValidationFeedback < RoutingRule
5
+
6
+ def initialize(opts = {})
7
+ @options = opts
8
+ end
9
+
10
+ def generate_js_code(result, align=0)
11
+ buffer = ""
12
+ buffer << " "*align + "str = '';\n"
13
+ buffer << " "*align + "str += '<ul>';\n"
14
+ buffer << " "*align + "for (var k in data[1]) {\n"
15
+ buffer << " "*(align+2) + "str += '<li>' + messages[data[1][k]] + '</li>';\n"
16
+ buffer << " "*align + "}\n"
17
+ buffer << " "*align + "str += '</ul>';\n"
18
+ buffer << " "*align + "$(form + ' .feedback').show();\n"
19
+ buffer << " "*align + "$(form + ' .feedback').html(str);\n"
20
+ if @options[:scroll]
21
+ where = case @options[:scroll]
22
+ when :top
23
+ '0'
24
+ when :form
25
+ "$(form).offset().top"
26
+ when :feedback
27
+ "$(form + ' .feedback').offset().top"
28
+ end
29
+ buffer << "$('html, body').animate( { scrollTop: #{where} }, 'slow' );\n"
30
+ end
31
+ buffer
32
+ end
33
+
34
+ end # class FormValidationFeedback
35
+ end # module Routing
36
+ end # module Waw
@@ -0,0 +1,17 @@
1
+ module Waw
2
+ module Routing
3
+ # Javascript routing
4
+ class Javascript < RoutingRule
5
+
6
+ # Creates a javascript instance
7
+ def initialize(code)
8
+ @code = code
9
+ end
10
+
11
+ def generate_js_code(result, align=0)
12
+ @code
13
+ end
14
+
15
+ end # class Javascript
16
+ end # module Routing
17
+ end # module Waw
@@ -0,0 +1,26 @@
1
+ module Waw
2
+ module Routing
3
+ # Redirect routing
4
+ class Redirect < RoutingRule
5
+
6
+ # Creates a redirection rule instance
7
+ def initialize(opts = {})
8
+ @opts = opts
9
+ end
10
+
11
+ # Forces the browser to refresh
12
+ def apply_on_browser(result, browser)
13
+ browser.location = @opts[:url]
14
+ end
15
+
16
+ def generate_js_code(result, align=0)
17
+ if @opts[:url]
18
+ " "*align + "window.location = \"#{@opts[:url]}\";"
19
+ else
20
+ " "*align + "window.location = data[1];"
21
+ end
22
+ end
23
+
24
+ end # class Redirect
25
+ end # module Routing
26
+ end # module Waw
@@ -0,0 +1,17 @@
1
+ module Waw
2
+ module Routing
3
+ # Refresh routing
4
+ class Refresh < RoutingRule
5
+
6
+ # Forces the browser to refresh
7
+ def apply_on_browser(result, browser)
8
+ browser.refresh
9
+ end
10
+
11
+ def generate_js_code(result, align=0)
12
+ " "*align + "location.reload(true);"
13
+ end
14
+
15
+ end # class Refresh
16
+ end # module Routing
17
+ end # module Waw