waw 0.3.0 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (74) hide show
  1. data/{test/spec/fixtures/empty/waw.deploy → .gemtest} +0 -0
  2. data/CHANGELOG.md +85 -0
  3. data/Gemfile +2 -0
  4. data/Gemfile.lock +37 -0
  5. data/{LICENCE.rdoc → LICENCE.md} +2 -2
  6. data/Manifest.txt +19 -0
  7. data/{README.rdoc → README.md} +11 -9
  8. data/Rakefile +23 -0
  9. data/lib/waw.rb +3 -10
  10. data/lib/waw/controllers/action_controller.rb +7 -2
  11. data/lib/waw/controllers/static/matcher.rb +77 -8
  12. data/lib/waw/controllers/static/waw_access.rb +2 -2
  13. data/lib/waw/loader.rb +3 -0
  14. data/lib/waw/version.rb +14 -0
  15. data/{test/spec → spec}/assumptions_spec.rb +1 -0
  16. data/{test/spec → spec}/controllers/action_controller_spec.rb +1 -1
  17. data/{test/spec → spec}/controllers/static/waw_access_spec.rb +1 -2
  18. data/{test/spec → spec}/environment_utils_spec.rb +1 -1
  19. data/{test/spec → spec}/ext/core/hash_spec.rb +1 -0
  20. data/{test/spec → spec}/fixtures.rb +0 -0
  21. data/{test/spec → spec}/fixtures/action/config/default.cfg +0 -0
  22. data/{test/spec → spec}/fixtures/action/lib/action_controller_test.rb +1 -1
  23. data/{test/spec → spec}/fixtures/action/waw.deploy +0 -0
  24. data/{test/spec → spec}/fixtures/action/waw.routing +0 -0
  25. data/{test/spec/fixtures/empty/waw.routing → spec/fixtures/empty/waw.deploy} +0 -0
  26. data/spec/fixtures/empty/waw.routing +0 -0
  27. data/{test/spec → spec}/fullstate/on_class_spec.rb +1 -1
  28. data/{test/spec → spec}/fullstate/on_instance_spec.rb +1 -1
  29. data/{test/spec → spec}/fullstate/session_spec.rb +1 -1
  30. data/{test/spec → spec}/fullstate/variable_spec.rb +1 -1
  31. data/{test/spec → spec}/resource_collection_spec.rb +1 -1
  32. data/spec/spec_helper.rb +5 -0
  33. data/{test/spec → spec}/tools/mail/mail_agent_spec.rb +1 -1
  34. data/{test/spec → spec}/tools/mail/mail_spec.rb +1 -1
  35. data/{test/spec → spec}/tools/mail/mailbox_spec.rb +1 -1
  36. data/{test/spec → spec}/tools/mail/template_spec.rb +1 -1
  37. data/{test/spec → spec}/validation/array_validation_spec.rb +1 -1
  38. data/{test/spec → spec}/validation/array_validator_spec.rb +1 -1
  39. data/{test/spec → spec}/validation/date_validation_spec.rb +1 -1
  40. data/{test/spec → spec}/validation/datetime_validation_spec.rb +1 -0
  41. data/{test/spec → spec}/validation/default_validation_spec.rb +1 -1
  42. data/{test/spec → spec}/validation/disjuctive_validation_spec.rb +1 -1
  43. data/{test/spec → spec}/validation/errors_spec.rb +1 -1
  44. data/{test/spec → spec}/validation/file_validator_spec.rb +1 -1
  45. data/{test/spec → spec}/validation/mail_validation_spec.rb +1 -1
  46. data/{test/spec → spec}/validation/missing_validation_spec.rb +1 -1
  47. data/{test/spec → spec}/validation/same_validation_spec.rb +1 -1
  48. data/{test/spec → spec}/validation/signature_intuition_spec.rb +1 -1
  49. data/{test/spec → spec}/validation/signature_spec.rb +1 -2
  50. data/{test/spec → spec}/validation/validation_spec.rb +1 -2
  51. data/spec/waw_spec.rb +8 -0
  52. data/{test/spec → spec}/wspec/html_analysis/tag_spec.rb +1 -1
  53. data/{test/spec → spec}/wspec/html_analysis_spec.rb +1 -1
  54. data/tasks/debug_mail.rake +78 -0
  55. data/tasks/debug_mail.txt +13 -0
  56. data/tasks/gem.rake +68 -0
  57. data/tasks/oldies.rake +22 -0
  58. data/tasks/spec_test.rake +79 -0
  59. data/tasks/unit_test.rake +77 -0
  60. data/tasks/yard.rake +51 -0
  61. data/test/bricks/action_controller/config/test.cfg +3 -0
  62. data/test/bricks/action_controller/logs/webapp.log +489 -0
  63. data/test/bricks/action_controller/logs/webapp.log.20110122 +84 -0
  64. data/test/bricks/action_controller/test/action_controller.wspec +6 -0
  65. data/test/bricks/action_controller/test/test_all.rb +20 -0
  66. data/test/bricks/action_controller/waw.deploy +1 -0
  67. data/test/bricks/action_controller/waw.routing +15 -0
  68. data/test/bricks/static_controller/logs/webapp.log +193 -50
  69. data/test/bricks/static_controller/logs/webapp.log.20110122 +84 -0
  70. data/test/bricks/static_controller/test/static_controller.wspec +17 -5
  71. data/waw.gemspec +191 -0
  72. data/waw.noespec +59 -0
  73. metadata +332 -90
  74. data/test/spec/test_all.rb +0 -7
