Permalink
Browse files

updated to latest couchrest version.

  • Loading branch information...
1 parent 7789584 commit ed0cb781985f4dacb4f57a0a07abe55bfd3b0291 @jtulloch committed Feb 28, 2010
Showing with 10,218 additions and 1,318 deletions.
  1. +17 −6 lib/post.rb
  2. +5 −5 lib/user.rb
  3. +8 −8 main.rb
  4. +5 −0 vendor/couchrest/.gitignore
  5. +176 −0 vendor/couchrest/LICENSE
  6. +46 −0 vendor/couchrest/README.md
  7. +67 −0 vendor/couchrest/Rakefile
  8. +19 −0 vendor/couchrest/THANKS.md
  9. +0 −173 vendor/couchrest/couchrest/core/database.rb
  10. +0 −60 vendor/couchrest/couchrest/core/document.rb
  11. +0 −557 vendor/couchrest/couchrest/core/model.rb
  12. +0 −51 vendor/couchrest/couchrest/core/server.rb
  13. +0 −317 vendor/couchrest/couchrest/helper/file_manager.rb
  14. +0 −11 vendor/couchrest/couchrest/helper/templates/bar.txt
  15. +0 −8 vendor/couchrest/couchrest/helper/templates/example-map.js
  16. +0 −10 vendor/couchrest/couchrest/helper/templates/example-reduce.js
  17. +0 −26 vendor/couchrest/couchrest/helper/templates/index.html
  18. +0 −24 vendor/couchrest/couchrest/monkeypatches.rb
  19. +144 −0 vendor/couchrest/examples/model/example.rb
  20. +38 −0 vendor/couchrest/examples/word_count/markov
  21. +3 −0 vendor/couchrest/examples/word_count/views/books/chunked-map.js
  22. +1 −0 vendor/couchrest/examples/word_count/views/books/united-map.js
  23. +6 −0 vendor/couchrest/examples/word_count/views/markov/chain-map.js
  24. +7 −0 vendor/couchrest/examples/word_count/views/markov/chain-reduce.js
  25. +6 −0 vendor/couchrest/examples/word_count/views/word_count/count-map.js
  26. +3 −0 vendor/couchrest/examples/word_count/views/word_count/count-reduce.js
  27. +46 −0 vendor/couchrest/examples/word_count/word_count.rb
  28. +40 −0 vendor/couchrest/examples/word_count/word_count_query.rb
  29. +26 −0 vendor/couchrest/examples/word_count/word_count_views.rb
  30. +110 −0 vendor/couchrest/history.txt
  31. +1 −0 vendor/couchrest/init.rb
  32. +62 −28 vendor/couchrest/{ → lib}/couchrest.rb
  33. 0 vendor/couchrest/{ → lib}/couchrest/commands/generate.rb
  34. +3 −3 vendor/couchrest/{ → lib}/couchrest/commands/push.rb
  35. +35 −0 vendor/couchrest/lib/couchrest/core/adapters/restclient.rb
  36. +359 −0 vendor/couchrest/lib/couchrest/core/database.rb
  37. +7 −17 vendor/couchrest/{ → lib}/couchrest/core/design.rb
  38. +84 −0 vendor/couchrest/lib/couchrest/core/document.rb
  39. +48 −0 vendor/couchrest/lib/couchrest/core/http_abstraction.rb
  40. +16 −0 vendor/couchrest/lib/couchrest/core/response.rb
  41. +49 −0 vendor/couchrest/lib/couchrest/core/rest_api.rb
  42. +88 −0 vendor/couchrest/lib/couchrest/core/server.rb
  43. 0 vendor/couchrest/{ → lib}/couchrest/core/view.rb
  44. +10 −10 vendor/couchrest/{ → lib}/couchrest/helper/pager.rb
  45. +11 −4 vendor/couchrest/{ → lib}/couchrest/helper/streamer.rb
  46. +51 −0 vendor/couchrest/lib/couchrest/helper/upgrade.rb
  47. +263 −0 vendor/couchrest/lib/couchrest/middlewares/logger.rb
  48. +4 −0 vendor/couchrest/lib/couchrest/mixins.rb
  49. +31 −0 vendor/couchrest/lib/couchrest/mixins/attachments.rb
  50. +74 −0 vendor/couchrest/lib/couchrest/mixins/attribute_protection.rb
  51. +532 −0 vendor/couchrest/lib/couchrest/mixins/callbacks.rb
  52. +124 −0 vendor/couchrest/lib/couchrest/mixins/class_proxy.rb
  53. +224 −0 vendor/couchrest/lib/couchrest/mixins/collection.rb
  54. +103 −0 vendor/couchrest/lib/couchrest/mixins/design_doc.rb
  55. +80 −0 vendor/couchrest/lib/couchrest/mixins/document_queries.rb
  56. +70 −0 vendor/couchrest/lib/couchrest/mixins/extended_attachments.rb
  57. +9 −0 vendor/couchrest/lib/couchrest/mixins/extended_document_mixins.rb
  58. +200 −0 vendor/couchrest/lib/couchrest/mixins/properties.rb
  59. +246 −0 vendor/couchrest/lib/couchrest/mixins/validation.rb
  60. +173 −0 vendor/couchrest/lib/couchrest/mixins/views.rb
  61. +113 −0 vendor/couchrest/lib/couchrest/monkeypatches.rb
  62. +58 −0 vendor/couchrest/lib/couchrest/more/casted_model.rb
  63. +309 −0 vendor/couchrest/lib/couchrest/more/extended_document.rb
  64. +59 −0 vendor/couchrest/lib/couchrest/more/property.rb
  65. +42 −0 vendor/couchrest/lib/couchrest/support/blank.rb
  66. +190 −0 vendor/couchrest/lib/couchrest/support/class.rb
  67. +42 −0 vendor/couchrest/lib/couchrest/support/rails.rb
  68. +157 −0 vendor/couchrest/lib/couchrest/validation/auto_validate.rb
  69. +78 −0 vendor/couchrest/lib/couchrest/validation/contextual_validators.rb
  70. +125 −0 vendor/couchrest/lib/couchrest/validation/validation_errors.rb
  71. +74 −0 vendor/couchrest/lib/couchrest/validation/validators/absent_field_validator.rb
  72. +107 −0 vendor/couchrest/lib/couchrest/validation/validators/confirmation_validator.rb
  73. +122 −0 vendor/couchrest/lib/couchrest/validation/validators/format_validator.rb
  74. +66 −0 vendor/couchrest/lib/couchrest/validation/validators/formats/email.rb
  75. +43 −0 vendor/couchrest/lib/couchrest/validation/validators/formats/url.rb
  76. +120 −0 vendor/couchrest/lib/couchrest/validation/validators/generic_validator.rb
  77. +139 −0 vendor/couchrest/lib/couchrest/validation/validators/length_validator.rb
  78. +89 −0 vendor/couchrest/lib/couchrest/validation/validators/method_validator.rb
  79. +109 −0 vendor/couchrest/lib/couchrest/validation/validators/numeric_validator.rb
  80. +114 −0 vendor/couchrest/lib/couchrest/validation/validators/required_field_validator.rb
  81. +1 −0 vendor/couchrest/spec/.gitignore
  82. +247 −0 vendor/couchrest/spec/couchrest/core/couchrest_spec.rb
  83. +773 −0 vendor/couchrest/spec/couchrest/core/database_spec.rb
  84. +138 −0 vendor/couchrest/spec/couchrest/core/design_spec.rb
  85. +275 −0 vendor/couchrest/spec/couchrest/core/document_spec.rb
  86. +35 −0 vendor/couchrest/spec/couchrest/core/server_spec.rb
  87. +122 −0 vendor/couchrest/spec/couchrest/helpers/pager_spec.rb
  88. +52 −0 vendor/couchrest/spec/couchrest/helpers/streamer_spec.rb
  89. +150 −0 vendor/couchrest/spec/couchrest/more/attribute_protection_spec.rb
  90. +73 −0 vendor/couchrest/spec/couchrest/more/casted_extended_doc_spec.rb
  91. +406 −0 vendor/couchrest/spec/couchrest/more/casted_model_spec.rb
  92. +135 −0 vendor/couchrest/spec/couchrest/more/extended_doc_attachment_spec.rb
  93. +40 −0 vendor/couchrest/spec/couchrest/more/extended_doc_inherited_spec.rb
  94. +746 −0 vendor/couchrest/spec/couchrest/more/extended_doc_spec.rb
  95. +98 −0 vendor/couchrest/spec/couchrest/more/extended_doc_subclass_spec.rb
  96. +456 −0 vendor/couchrest/spec/couchrest/more/extended_doc_view_spec.rb
  97. +289 −0 vendor/couchrest/spec/couchrest/more/property_spec.rb
  98. +3 −0 vendor/couchrest/spec/fixtures/attachments/README
  99. BIN vendor/couchrest/spec/fixtures/attachments/couchdb.png
  100. +11 −0 vendor/couchrest/spec/fixtures/attachments/test.html
  101. +35 −0 vendor/couchrest/spec/fixtures/more/article.rb
  102. +22 −0 vendor/couchrest/spec/fixtures/more/card.rb
  103. +20 −0 vendor/couchrest/spec/fixtures/more/cat.rb
  104. +14 −0 vendor/couchrest/spec/fixtures/more/course.rb
  105. +9 −0 vendor/couchrest/spec/fixtures/more/event.rb
  106. +17 −0 vendor/couchrest/spec/fixtures/more/invoice.rb
  107. +9 −0 vendor/couchrest/spec/fixtures/more/person.rb
  108. +6 −0 vendor/couchrest/spec/fixtures/more/question.rb
  109. +12 −0 vendor/couchrest/spec/fixtures/more/service.rb
  110. +22 −0 vendor/couchrest/spec/fixtures/more/user.rb
  111. +3 −0 vendor/couchrest/spec/fixtures/views/lib.js
  112. +3 −0 vendor/couchrest/spec/fixtures/views/test_view/lib.js
  113. +4 −0 vendor/couchrest/spec/fixtures/views/test_view/only-map.js
  114. +3 −0 vendor/couchrest/spec/fixtures/views/test_view/test-map.js
  115. +3 −0 vendor/couchrest/spec/fixtures/views/test_view/test-reduce.js
  116. +6 −0 vendor/couchrest/spec/spec.opts
  117. +37 −0 vendor/couchrest/spec/spec_helper.rb
  118. +27 −0 vendor/couchrest/utils/remap.rb
  119. +30 −0 vendor/couchrest/utils/subset.rb
