ripple 0.6.1 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (110) hide show
  1. data/Rakefile +61 -48
  2. data/lib/ripple.rb +5 -1
  3. data/lib/ripple/core_ext/casting.rb +3 -0
  4. data/lib/ripple/document.rb +6 -2
  5. data/lib/ripple/document/associations.rb +154 -0
  6. data/lib/ripple/document/{persistence/callbacks.rb → associations/embedded.rb} +20 -24
  7. data/lib/ripple/document/associations/instantiators.rb +41 -0
  8. data/lib/{riak/util/translation.rb → ripple/document/associations/linked.rb} +14 -11
  9. data/lib/ripple/document/associations/many.rb +52 -0
  10. data/lib/ripple/document/associations/many_embedded_proxy.rb +49 -0
  11. data/lib/{riak/i18n.rb → ripple/document/associations/one.rb} +18 -2
  12. data/lib/ripple/document/associations/one_embedded_proxy.rb +41 -0
  13. data/lib/ripple/document/associations/proxy.rb +125 -0
  14. data/lib/ripple/document/attribute_methods.rb +8 -1
  15. data/lib/ripple/document/attribute_methods/read.rb +4 -0
  16. data/lib/ripple/document/attribute_methods/write.rb +4 -0
  17. data/lib/ripple/document/bucket_access.rb +1 -1
  18. data/lib/ripple/document/callbacks.rb +75 -0
  19. data/lib/ripple/document/finders.rb +50 -3
  20. data/lib/ripple/document/persistence.rb +14 -6
  21. data/lib/ripple/document/validations.rb +35 -7
  22. data/lib/ripple/document/validations/associated_validator.rb +37 -0
  23. data/lib/ripple/embedded_document.rb +8 -2
  24. data/lib/{riak/map_reduce_error.rb → ripple/embedded_document/conversion.rb} +19 -5
  25. data/lib/{riak/invalid_response.rb → ripple/embedded_document/finders.rb} +17 -8
  26. data/lib/ripple/embedded_document/persistence.rb +75 -13
  27. data/lib/ripple/locale/en.yml +7 -1
  28. data/{spec/riak/net_http_backend_spec.rb → lib/ripple/railtie.rb} +17 -13
  29. data/spec/fixtures/config.yml +3 -0
  30. data/spec/integration/ripple/associations_spec.rb +81 -0
  31. data/spec/integration/ripple/persistence_spec.rb +54 -0
  32. data/spec/ripple/associations/many_embedded_proxy_spec.rb +124 -0
  33. data/spec/ripple/associations/one_embedded_proxy_spec.rb +130 -0
  34. data/spec/ripple/associations/proxy_spec.rb +78 -0
  35. data/spec/ripple/associations_spec.rb +111 -0
  36. data/spec/ripple/attribute_methods_spec.rb +37 -16
  37. data/spec/ripple/bucket_access_spec.rb +3 -14
  38. data/spec/ripple/callbacks_spec.rb +53 -9
  39. data/spec/ripple/document_spec.rb +22 -6
  40. data/spec/ripple/embedded_document/conversion_spec.rb +35 -0
  41. data/spec/{riak/headers_spec.rb → ripple/embedded_document/finders_spec.rb} +17 -14
  42. data/spec/ripple/embedded_document/persistence_spec.rb +86 -0
  43. data/spec/ripple/embedded_document_spec.rb +1 -26
  44. data/spec/ripple/finders_spec.rb +66 -30
  45. data/spec/ripple/persistence_spec.rb +33 -21
  46. data/spec/ripple/properties_spec.rb +1 -7
  47. data/spec/ripple/ripple_spec.rb +10 -0
  48. data/spec/ripple/timestamps_spec.rb +12 -19
  49. data/spec/ripple/validations_spec.rb +48 -6
  50. data/spec/spec_helper.rb +4 -10
  51. data/spec/support/associations/proxies.rb +16 -0
  52. data/spec/support/integration.rb +4 -0
  53. data/spec/support/mocks.rb +3 -0
  54. data/spec/support/models/address.rb +8 -0
  55. data/spec/support/models/box.rb +6 -0
  56. data/spec/support/models/cardboard_box.rb +3 -0
  57. data/spec/support/models/clock.rb +6 -0
  58. data/spec/support/models/customer.rb +4 -0
  59. data/spec/support/models/email.rb +4 -0
  60. data/spec/support/models/family.rb +14 -0
  61. data/spec/support/models/favorite.rb +4 -0
  62. data/spec/support/models/invoice.rb +6 -0
  63. data/spec/support/models/late_invoice.rb +3 -0
  64. data/spec/support/models/note.rb +4 -0
  65. data/spec/support/models/page.rb +4 -0
  66. data/spec/support/models/paid_invoice.rb +4 -0
  67. data/spec/support/models/tree.rb +3 -0
  68. data/spec/support/models/user.rb +6 -0
  69. data/spec/support/models/widget.rb +6 -0
  70. metadata +111 -138
  71. data/.document +0 -5
  72. data/.gitignore +0 -26
  73. data/CONTRIBUTORS.textile +0 -5
  74. data/LICENSE +0 -13
  75. data/README.textile +0 -128
  76. data/RELEASE_NOTES.textile +0 -68
  77. data/VERSION +0 -1
  78. data/lib/riak.rb +0 -46
  79. data/lib/riak/bucket.rb +0 -157
  80. data/lib/riak/client.rb +0 -139
  81. data/lib/riak/client/curb_backend.rb +0 -82
  82. data/lib/riak/client/http_backend.rb +0 -209
  83. data/lib/riak/client/net_http_backend.rb +0 -49
  84. data/lib/riak/failed_request.rb +0 -37
  85. data/lib/riak/link.rb +0 -73
  86. data/lib/riak/locale/en.yml +0 -37
  87. data/lib/riak/map_reduce.rb +0 -248
  88. data/lib/riak/robject.rb +0 -258
  89. data/lib/riak/util/escape.rb +0 -12
  90. data/lib/riak/util/fiber1.8.rb +0 -48
  91. data/lib/riak/util/headers.rb +0 -44
  92. data/lib/riak/util/multipart.rb +0 -52
  93. data/lib/riak/walk_spec.rb +0 -117
  94. data/ripple.gemspec +0 -169
  95. data/spec/fixtures/cat.jpg +0 -0
  96. data/spec/fixtures/multipart-blank.txt +0 -7
  97. data/spec/fixtures/multipart-with-body.txt +0 -16
  98. data/spec/riak/bucket_spec.rb +0 -230
  99. data/spec/riak/client_spec.rb +0 -174
  100. data/spec/riak/curb_backend_spec.rb +0 -50
  101. data/spec/riak/escape_spec.rb +0 -17
  102. data/spec/riak/http_backend_spec.rb +0 -131
  103. data/spec/riak/link_spec.rb +0 -82
  104. data/spec/riak/map_reduce_spec.rb +0 -352
  105. data/spec/riak/multipart_spec.rb +0 -36
  106. data/spec/riak/object_spec.rb +0 -532
  107. data/spec/riak/walk_spec_spec.rb +0 -208
  108. data/spec/spec.opts +0 -1
  109. data/spec/support/http_backend_implementation_examples.rb +0 -215
  110. data/spec/support/mock_server.rb +0 -58