@@ -0,0 +1,85 @@
1
+ # Version 0.3.1
2
+
3
+ * Major enhancements
4
+
5
+ * Added &, | and negate on wawaccess's Matchers
6
+ * Fixed #447: user-friendly message when params is forgotten in action method signature
7
+ * Cleaned the gemspec to include official dependencies
8
+
9
+ * On the devel side
10
+
11
+ * Bumped to ruby.noe 1.3.0
12
+ * Spec tests moved under spec/ instead of test/spec
13
+ * Removed the vendor library, as all dependencies are official gems
14
+
15
+ # Version 0.3.0
16
+
17
+ * Added a Matcher class in StaticController, and matcher dsl rule in .wawaccess
18
+ * Modified some WawAccess API (env is passed instead of path at different places)
19
+ * Kernel application has been extended to support internal requests
20
+ * A DateTimeValidator has been added to the validation framework
21
+ * Waw::ActionController::JSGeneration becomes a controller. This allows setting
22
+ configuration variable 'code_at_startup' to false (no code generated as a file
23
+ at all) and including generated javascript as follows:
24
+
25
+ waw.routing
26
+ map '/webservices.js' do
27
+ run ::Waw::ActionController::JSGeneration.new
28
+ end
29
+
30
+ layout.wtpl
31
+ <script type="text/javascript" src="/webservices.js"></script>
32
+
33
+ * Set Rack version to 1.2.1
34
+ * Fixed a bug with waw-profile when encountering relative links.
35
+ * Moved to rspec 2.4.0
36
+
37
+ # Version 0.2.1
38
+
39
+ * Layouts have been cleaned. The empty layout is less complete than before
40
+ * Layouts force the waw version that is loaded by config.ru to a version greater
41
+ than the one that created the layout.
42
+ * Bug/Feature #260 related to inclusion of ::Waw::Validation has been implemented
43
+ * Bug/Feature #261 related to self referencing resource files has been implemented.
44
+ * Features #305 and #306 related to default validators and validators taking blocks
45
+ have been implemented.
46
+
47
+ # Version 0.2.0
48
+
49
+ ## Broken features and APIs (by order of importance)
50
+
51
+ * Major changes due to wlang version 0.9.0 (see Changelog there). Waw 0.2.0 verifies
52
+ that a wlang gem >= 0.9.0 is installed in rubygems.
53
+ * The 'using self' syntax is deprecated in .wtpl files. Equivalence can be obtained
54
+ trough 'share all' (see also auto-waw-scoping later)
55
+
56
+ ## New features
57
+
58
+ * All methods in Waw::ScopeUtils are automatically present in all wlang scopes as
59
+ low priority variables (aka auto-waw-scoping)
60
+ * wlang executable ensures that it executes the current version
61
+ * 'waw create' applies WLang::encode(upper_name, 'ruby/method-case') for computing
62
+ the lower project name.
63
+
64
+ ## Bugfixes
65
+
66
+ * bug #290: Rack >= 1.1.0 is verified through rubygems
67
+ * feature #259: CSS and JS files are sorted by names when put in css_files and js_files wlang
68
+ variables
69
+
70
+ # Version 0.1.3
71
+
72
+ ## Broken features and APIs (by order of importance)
73
+
74
+ * wawspec become wspec, all old invocations and assertions have been removed
75
+ * 'scenario' and 'because' in wspec are considered deprecated (but can still be used).
76
+ They are replaced by 'requirement' and 'therefore'
77
+
78
+ ## New features
79
+
80
+ * A mail agent has been added in tools. It expects a smtp_config variable in Waw.config.
81
+ This agent really send mails in 'production' and 'acceptation' deployment modes. In
82
+ 'devel' and 'test' modes, it simply put mails in internal mailboxes accessible through
83
+ accessors (see ::Waw::Tools::MailAgent)
84
+ * validation architecture has been consolidated and is well tested
85
+ * wawaccess files refactored and consolidated.
data/Gemfile ADDED
@@ -0,0 +1,2 @@
1
+ source 'http://rubygems.org'
2
+ gemspec :name => "waw"
@@ -0,0 +1,37 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ waw (0.3.1)
5
+ json (>= 1.1.9)
6
+ rack (~> 1.2.1)
7
+ wlang (~> 0.10.1)
8
+
9
+ GEM
10
+ remote: http://rubygems.org/
11
+ specs:
12
+ bluecloth (2.0.9)
13
+ diff-lcs (1.1.2)
14
+ json (1.5.1)
15
+ rack (1.2.1)
16
+ rake (0.8.7)
17
+ rspec (2.4.0)
18
+ rspec-core (~> 2.4.0)
19
+ rspec-expectations (~> 2.4.0)
20
+ rspec-mocks (~> 2.4.0)
21
+ rspec-core (2.4.0)
22
+ rspec-expectations (2.4.0)
23
+ diff-lcs (~> 1.1.2)
24
+ rspec-mocks (2.4.0)
25
+ wlang (0.10.1)
26
+ yard (0.6.4)
27
+
28
+ PLATFORMS
29
+ ruby
30
+
31
+ DEPENDENCIES
32
+ bluecloth (~> 2.0.9)
33
+ bundler (~> 1.0)
34
+ rake (~> 0.8.7)
35
+ rspec (~> 2.4.0)
36
+ waw!
37
+ yard (~> 0.6.4)
@@ -1,8 +1,8 @@
1
- = Licence
1
+ # Licence
2
2
 
