watts 0.0.2 → 0.0.3

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 (3) hide show
  1. data/Rakefile +7 -2
  2. data/lib/watts.rb +34 -3
  3. metadata +4 -8
data/Rakefile CHANGED
@@ -19,10 +19,10 @@ spec = Gem::Specification.new { |s|
19
19
 
20
20
  s.name = 'watts'
21
21
  s.summary =
22
- "Another Rack-based web framework. Yes, another one. Sorry, guys."
22
+ "Resource-oriented, Rack-based, minimalist web framework."
23
23
  s.homepage = "http://debu.gs/#{s.name}"
24
24
  %w(metaid).each &s.method(:add_dependency)
25
- s.version = '0.0.2'
25
+ s.version = '0.0.3'
26
26
  }
27
27
 
28
28
  Rake::RDocTask.new(:doc) { |t|
@@ -51,3 +51,8 @@ desc "Runs IRB, automatically require()ing #{spec.name}."
51
51
  task(:irb) {
52
52
  exec "irb -Ilib -r#{spec.name}"
53
53
  }
54
+
55
+ desc "Runs tests."
56
+ task(:test) {
57
+ system "ruby -Ilib test/*_test.rb"
58
+ }
data/lib/watts.rb CHANGED
@@ -18,7 +18,7 @@ module Watts
18
18
 
19
19
  def match path, args
20
20
  if path.empty?
21
- [resource, args]
21
+ [resource, args] if resource
22
22
  elsif(sub = self[path[0]])
23
23
  sub.match(path[1..-1], args)
24
24
  else
@@ -36,6 +36,28 @@ module Watts
36
36
  end
37
37
  end
38
38
 
39
+ def rmatch res, args, acc = []
40
+ return "/#{acc.join('/')}" if args.empty? && resource == res
41
+
42
+ rest = args[1..-1]
43
+ accnext = acc.dup << args[0]
44
+
45
+ each { |k,sub|
46
+ t = sub.rmatch res, args, [k] + acc
47
+ return t if t
48
+
49
+ if k.kind_of?(Regexp) && k.match(args[0])
50
+ t = sub.rmatch res, rest, accnext
51
+ return t if t
52
+ elsif k.kind_of?(Symbol)
53
+ t = sub.rmatch res, rest, accnext
54
+ return t if t
55
+ end
56
+ }
57
+
58
+ nil
59
+ end
60
+
39
61
  def_delegators :sub_paths, :'[]', :'[]=', :each
40
62
  end
41
63
 
@@ -60,11 +82,12 @@ module Watts
60
82
  def self.decypher_path p
61
83
  return p if p.kind_of?(Array)
62
84
  return [] if ['/', ''].include?(p)
85
+ return [p] if p.kind_of?(Regexp)
63
86
  p = p.split('/')
64
87
  p.select { |sub| sub != '' }
65
88
  end
66
89
 
67
- to_instance :path_map, :decypher_path
90
+ to_instance :path_map, :decypher_path, :path_to
68
91
 
69
92
  # If you want your Watts application to do anything at all, you're very
70
93
  # likely to want to call this method at least once. The basic purpose
@@ -115,6 +138,12 @@ module Watts
115
138
  res
116
139
  end
117
140
 
141
+ # Given a resource (and, optionally, arguments if the path requires
142
+ # them), this method returns an absolute path to the resource.
143
+ def self.path_to res, *args
144
+ path_map.rmatch res, args
145
+ end
146
+
118
147
  # Given a path, returns the matching resource, if any.
119
148
  def match req_path
120
149
  req_path = decypher_path req_path
@@ -249,7 +278,9 @@ module Watts
249
278
  # By default, we return "405 Method Not Allowed" and set the Allow:
250
279
  # header appropriately.
251
280
  def default_http_method(*args)
252
- [405, { 'Allow' => http_methods.join(', ') }, 'Method not allowed.']
281
+ [405,
282
+ { 'Allow' => http_methods.join(', ') },
283
+ ['Method not allowed.']]
253
284
  end
254
285
  end
255
286
 
metadata CHANGED
@@ -1,13 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: watts
3
3
  version: !ruby/object:Gem::Version
4
- hash: 27
5
4
  prerelease: false
6
5
  segments:
7
6
  - 0
8
7
  - 0
9
- - 2
10
- version: 0.0.2
8
+ - 3
9
+ version: 0.0.3
11
10
  platform: ruby
12
11
  authors:
13
12
  - Pete Elmore
@@ -15,7 +14,7 @@ autorequire:
15
14
  bindir: bin
16
15
  cert_chain: []
17
16
 
18
- date: 2010-06-02 00:00:00 -07:00
17
+ date: 2011-01-27 00:00:00 -08:00
19
18
  default_executable:
20
19
  dependencies:
21
20
  - !ruby/object:Gem::Dependency
@@ -26,7 +25,6 @@ dependencies:
26
25
  requirements:
27
26
  - - ">="
28
27
  - !ruby/object:Gem::Version
29
- hash: 3
30
28
  segments:
31
29
  - 0
32
30
  version: "0"
@@ -66,7 +64,6 @@ required_ruby_version: !ruby/object:Gem::Requirement
66
64
  requirements:
67
65
  - - ">="
68
66
  - !ruby/object:Gem::Version
69
- hash: 3
70
67
  segments:
71
68
  - 0
72
69
  version: "0"
@@ -75,7 +72,6 @@ required_rubygems_version: !ruby/object:Gem::Requirement
75
72
  requirements:
76
73
  - - ">="
77
74
  - !ruby/object:Gem::Version
78
- hash: 3
79
75
  segments:
80
76
  - 0
81
77
  version: "0"
@@ -85,6 +81,6 @@ rubyforge_project:
85
81
  rubygems_version: 1.3.7
86
82
  signing_key:
87
83
  specification_version: 3
88
- summary: Another Rack-based web framework. Yes, another one. Sorry, guys.
84
+ summary: Resource-oriented, Rack-based, minimalist web framework.
89
85
  test_files: []
90
86