@@ -1,12 +0,0 @@
1
- module Riak
2
- module Util
3
- module Escape
4
- # URI-escapes bucket or key names that may contain slashes for use in URLs.
5
- # @param [String] bucket_or_key the bucket or key name
6
- # @return [String] the escaped path segment
7
- def escape(bucket_or_key)
8
- URI.escape(bucket_or_key).gsub("/", "%2F")
9
- end
10
- end
11
- end
12
- end
@@ -1,48 +0,0 @@
1
- # Poor Man's Fiber (API compatible Thread based Fiber implementation for Ruby 1.8)
2
- # (c) 2008 Aman Gupta (tmm1)
3
-
4
- unless defined? Fiber
5
- require 'thread'
6
-
7
- class FiberError < StandardError; end
8
-
9
- class Fiber
10
- def initialize
11
- raise ArgumentError, 'new Fiber requires a block' unless block_given?
12
-
13
- @yield = Queue.new
14
- @resume = Queue.new
15
-
16
- @thread = Thread.new{ @yield.push [ *yield(*@resume.pop) ] }
17
- @thread.abort_on_exception = true
18
- @thread[:fiber] = self
19
- end
20
- attr_reader :thread
21
-
22
- def resume *args
23
- raise FiberError, 'dead fiber called' unless @thread.alive?
24
- @resume.push(args)
25
- result = @yield.pop
26
- result.size > 1 ? result : result.first
27
- end
28
-
29
- def yield *args
30
- @yield.push(args)
31
- result = @resume.pop
32
- result.size > 1 ? result : result.first
33
- end
34
-
35
- def self.yield *args
36
- raise FiberError, "can't yield from root fiber" unless fiber = Thread.current[:fiber]
37
- fiber.yield(*args)
38
- end
39
-
40
- def self.current
41
- Thread.current[:fiber] or raise FiberError, 'not inside a fiber'
42
- end
43
-
44
- def inspect
45
- "#<#{self.class}:0x#{self.object_id.to_s(16)}>"
46
- end
47
- end
48
- end
@@ -1,44 +0,0 @@
1
- # Copyright 2010 Sean Cribbs, Sonian Inc., and Basho Technologies, Inc.
2
- #
3
- # Licensed under the Apache License, Version 2.0 (the "License");
4
- # you may not use this file except in compliance with the License.
5
- # You may obtain a copy of the License at
6
- #
7
- # http://www.apache.org/licenses/LICENSE-2.0
8
- #
9
- # Unless required by applicable law or agreed to in writing, software
10
- # distributed under the License is distributed on an "AS IS" BASIS,
11
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- # See the License for the specific language governing permissions and
13
- # limitations under the License.
14
- require 'riak'
15
-
16
- module Riak
17
- module Util
18
- # Represents headers from an HTTP response
19
- class Headers
20
- include Net::HTTPHeader
21
-
22
- def initialize
23
- initialize_http_header({})
24
- end
25
-
26
- # Parse a single header line into its key and value
27
- # @param [String] chunk a single header line
28
- def self.parse(chunk)
29
- line = chunk.strip
30
- # thanks Net::HTTPResponse
31
- return [nil,nil] if chunk =~ /\AHTTP(?:\/(\d+\.\d+))?\s+(\d\d\d)\s*(.*)\z/in
32
- m = /\A([^:]+):\s*/.match(line)
33
- [m[1], m.post_match] rescue [nil, nil]
34
- end
35
-
36
- # Parses a header line and adds it to the header collection
37
- # @param [String] chunk a single header line
38
- def parse(chunk)
39
- key, value = self.class.parse(chunk)
40
- add_field(key, value) if key && value
41
- end
42
- end
43
- end
44
- end
@@ -1,52 +0,0 @@
1
- # Copyright 2010 Sean Cribbs, Sonian Inc., and Basho Technologies, Inc.
2
- #
3
- # Licensed under the Apache License, Version 2.0 (the "License");
4
- # you may not use this file except in compliance with the License.
5
- # You may obtain a copy of the License at
6
- #
7
- # http://www.apache.org/licenses/LICENSE-2.0
8
- #
9
- # Unless required by applicable law or agreed to in writing, software
10
- # distributed under the License is distributed on an "AS IS" BASIS,
11
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- # See the License for the specific language governing permissions and
13
- # limitations under the License.
14
- require 'riak'
15
-
16
- module Riak
17
- module Util
18
- # Utility methods for handling multipart/mixed responses
19
- module Multipart
20
- extend self
21
- # Parses a multipart/mixed body into its constituent parts, including nested multipart/mixed sections
22
- # @param [String] data the multipart body data
23
- # @param [String] boundary the boundary string given in the Content-Type header
24
- def parse(data, boundary)
25
- contents = data.match(/\n--#{Regexp.escape(boundary)}--\n/).pre_match rescue ""
26
- contents.split(/\n--#{Regexp.escape(boundary)}\n/).reject(&:blank?).map do |part|
27
- headers = Headers.new
28
- if md = part.match(/\r?\n\r?\n/)
29
- body = md.post_match
30
- md.pre_match.split(/\r?\n/).each do |line|
31
- headers.parse(line)
32
- end
33
-
34
- if headers["content-type"] =~ /multipart\/mixed/
35
- boundary = extract_boundary(headers.to_hash["content-type"].first)
36
- parse(body, boundary)
37
- else
38
- {:headers => headers.to_hash, :body => body}
39
- end
40
- end
41
- end.compact
42
- end
43
-
44
- # Extracts the boundary string from a Content-Type header that is a multipart type
45
- # @param [String] header_string the Content-Type header
46
- # @return [String] the boundary string separating each part
47
- def extract_boundary(header_string)
48
- $1 if header_string =~ /boundary=([A-Za-z0-9\'()+_,-.\/:=?]+)/
49
- end
50
- end
51
- end
52
- end
@@ -1,117 +0,0 @@
1
- # Copyright 2010 Sean Cribbs, Sonian Inc., and Basho Technologies, Inc.
2
- #
3
- # Licensed under the Apache License, Version 2.0 (the "License");
4
- # you may not use this file except in compliance with the License.
5
- # You may obtain a copy of the License at
6
- #
7
- # http://www.apache.org/licenses/LICENSE-2.0
8
- #
9
- # Unless required by applicable law or agreed to in writing, software
10
- # distributed under the License is distributed on an "AS IS" BASIS,
11
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- # See the License for the specific language governing permissions and
13
- # limitations under the License.
14
- require 'riak'
15
-
16
- module Riak
17
-
18
- # The specification of how to follow links from one object to another in Riak,
19
- # when using the link-walker resource.
20
- # Example link-walking operation:
21
- # GET /riak/artists/REM/albums,_,_/tracks,_,1
22
- # This operation would have two WalkSpecs:
23
- # Riak::WalkSpec.new({:bucket => 'albums'})
24
- # Riak::WalkSpec.new({:bucket => 'tracks', :result => true})
25
- class WalkSpec
26
- include Util::Translation
27
- include Util::Escape
28
-
29
- # @return [String] The bucket followed links should be restricted to. "_" represents all buckets.
30
- attr_accessor :bucket
31
-
32
- # @return [String] The "riaktag" or "rel" that followed links should be restricted to. "_" represents all tags.
33
- attr_accessor :tag
34
-
35
- # @return [Boolean] Whether objects should be returned from this phase of link walking. Default is false.
36
- attr_accessor :keep
37
-
38
- # Normalize a list of walk specs into WalkSpec objects.
39
- def self.normalize(*params)
40
- params.flatten!
41
- specs = []
42
- while params.length > 0
43
- param = params.shift
44
- case param
45
- when Hash
46
- specs << new(param)
47
- when WalkSpec
48
- specs << param
49
- else
50
- if params.length >= 2
51
- specs << new(param, params.shift, params.shift)
52
- else
53
- raise ArgumentError, t("too_few_arguments", :params => params.inspect)
54
- end
55
- end
56
- end
57
- specs
58
- end
59
-
60
- # Creates a walk-spec for use in finding other objects in Riak.
61
- # @overload initialize(hash)
62
- # Creates a walk-spec from a hash.
63
- # @param [Hash] hash options for the walk-spec
64
- # @option hash [String] :bucket ("_") the bucket the links should point to (default '_' is all)
65
- # @option hash [String] :tag ("_") the tag to filter links by (default '_' is all)
66
- # @option hash [Boolean] :keep (false) whether to return results from following this link specification
67
- # @overload initialize(bucket, tag, keep)
68
- # Creates a walk-spec from a bucket-tag-result triple.
69
- # @param [String] bucket the bucket the links should point to (default '_' is all)
70
- # @param [String] tag the tag to filter links by (default '_' is all)
71
- # @param [Boolean] keep whether to return results from following this link specification
72
- # @see {Riak::RObject#walk}
73
- def initialize(*args)
74
- args.flatten!
75
- case args.size
76
- when 1
77
- hash = args.first
78
- raise ArgumentError, t("hash_type", :hash => hash.inspect) unless Hash === hash
79
- assign(hash[:bucket], hash[:tag], hash[:keep])
80
- when 3
81
- assign(*args)
82
- else
83
- raise ArgumentError, t("wrong_argument_count_walk_spec")
84
- end
85
- end
86
-
87
- # Converts the walk-spec into the form required by the link-walker resource URL
88
- def to_s
89
- b = @bucket && escape(@bucket) || '_'
90
- t = @tag && escape(@tag) || '_'
91
- "#{b},#{t},#{@keep ? '1' : '_'}"
92
- end
93
-
94
- def ==(other)
95
- other.is_a?(WalkSpec) && other.bucket == bucket && other.tag == tag && other.keep == keep
96
- end
97
-
98
- def ===(other)
99
- self == other || case other
100
- when WalkSpec
101
- other.keep == keep &&
102
- (bucket == "_" || bucket == other.bucket) &&
103
- (tag == "_" || tag == other.tag)
104
- when Link
105
- (bucket == "_" || bucket == other.url.split("/")[2]) &&
106
- (tag == "_" || tag == other.rel)
107
- end
108
- end
109
-
110
- private
111
- def assign(bucket, tag, result)
112
- @bucket = bucket || "_"
113
- @tag = tag || "_"
114
- @keep = result || false
115
- end
116
- end
117
- end
@@ -1,169 +0,0 @@
1
- # Generated by jeweler
2
- # DO NOT EDIT THIS FILE DIRECTLY
3
- # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
- # -*- encoding: utf-8 -*-
5
-
6
- Gem::Specification.new do |s|
7
- s.name = %q{ripple}
8
- s.version = "0.6.1"
9
-
10
- s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
- s.authors = ["Sean Cribbs"]
12
- s.date = %q{2010-03-17}
13
- s.description = %q{ripple is a rich Ruby client for Riak, Basho's distributed database. It includes all the basics of accessing and manipulating Riak buckets and objects, and an object mapper library for building a rich domain on top of Riak.}
14
- s.email = %q{seancribbs@gmail.com}
15
- s.extra_rdoc_files = [
16
- "LICENSE",
17
- "README.textile"
18
- ]
19
- s.files = [
20
- ".document",
21
- ".gitignore",
22
- "CONTRIBUTORS.textile",
23
- "LICENSE",
24
- "README.textile",
25
- "RELEASE_NOTES.textile",
26
- "Rakefile",
27
- "VERSION",
28
- "lib/riak.rb",
29
- "lib/riak/bucket.rb",
30
- "lib/riak/client.rb",
31
- "lib/riak/client/curb_backend.rb",
32
- "lib/riak/client/http_backend.rb",
33
- "lib/riak/client/net_http_backend.rb",
34
- "lib/riak/failed_request.rb",
35
- "lib/riak/i18n.rb",
36
- "lib/riak/invalid_response.rb",
37
- "lib/riak/link.rb",
38
- "lib/riak/locale/en.yml",
39
- "lib/riak/map_reduce.rb",
40
- "lib/riak/map_reduce_error.rb",
41
- "lib/riak/robject.rb",
42
- "lib/riak/util/escape.rb",
43
- "lib/riak/util/fiber1.8.rb",
44
- "lib/riak/util/headers.rb",
45
- "lib/riak/util/multipart.rb",
46
- "lib/riak/util/translation.rb",
47
- "lib/riak/walk_spec.rb",
48
- "lib/ripple.rb",
49
- "lib/ripple/core_ext/casting.rb",
50
- "lib/ripple/document.rb",
51
- "lib/ripple/document/attribute_methods.rb",
52
- "lib/ripple/document/attribute_methods/dirty.rb",
53
- "lib/ripple/document/attribute_methods/query.rb",
54
- "lib/ripple/document/attribute_methods/read.rb",
55
- "lib/ripple/document/attribute_methods/write.rb",
56
- "lib/ripple/document/bucket_access.rb",
57
- "lib/ripple/document/finders.rb",
58
- "lib/ripple/document/persistence.rb",
59
- "lib/ripple/document/persistence/callbacks.rb",
60
- "lib/ripple/document/properties.rb",
61
- "lib/ripple/document/timestamps.rb",
62
- "lib/ripple/document/validations.rb",
63
- "lib/ripple/embedded_document.rb",
64
- "lib/ripple/embedded_document/persistence.rb",
65
- "lib/ripple/i18n.rb",
66
- "lib/ripple/locale/en.yml",
67
- "lib/ripple/property_type_mismatch.rb",
68
- "lib/ripple/translation.rb",
69
- "ripple.gemspec",
70
- "spec/fixtures/cat.jpg",
71
- "spec/fixtures/multipart-blank.txt",
72
- "spec/fixtures/multipart-with-body.txt",
73
- "spec/riak/bucket_spec.rb",
74
- "spec/riak/client_spec.rb",
75
- "spec/riak/curb_backend_spec.rb",
76
- "spec/riak/escape_spec.rb",
77
- "spec/riak/headers_spec.rb",
78
- "spec/riak/http_backend_spec.rb",
79
- "spec/riak/link_spec.rb",
80
- "spec/riak/map_reduce_spec.rb",
81
- "spec/riak/multipart_spec.rb",
82
- "spec/riak/net_http_backend_spec.rb",
83
- "spec/riak/object_spec.rb",
84
- "spec/riak/walk_spec_spec.rb",
85
- "spec/ripple/attribute_methods_spec.rb",
86
- "spec/ripple/bucket_access_spec.rb",
87
- "spec/ripple/callbacks_spec.rb",
88
- "spec/ripple/core_ext_spec.rb",
89
- "spec/ripple/document_spec.rb",
90
- "spec/ripple/embedded_document_spec.rb",
91
- "spec/ripple/finders_spec.rb",
92
- "spec/ripple/persistence_spec.rb",
93
- "spec/ripple/properties_spec.rb",
94
- "spec/ripple/ripple_spec.rb",
95
- "spec/ripple/timestamps_spec.rb",
96
- "spec/ripple/validations_spec.rb",
97
- "spec/spec.opts",
98
- "spec/spec_helper.rb",
99
- "spec/support/http_backend_implementation_examples.rb",
100
- "spec/support/mock_server.rb"
101
- ]
102
- s.homepage = %q{http://seancribbs.github.com/ripple}
103
- s.rdoc_options = ["--charset=UTF-8"]
104
- s.require_paths = ["lib"]
105
- s.requirements = ["`gem install curb` for better HTTP performance"]
106
- s.rubygems_version = %q{1.3.6}
107
- s.summary = %q{ripple is a rich Ruby client for Riak, Basho's distributed database.}
108
- s.test_files = [
109
- "spec/riak/bucket_spec.rb",
110
- "spec/riak/client_spec.rb",
111
- "spec/riak/curb_backend_spec.rb",
112
- "spec/riak/escape_spec.rb",
113
- "spec/riak/headers_spec.rb",
114
- "spec/riak/http_backend_spec.rb",
115
- "spec/riak/link_spec.rb",
116
- "spec/riak/map_reduce_spec.rb",
117
- "spec/riak/multipart_spec.rb",
118
- "spec/riak/net_http_backend_spec.rb",
119
- "spec/riak/object_spec.rb",
120
- "spec/riak/walk_spec_spec.rb",
121
- "spec/ripple/attribute_methods_spec.rb",
122
- "spec/ripple/bucket_access_spec.rb",
123
- "spec/ripple/callbacks_spec.rb",
124
- "spec/ripple/core_ext_spec.rb",
125
- "spec/ripple/document_spec.rb",
126
- "spec/ripple/embedded_document_spec.rb",
127
- "spec/ripple/finders_spec.rb",
128
- "spec/ripple/persistence_spec.rb",
129
- "spec/ripple/properties_spec.rb",
130
- "spec/ripple/ripple_spec.rb",
131
- "spec/ripple/timestamps_spec.rb",
132
- "spec/ripple/validations_spec.rb",
133
- "spec/spec_helper.rb",
134
- "spec/support/http_backend_implementation_examples.rb",
135
- "spec/support/mock_server.rb"
136
- ]
137
-
138
- if s.respond_to? :specification_version then
139
- current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
140
- s.specification_version = 3
141
-
142
- if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
143
- s.add_development_dependency(%q<rspec>, [">= 1.3"])
144
- s.add_development_dependency(%q<fakeweb>, [">= 1.2"])
145
- s.add_development_dependency(%q<rack>, [">= 1.0"])
146
- s.add_development_dependency(%q<yard>, [">= 0.5.2"])
147
- s.add_development_dependency(%q<curb>, [">= 0.6"])
148
- s.add_runtime_dependency(%q<activesupport>, ["~> 3.0.0.beta"])
149
- s.add_runtime_dependency(%q<activemodel>, ["~> 3.0.0.beta"])
150
- else
151
- s.add_dependency(%q<rspec>, [">= 1.3"])
152
- s.add_dependency(%q<fakeweb>, [">= 1.2"])
153
- s.add_dependency(%q<rack>, [">= 1.0"])
154
- s.add_dependency(%q<yard>, [">= 0.5.2"])
155
- s.add_dependency(%q<curb>, [">= 0.6"])
156
- s.add_dependency(%q<activesupport>, ["~> 3.0.0.beta"])
157
- s.add_dependency(%q<activemodel>, ["~> 3.0.0.beta"])
158
- end
159
- else
160
- s.add_dependency(%q<rspec>, [">= 1.3"])
161
- s.add_dependency(%q<fakeweb>, [">= 1.2"])
162
- s.add_dependency(%q<rack>, [">= 1.0"])
163
- s.add_dependency(%q<yard>, [">= 0.5.2"])
164
- s.add_dependency(%q<curb>, [">= 0.6"])
165
- s.add_dependency(%q<activesupport>, ["~> 3.0.0.beta"])
166
- s.add_dependency(%q<activemodel>, ["~> 3.0.0.beta"])
167
- end
168
- end
169
-