3
3
  The MIT License
4
4
 
5
- Copyright (c) 2009 Bernard & Louis Lambeau and the University of Louvain
5
+ Copyright (c) 2009-2011 Bernard & Louis Lambeau and the University of Louvain
6
6
  (Universite Catholique de Louvain, Louvain-la-Neuve, Belgium)
7
7
 
8
8
  Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -0,0 +1,19 @@
1
+ .gemtest
2
+ bin/**/*
3
+ CHANGELOG.md
4
+ Gemfile
5
+ Gemfile.lock
6
+ layouts/**/*
7
+ layouts/static/public/.wawaccess
8
+ layouts/static/public/pages/.wawaccess
9
+ layouts/static/public/templates/.wawaccess
10
+ lib/**/*
11
+ LICENCE.md
12
+ Manifest.txt
13
+ Rakefile
14
+ README.md
15
+ spec/**/*
16
+ tasks/**/*
17
+ test/**/*
18
+ waw.gemspec
19
+ waw.noespec
@@ -1,10 +1,18 @@
1
- = Waw, making web applications simple
1
+ # Waw, making web applications simple
2
2
 
3
3
  Waw is a web framework written in Ruby. It provides an alternative to Rails and other frameworks
4
4
  written in Ruby as well. It is designed to be somewhere in the middle between Rails (sometimes a
5
- bit too heavy) and Rack (not really a framework, sometimes too low-level).
5
+ bit too heavy) and Rack/Sinatra (not really a framework, sometimes too low-level).
6
6
 
7
- == Main features
7
+ Waw has been originally designed in the ReQuest research project of the University of Louvain, has
8
+ been entirely rewritten in ruby, and is still actively developped to reach its first real stable
9
+ version ;-)
10
+
11
+ ## Links
12
+
13
+ http://github.com/blambeau/waw
14
+
15
+ ## Main features
8
16
 
9
17
  Waw basically provides an overall architecture for web sites and/or applications. Its main
10
18
  features are