View
@@ -1,21 +1,27 @@
-#require File.dirname(__FILE__) + '/../vendor/couchrest/couchrest'
+#require File.dirname(__FILE__) + '/../vendor/couchrest/lib/couchrest'
require File.dirname(__FILE__) + '/../vendor/maruku/maruku'
$LOAD_PATH.unshift File.dirname(__FILE__) + '/../vendor/syntax'
require 'syntax/convertors/html'
-class Post < CouchRest::Model
+class Post < CouchRest::ExtendedDocument
use_database CouchRest.database!((Blog.url_base_database || '') + Blog.database_name)
- key_accessor :title, :body, :slug, :tags, :not_public
-
+
+ property :title
+ property :body
+ property :slug
+ property :tags
+ property :not_public
+
view_by :created_at, :descending=>true
view_by :slug
view_by :not_public
+
view_by :created_at_and_public, :descending=>true,
:map =>
"function(doc) {
- if(doc['couchrest-type'] == 'Post' && !doc['not_public']) {
- emit(doc['created_at'],1);
+ if(doc.couchrest-type == 'Post' && !doc.not_public) {
+ emit(doc.created_at,1);
}
}",
:reduce =>
@@ -104,6 +110,11 @@ def self.make_slug(title)
def to_html(markdown)
h = Maruku.new(markdown).to_html
h.gsub!(/<pre>/, "<pre class=\"prettyprint\">")
+ #h.gsub!(/<code>/, "<code class=\"prettyprint\">")
+ #convertor = Syntax::Convertors::HTML.for_syntax("ruby")
+ #highlighted = convertor.convert($1)
+ #"<code>#{highlighted}</code>"
+ #end
h
end
View
@@ -1,13 +1,13 @@
-class FeedUser < CouchRest::Model
+class FeedUser < CouchRest::ExtendedDocument
use_database CouchRest.database!((Blog.url_base_database || '') + Blog.database_name)
#use_database CouchRest.database!("yet_another_please")
- key_accessor :last_access
- key_reader :uid
+ property :last_access
+ property :uid, :read_only => true
view_by :last_access
view_by :uid
- before(:create, :generate_uid)
+ before_create :generate_uid
def generate_uid
uuid = UUID.new
self['uid'] = uuid.generate :compact
@@ -18,4 +18,4 @@ def self.exists?(uid)
end
couchrest_type = 'FeedUser'
-end
+end
View
16 main.rb
@@ -1,7 +1,7 @@
require 'rubygems'
require 'sinatra'
require 'config/app_config.rb'
-require 'couchrest'
+require 'vendor/couchrest/lib/couchrest'
require 'uuid'
error do
@@ -37,16 +37,16 @@ def parse_tags tags
get '/' do
posts = []
if admin?
- posts = Post.by_created_at :count=>3
+ posts = Post.by_created_at :limit=>3
@readers = FeedUser.by_uid.size
else
- posts = Post.by_created_at_and_public :count=>3
+ posts = Post.by_created_at_and_public :limit=>3
end
erb :index, :locals => { :posts => posts }, :layout => false
end
get '/past/:year/:month/:day/:slug/' do
- post = Post.by_slug(:key=>params[:slug], :count=>1).first
+ post = Post.by_slug(:key=>params[:slug], :limit=>1).first
auth if post.not_public
stop [ 404, "Page not found" ] unless post
@title = post.title
@@ -86,10 +86,10 @@ def parse_tags tags
end
get '/feed/:uid' do
- user = FeedUser.by_uid(:key=>params[:uid], :count=>1).first
+ user = FeedUser.by_uid(:key=>params[:uid], :limit=>1).first
user.last_access = Time.now
user.save
- @posts = Post.by_created_at_and_public :count=>10
+ @posts = Post.by_created_at_and_public :limit=>10
content_type 'application/atom+xml', :charset => 'utf-8'
builder :feed
end
@@ -145,14 +145,14 @@ def parse_tags tags
get '/past/:year/:month/:day/:slug/edit' do
auth
- post = Post.by_slug(:key=>params[:slug], :count=>1).first
+ post = Post.by_slug(:key=>params[:slug], :limit=>1).first
stop [ 404, "Page not found" ] unless post
erb :edit, :locals => { :post => post, :url => post.url }
end
post '/past/:year/:month/:day/:slug/' do
auth
- post = Post.by_slug(:key=>params[:slug], :count=>1).first
+ post = Post.by_slug(:key=>params[:slug], :limit=>1).first
stop [ 404, "Page not found" ] unless post
post.title = params[:title]
post.tags = parse_tags(params[:tags])
@@ -0,0 +1,5 @@
+.DS_Store
+html/*
+pkg
+*.swp
+couchrest.gemspec
View
@@ -0,0 +1,176 @@
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
View
@@ -0,0 +1,46 @@
+# CouchRest: CouchDB, close to the metal
+
+CouchRest is based on [CouchDB's couch.js test
+library](http://svn.apache.org/repos/asf/couchdb/trunk/share/www/script/couch.js),
+which I find to be concise, clear, and well designed. CouchRest lightly wraps
+CouchDB's HTTP API, managing JSON serialization, and remembering the URI-paths
+to CouchDB's API endpoints so you don't have to.
+
+CouchRest is designed to make a simple base for application and framework-specific object oriented APIs. CouchRest is Object-Mapper agnostic, the parsed JSON it returns from CouchDB shows up as subclasses of Ruby's Hash. Naked JSON, just as it was mean to be.
+
+Note: CouchRest only support CouchDB 0.9.0 or newer.
+
+## Easy Install
+
+ $ sudo gem install couchrest
+
+### Relax, it's RESTful
+
+CouchRest rests on top of a HTTP abstraction layer using by default Heroku’s excellent REST Client Ruby HTTP wrapper.
+Other adapters can be added to support more http libraries.
+
+### Running the Specs
+
+The most complete documentation is the spec/ directory. To validate your
+CouchRest install, from the project root directory run `rake`, or `autotest`
+(requires RSpec and optionally ZenTest for autotest support).
+
+## Docs
+
+API: [http://rdoc.info/projects/couchrest/couchrest](http://rdoc.info/projects/couchrest/couchrest)
+
+Check the wiki for documentation and examples [http://wiki.github.com/couchrest/couchrest](http://wiki.github.com/couchrest/couchrest)
+
+## Contact
+
+Please post bugs, suggestions and patches to the bug tracker at <http://jchris.lighthouseapp.com/projects/17807-couchrest/overview>.
+
+Follow us on Twitter: http://twitter.com/couchrest
+
+Also, check http://twitter.com/#search?q=%23couchrest
+
+## Ruby on Rails
+
+CouchRest is compatible with rails and can even be used a Rails plugin.
+However, you might be interested in the CouchRest companion rails project:
+[http://github.com/hpoydar/couchrest-rails](http://github.com/hpoydar/couchrest-rails)
Oops, something went wrong.

0 comments on commit ed0cb78

Please sign in to comment.