@@ -23,10 +31,4 @@ features are
23
31
  - When things become too restrictive for you (you don't fit the architecture exactly) you can
24
32
  access lower stages ... edit the underlying Rack configuration and install your own services
25
33
  in a few minutes, bypassing waw when needed!
26
-
27
- == Dependencies
28
-
29
- Waw requires the following ruby gems
30
34
 
31
- - rack >= 1.1.0 (provided through <code>gem install rack</code>)
32
- - wlang >= 0.9.0 (provided in the vendors folder)
@@ -0,0 +1,23 @@
1
+ begin
2
+ gem "bundler", "~> 1.0"
3
+ require "bundler/setup"
4
+ rescue LoadError => ex
5
+ puts ex.message
6
+ abort "Bundler failed to load, (did you run 'gem install bundler' ?)"
7
+ end
8
+
9
+ # Dynamically load the gem spec
10
+ $gemspec_file = File.expand_path('../waw.gemspec', __FILE__)
11
+ $gemspec = Kernel.eval(File.read($gemspec_file))
12
+
13
+ # We run tests by default
14
+ task :default => :test
15
+
16
+ #
17
+ # Install all tasks found in tasks folder
18
+ #
19
+ # See .rake files there for complete documentation.
20
+ #
21
+ Dir["tasks/*.rake"].each do |taskfile|
22
+ instance_eval File.read(taskfile), taskfile
23
+ end
data/lib/waw.rb CHANGED
@@ -2,9 +2,7 @@ $waw_deprecated_io = nil
2
2
  require 'singleton'
3
3
  require 'waw/ext/core'
4
4
  require 'waw/ext/rack'
5
- #
6
- # Main waw module, providing the strict micro kernel of waw loader
7
- #
5
+ require 'waw/version'
8
6
  module Waw
9
7
 
10
8
  # Requirements on gems for this version
@@ -14,9 +12,6 @@ module Waw
14
12
  :json => '>= 1.1.9'
15
13
  }
16
14
 
17
- # Waw version
18
- VERSION = "0.3.0".freeze
19
-
20
15
  # Waw loading mutex
21
16
  WAW_KERNELS_LOCK = Mutex.new
22
17
 
@@ -74,10 +69,8 @@ end
74
69
 
75
70
  # Now, make ruby requires
76
71
  require 'rubygems'
77
- Waw::GEM_REQUIREMENTS.each_pair {|name, version|
78
- gem(name.to_s, version)
79
- require(name.to_s)
80
- }
72
+ Waw::GEM_REQUIREMENTS.each_pair {|name, version| gem(name.to_s, version)}
73
+ require 'waw/loader'
81
74
  require 'waw/errors'
82
75
  require 'waw/scope_utils'
83
76
  require 'waw/ext'
@@ -73,8 +73,13 @@ module Waw
73
73
  @critical = true
74
74
 
75
75
  # Create the action instance
76
- action = Waw::ActionController::Action.new(name, @signature, @routing, self, instance_method(name))
77
- actions[name] = action
76
+ meth = instance_method(name)
77
+ if meth.arity != 1
78
+ raise WawError, "Action #{self}::#{name} is missing its 'params' argument"
79
+ else
80
+ action = Waw::ActionController::Action.new(name, @signature, @routing, self, meth)
81
+ actions[name] = action
82
+ end
78
83
 
79
84
  # Installs the class method that returns the action
80
85
  instance_eval <<-EOF
@@ -1,18 +1,13 @@
1
1
  module Waw
2
2
  class StaticController < ::Waw::Controller
3
- class Matcher
3
+ class AbstractMatcher
4
4
  include Waw::ScopeUtils
5
-
5
+
6
6
  # Waw access on which this matcher is defined
7
7
  attr_reader :wawaccess
8
8
 
9
- # Matcher's predicate
10
- attr_reader :predicate
11
-
12
- # Creates a matcher instance
13
- def initialize(wawaccess, predicate)
9
+ def initialize(wawaccess)
14
10
  @wawaccess = wawaccess
15
- @predicate = predicate
16
11
  end
17
12
 
18
13
  # Returns wawaccess's folder
@@ -25,11 +20,85 @@ module Waw
25
20
  wawaccess.req_path
26
21
  end
27
22
 
23
+ def &(other)
24
+ unless other.is_a?(AbstractMatcher)
25
+ raise ArgumentError, "Matcher expected for &, #{other} received"
26
+ end
27
+ AndMatcher.new(wawaccess, self, other)
28
+ end
29
+
30
+ def |(other)
31
+ unless other.is_a?(AbstractMatcher)
32
+ raise ArgumentError, "Matcher expected for |, #{other} received"
33
+ end
34
+ OrMatcher.new(wawaccess, self, other)
35
+ end
36
+
37
+ def negate
38
+ NegateMatcher.new(wawaccess, self)
39
+ end
40
+
41
+ end
42
+
43
+ class Matcher < AbstractMatcher
44
+
45
+ # Matcher's predicate
46
+ attr_reader :predicate
47
+
48
+ # Creates a matcher instance
49
+ def initialize(wawaccess, predicate)
50
+ super(wawaccess)
51
+ @predicate = predicate
52
+ end
53
+
28
54
  # Does the matcher matches a given path?
29
55
  def matches?(env)
30
56
  instance_eval &predicate
31
57
  end
32
58
 
33
59
  end # class Matcher
60
+
61
+ class NegateMatcher < AbstractMatcher
62
+
63
+ def initialize(wawaccess, operand)
64
+ super(wawaccess)
65
+ @operand = operand
66
+ end
67
+
68
+ # Does the matcher matches a given path?
69
+ def matches?(env)
70
+ !@operand.matches?(env)
71
+ end
72
+
73
+ end
74
+
75
+ class AndMatcher < AbstractMatcher
76
+
77
+ def initialize(wawaccess, left, right)
78
+ super(wawaccess)
79
+ @left, @right = left, right
80
+ end
81
+
82
+ # Does the matcher matches a given path?
83
+ def matches?(env)
84
+ @left.matches?(env) && @right.matches?(env)
85
+ end
86
+
87
+ end # class AndMatcher
88
+
89
+ class OrMatcher < AbstractMatcher
90
+
91
+ def initialize(wawaccess, left, right)
92
+ super(wawaccess)
93
+ @left, @right = left, right
94
+ end
95
+
96
+ # Does the matcher matches a given path?
97
+ def matches?(env)
98
+ @left.matches?(env) || @right.matches?(env)
99
+ end
100
+
101
+ end # class AndMatcher
102
+
34
103
  end # class StaticController
35
104
  end # module Waw
@@ -65,7 +65,7 @@ module Waw
65
65
 
66
66
  def recognized_pattern?(pattern)
67
67
  [FalseClass, TrueClass, String,
68
- Regexp, Waw::Validation::Validator, StaticController::Matcher].any?{|c| c===pattern}
68
+ Regexp, Waw::Validation::Validator, StaticController::AbstractMatcher].any?{|c| c===pattern}
69
69
  end
70
70
 
71
71
  # Adds a child in the hierarchy
@@ -190,7 +190,7 @@ module Waw
190
190
  if pattern.validate(matching_file(path))
191
191
  return Match.new(self, path, block)
192
192
  end
193
- when StaticController::Matcher
193
+ when StaticController::AbstractMatcher
194
194
  if pattern.matches?(env)
195
195
  return Match.new(self, path, block)
196
196
  end
@@ -0,0 +1,3 @@
1
+ require "rack"
2
+ require "wlang"
3
+ require "json"
@@ -0,0 +1,14 @@
1
+ module Waw
2
+ module Version
3
+
4
+ MAJOR = 0
5
+ MINOR = 3
6
+ TINY = 1
7
+
8
+ def self.to_s
9
+ [ MAJOR, MINOR, TINY ].join('.')
10
+ end
11
+
12
+ end
13
+ VERSION = Version.to_s
14
+ end
@@ -1,3 +1,4 @@
1
+ require File.expand_path('../spec_helper', __FILE__)
1
2
  describe "Our understanding of ruby" do
2
3
 
3
4
  def sandbox_file_with_spaces
@@ -1,4 +1,4 @@
1
- require 'waw'
1
+ require File.expand_path('../../spec_helper', __FILE__)
2
2
  describe ::Waw::ActionController do
3
3
  include ::Waw::Fixtures
4
4
  before(:each) { load_action_app }
@@ -1,5 +1,4 @@
1
- require 'waw'
2
-
1
+ require File.expand_path('../../../spec_helper', __FILE__)
3
2
  describe "::Waw::StaticController::WawAccess.matching_file" do
4
3
 
5
4
  def folder
@@ -1,4 +1,4 @@
1
- require "waw"
1
+ require File.expand_path('../spec_helper', __FILE__)
2
2
  describe Waw::EnvironmentUtils do
3
3
  include Waw::EnvironmentUtils
4
4
 
@@ -1,3 +1,4 @@
1
+ require File.expand_path('../../../spec_helper', __FILE__)
1
2
  describe ::Hash do
2
3
 
3
4
  it "should provide a non-intrusive keep method" do