rackjson 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.1
1
+ 0.2.0
@@ -0,0 +1,58 @@
1
+ module Rack::JSON
2
+ class Collection
3
+ def initialize(collection)
4
+ @collection = collection
5
+ end
6
+
7
+ def all(options={})
8
+ @collection.find({}, options).to_a
9
+ end
10
+
11
+ def create(document)
12
+ @collection.save(document)
13
+ end
14
+
15
+ def delete(selector={})
16
+ @collection.remove(prepared(selector))
17
+ end
18
+
19
+ def delete_all
20
+ @collection.remove
21
+ end
22
+
23
+ def exists?(selector)
24
+ !@collection.find(prepared(selector)).to_a.empty?
25
+ end
26
+
27
+ def find(selector, options={})
28
+ if selector.is_a? Hash
29
+ @collection.find(selector, options).inject([]) {|documents, row| documents << Rack::JSON::Document.new(row)}
30
+ else
31
+ Rack::JSON::Document.new(@collection.find_one(:_id => selector))
32
+ end
33
+ end
34
+
35
+ def save(document)
36
+ @collection.save(document)
37
+ end
38
+
39
+ def update(selector, document, query={})
40
+ if exists?(prepared(selector).merge(query))
41
+ @collection.update(prepared(selector).merge(query), document, :upsert => false)
42
+ else
43
+ false
44
+ end
45
+ end
46
+
47
+ private
48
+
49
+ def prepared selector
50
+ if selector.is_a? Hash
51
+ selector
52
+ else
53
+ {:_id => selector}
54
+ end
55
+ end
56
+
57
+ end
58
+ end
@@ -9,21 +9,24 @@ module Rack::JSON
9
9
  end
10
10
  end
11
11
 
12
+ def add_attributes(pair)
13
+ @document.attributes.merge!(pair)
14
+ end
15
+
12
16
  def method_missing(name, *args)
13
17
  @document.send(name, *args)
14
18
  end
15
19
 
16
- def to_json
20
+ def to_json(*a)
17
21
  unless @json
18
22
  gen_attrs = @document.attributes
19
23
  gen_attrs.each_pair do |key, value|
20
-
21
24
  if value.is_a? BSON::ObjectID
22
25
  gen_attrs[key] = gen_attrs[key].to_s
23
26
  end
24
27
  end
25
28
  end
26
- @json ||= JSON.generate gen_attrs
29
+ gen_attrs.to_json
27
30
  end
28
31
  end
29
32
  end
@@ -0,0 +1,44 @@
1
+ module Rack::JSON
2
+ class Filter
3
+
4
+ def initialize(app, options)
5
+ @app = app
6
+ @collections = options[:collections]
7
+ @filters = options[:filters]
8
+ end
9
+
10
+ def call(env)
11
+ request = Rack::JSON::Request.new(env)
12
+ if bypass? request
13
+ @app.call(env)
14
+ else
15
+ apply_filters(request)
16
+ end
17
+ end
18
+
19
+ private
20
+
21
+ def append_filters_to_document_in request
22
+ document = Rack::JSON::Document.new(request.json)
23
+ document.add_attributes(request.session.reject { |key, value| !@filters.include?(key.to_sym) })
24
+ request.set_body(document.to_json)
25
+ end
26
+
27
+ def apply_filters(request)
28
+ @filters.each do |filter|
29
+ return pre_condition_not_met unless request.session[filter.to_s]
30
+ request.add_query_param "[?#{filter}=#{request.session[filter.to_s]}]"
31
+ end
32
+ append_filters_to_document_in request if request.post? || request.put?
33
+ @app.call(request.env)
34
+ end
35
+
36
+ def bypass?(request)
37
+ request.collection.empty? || !(@collections.include? request.collection.to_sym)
38
+ end
39
+
40
+ def pre_condition_not_met
41
+ Rack::JSON::Response.new("pre condition not met", :status => 412, :head => true).to_a
42
+ end
43
+ end
44
+ end
@@ -1,10 +1,18 @@
1
1
  module Rack::JSON
2
2
  class Request < Rack::Request
3
3
  include Rack::Utils
4
+
5
+ attr_reader :env
6
+
4
7
  def initialize(env)
8
+ @env = env
5
9
  super(env)
6
10
  end
7
11
 
12
+ def add_query_param(param)
13
+ self.query_string << param
14
+ end
15
+
8
16
  def collection
9
17
  self.path_info.split('/')[1] || ""
10
18
  end
@@ -34,5 +42,14 @@ module Rack::JSON
34
42
  id_string.match(/^\d+$/) ? id_string.to_i : id_string
35
43
  end
36
44
  end
45
+
46
+ def session
47
+ @env['rack.session']
48
+ end
49
+
50
+ def set_body json
51
+ @env['rack.input'] = StringIO.new(json)
52
+ @env['rack.input'].rewind
53
+ end
37
54
  end
38
55
  end
@@ -13,7 +13,7 @@ module Rack::JSON
13
13
  if bypass? request
14
14
  @app.call(env)
15
15
  else
16
- @collection = @db[request.collection]
16
+ @collection = Rack::JSON::Collection.new(@db[request.collection])
17
17
  send(request.request_method.downcase, request)
18
18
  end
19
19
  end
@@ -21,12 +21,12 @@ module Rack::JSON
21
21
  private
22
22
 
23
23
  def bypass?(request)
24
- !(@collections.include? request.collection.to_sym)
24
+ request.collection.empty? || !(@collections.include? request.collection.to_sym)
25
25
  end
26
26
 
27
27
  def delete(request)
28
28
  if request.member_path?
29
- if @collection.remove({:_id => request.resource_id})
29
+ if @collection.delete({:_id => request.resource_id})
30
30
  render "{'ok': true}"
31
31
  end
32
32
  else
@@ -37,12 +37,11 @@ module Rack::JSON
37
37
  [:get, :head].each do |method|
38
38
  define_method method do |request|
39
39
  request.query.selector.merge!({:_id => request.resource_id}) if request.member_path?
40
- rows = []
41
- @collection.find(request.query.selector, request.query.options).each { |row| rows << Rack::JSON::Document.new(row).attributes }
42
- if rows.empty? && request.member_path?
40
+ documents = @collection.find(request.query.selector, request.query.options)
41
+ if documents.empty? && request.member_path?
43
42
  render "document not found", :status => 404, :head => (method == :head)
44
43
  else
45
- render JSON.generate(rows), :head => (method == :head)
44
+ render JSON.generate(documents), :head => (method == :head)
46
45
  end
47
46
  end
48
47
  end
@@ -58,18 +57,14 @@ module Rack::JSON
58
57
 
59
58
  def post(request)
60
59
  document = Rack::JSON::Document.new(request.json)
61
- @collection.insert(document.attributes)
60
+ @collection.create(document.attributes)
62
61
  render document.to_json, :status => 201
63
62
  rescue JSON::ParserError => error
64
63
  render (error.class.to_s + " :" + error.message), :status => 422
65
64
  end
66
65
 
67
66
  def put(request)
68
- @collection.find_one(:_id => request.resource_id) ? status = 200 : status = 201
69
- document = Rack::JSON::Document.new(request.json)
70
- document.add_id(request.resource_id)
71
- @collection.save(document.attributes)
72
- render document.to_json, :status => status
67
+ @collection.exists?(request.resource_id) ? update(request) : upsert(request)
73
68
  rescue JSON::ParserError => error
74
69
  render (error.class.to_s + " :" + error.message), :status => 422
75
70
  end
@@ -78,8 +73,25 @@ module Rack::JSON
78
73
  Rack::JSON::Response.new(body, options).to_a
79
74
  end
80
75
 
76
+ def update(request)
77
+ document = Rack::JSON::Document.new(request.json)
78
+ document.add_id(request.resource_id)
79
+ if @collection.update(request.resource_id, document.attributes, request.query.selector)
80
+ render document.to_json, :status => 200
81
+ else
82
+ render "document not found", :status => 404
83
+ end
84
+ end
85
+
86
+ def upsert(request)
87
+ document = Rack::JSON::Document.new(request.json)
88
+ document.add_id(request.resource_id)
89
+ @collection.save(document.attributes)
90
+ render document.to_json, :status => 201
91
+ end
92
+
81
93
  METHODS_NOT_ALLOWED.each do |method|
82
- define_method method do
94
+ define_method method do |request|
83
95
  render "", :status => 405
84
96
  end
85
97
  end
@@ -10,7 +10,7 @@ module Rack::JSON
10
10
  end
11
11
 
12
12
  def to_a
13
- [@status, @headers, @body]
13
+ [@status, @headers, [@body]]
14
14
  end
15
15
 
16
16
  private
data/lib/rackjson.rb CHANGED
@@ -1,40 +1,22 @@
1
- module Rack #:nodoc:
2
- class Builder
3
-
4
- # Setup resource collections hosted behind OAuth and OpenID auth filters.
5
- #
6
- # ===Example
7
- # contain :notes, :projects
8
- #
9
- # def contain(*args)
10
- # @ins << lambda do |app|
11
- # Rack::Session::Pool.new(
12
- # CloudKit::OAuthFilter.new(
13
- # CloudKit::OpenIDFilter.new(
14
- # CloudKit::Service.new(app, :collections => args.to_a))))
15
- # end
16
- # @last_cloudkit_id = @ins.last.object_id
17
- # end
18
-
19
- def private_resource
20
- @ins << lambda do |app|
21
- Rack::JSON::UserFilter.new(
22
- Rack::JSON::Resource.new(app, args.first),
23
- args.first
24
- )
25
- end
1
+ class Hash
2
+ def symbolize_keys
3
+ inject({}) do |options, (key, value)|
4
+ options[(key.to_sym rescue key) || key] = value
5
+ options
26
6
  end
7
+ end
27
8
 
28
- # Setup resource collections without authentication.
29
- #
30
- # ===Example
31
- # expose_resources :collections => [:notes, :projects], :db => Mongo::Connection.new.db("my_mongodb")
32
- #
33
- def expose_resource(*args)
34
- @ins << lambda do |app|
35
- Rack::JSON::Resource.new(app, args.first)
36
- end
37
- end
9
+ def symbolize_keys!
10
+ self.replace(self.symbolize_keys)
11
+ end
12
+
13
+ def recursive_symbolize_keys!
14
+ symbolize_keys!
15
+ # symbolize each hash in .values
16
+ values.each{|h| h.recursive_symbolize_keys! if h.is_a?(Hash) }
17
+ # symbolize each hash inside an array in .values
18
+ values.select{|v| v.is_a?(Array) }.flatten.each{|h| h.recursive_symbolize_keys! if h.is_a?(Hash) }
19
+ self
38
20
  end
39
21
  end
40
22
 
@@ -46,6 +28,8 @@ require 'time'
46
28
 
47
29
  module Rack::JSON
48
30
 
31
+ autoload :Collection, 'rackjson/collection'
32
+ autoload :Filter, 'rackjson/filter'
49
33
  autoload :Document, 'rackjson/document'
50
34
  autoload :JSONDocument, 'rackjson/json_document'
51
35
  autoload :JSONQuery, 'rackjson/json_query'
data/rackjson.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{rackjson}
8
- s.version = "0.1.1"
8
+ s.version = "0.2.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Oliver Nightingale"]
12
- s.date = %q{2010-04-25}
12
+ s.date = %q{2010-04-26}
13
13
  s.description = %q{A rack end point for storing json documents.}
14
14
  s.email = %q{oliver.n@new-bamboo.co.uk}
15
15
  s.extra_rdoc_files = [
@@ -24,7 +24,9 @@ Gem::Specification.new do |s|
24
24
  "Rakefile",
25
25
  "VERSION",
26
26
  "lib/rackjson.rb",
27
+ "lib/rackjson/collection.rb",
27
28
  "lib/rackjson/document.rb",
29
+ "lib/rackjson/filter.rb",
28
30
  "lib/rackjson/json_document.rb",
29
31
  "lib/rackjson/json_query.rb",
30
32
  "lib/rackjson/mongo_document.rb",
@@ -34,7 +36,9 @@ Gem::Specification.new do |s|
34
36
  "rackjson.gemspec",
35
37
  "test/helper.rb",
36
38
  "test/suite.rb",
39
+ "test/test_collection.rb",
37
40
  "test/test_document.rb",
41
+ "test/test_filter.rb",
38
42
  "test/test_json_document.rb",
39
43
  "test/test_json_query.rb",
40
44
  "test/test_mongo_document.rb",
@@ -44,13 +48,14 @@ Gem::Specification.new do |s|
44
48
  s.homepage = %q{http://github.com/olivernn/rackjson}
45
49
  s.rdoc_options = ["--charset=UTF-8"]
46
50
  s.require_paths = ["lib"]
47
- s.rubygems_version = %q{1.3.6}
51
+ s.rubygems_version = %q{1.3.5}
48
52
  s.summary = %q{A rack end point for storing json documents.}
49
53
  s.test_files = [
50
54
  "test/helper.rb",
51
55
  "test/suite.rb",
52
- "test/test_builder.rb",
56
+ "test/test_collection.rb",
53
57
  "test/test_document.rb",
58
+ "test/test_filter.rb",
54
59
  "test/test_json_document.rb",
55
60
  "test/test_json_query.rb",
56
61
  "test/test_mongo_document.rb",
data/test/helper.rb CHANGED
@@ -3,6 +3,7 @@ require 'test/unit'
3
3
  require 'rack'
4
4
  require 'rack/test'
5
5
  require 'timecop'
6
+ require 'uri'
6
7
 
7
8
  $LOAD_PATH.unshift(File.dirname(__FILE__))
8
9
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
@@ -0,0 +1,109 @@
1
+ require 'helper'
2
+
3
+ class CollectionTest < Test::Unit::TestCase
4
+ def setup
5
+ @db = Mongo::Connection.new.db("test")
6
+ @mongo_collection = @db['testing']
7
+ @collection = Rack::JSON::Collection.new(@mongo_collection)
8
+ end
9
+
10
+ def teardown
11
+ @collection.delete_all
12
+ end
13
+
14
+ def test_finding_a_single_document_by_id
15
+ mongo_document = @mongo_collection.save({:testing => true, :rating => 5, :title => 'testing', :_id => 1})
16
+ assert_equal @collection.find(1).attributes, @mongo_collection.find_one(:_id => 1)
17
+ assert_kind_of Rack::JSON::Document, @collection.find(1)
18
+ end
19
+
20
+ def test_finding_documents_using_search_conditions
21
+ mongo_document = @mongo_collection.save({:testing => true, :rating => 5, :title => 'testing', :_id => 1})
22
+ mongo_results = []
23
+ @mongo_collection.find(:testing => true).each { |row| mongo_results << row }
24
+ assert_equal @collection.find(:testing => true).first.attributes, mongo_results.first
25
+ assert_kind_of Rack::JSON::Document, @collection.find(:testing => true).first
26
+ end
27
+
28
+ def test_finding_documents_using_multiple_search_conditions
29
+ mongo_document = @mongo_collection.save({:testing => true, :rating => 5, :title => 'testing', :_id => 1})
30
+ mongo_results = []
31
+ @mongo_collection.find(:testing => true, :rating => 5).each { |row| mongo_results << row }
32
+ assert_equal @collection.find(:testing => true, :rating => 5).length, mongo_results.length
33
+ assert_equal @collection.find(:testing => true, :rating => 5).first.attributes, mongo_results.first
34
+ end
35
+
36
+ def test_finding_no_documents_using_search_conditions
37
+ mongo_document = @mongo_collection.save({:testing => true, :rating => 5, :title => 'testing', :_id => 1})
38
+ assert_equal @collection.find(:testing => false, :rating => 5), []
39
+ end
40
+
41
+ def test_finding_documents_with_options
42
+ first_mongo_document = @mongo_collection.save({:testing => true, :rating => 5, :title => 'testing', :_id => 1})
43
+ second_mongo_document = @mongo_collection.save({:testing => true, :rating => 10, :title => 'testing', :_id => 2})
44
+ third_mongo_document = @mongo_collection.save({:testing => false, :rating => 10, :title => 'testing', :_id => 3})
45
+ assert_equal @collection.find({:testing => true}, {:sort => [:rating, :desc]}).length, 2
46
+ assert_equal @collection.find({:testing => true}, {:sort => [:rating, :desc]}).first.attributes["rating"], 10
47
+ assert_equal @collection.find({:testing => true}, {:sort => [:rating, :desc]}).first.attributes["testing"], true
48
+ end
49
+
50
+ def test_finding_all_documents_with_options
51
+ first_mongo_document = @mongo_collection.save({:testing => true, :rating => 5, :title => 'testing', :_id => 1})
52
+ second_mongo_document = @mongo_collection.save({:testing => true, :rating => 10, :title => 'testing', :_id => 2})
53
+ assert_equal @collection.all({:sort => [:rating, :desc]}).length, 2
54
+ assert_equal @collection.all({:sort => [:rating, :desc]}).first["rating"], 10
55
+ end
56
+
57
+ def test_finding_all_documents
58
+ first_mongo_document = @mongo_collection.save({:testing => true, :rating => 5, :title => 'testing', :_id => 1})
59
+ second_mongo_document = @mongo_collection.save({:testing => true, :rating => 10, :title => 'testing', :_id => 2})
60
+ assert_equal @collection.all.length, 2
61
+ end
62
+
63
+ def test_removing_a_document
64
+ first_mongo_document = @mongo_collection.save({:testing => true, :rating => 5, :title => 'testing', :_id => 1})
65
+ second_mongo_document = @mongo_collection.save({:testing => true, :rating => 10, :title => 'testing', :_id => 2})
66
+ assert_equal @collection.all.length, 2
67
+ @collection.delete(1)
68
+ assert_equal @collection.all.length, 1
69
+ assert_equal @collection.all.first["_id"], 2
70
+ end
71
+
72
+ def test_removing_all_documents
73
+ first_mongo_document = @mongo_collection.save({:testing => true, :rating => 5, :title => 'testing', :_id => 1})
74
+ second_mongo_document = @mongo_collection.save({:testing => true, :rating => 10, :title => 'testing', :_id => 2})
75
+ assert_equal @collection.all.length, 2
76
+ @collection.delete
77
+ assert_equal @collection.all.length, 0
78
+ end
79
+
80
+ def test_whether_a_document_exists
81
+ first_mongo_document = @mongo_collection.save({:testing => true, :rating => 5, :title => 'testing', :_id => 1})
82
+ assert_equal @collection.all.length, 1
83
+ assert @collection.exists?(1)
84
+ assert !@collection.exists?(2)
85
+ end
86
+
87
+ def test_creating_a_document
88
+ assert_equal @collection.all.length, 0
89
+ assert @collection.create({:_id => 1, :title => 'testing'})
90
+ assert_equal @collection.all.length, 1
91
+ assert_equal @collection.find(1).attributes["title"], "testing"
92
+ end
93
+
94
+ def test_updating_an_existing_document_by_id
95
+ first_mongo_document = @mongo_collection.save({:testing => true, :rating => 5, :title => 'testing', :_id => 1})
96
+ assert_equal @collection.all.length, 1
97
+ assert @collection.exists?(1)
98
+ assert @collection.update(1, {:testing => false})
99
+ assert_equal @collection.find(1).attributes["testing"], false
100
+ end
101
+
102
+ def test_updating_an_existing_document_but_selector_fails
103
+ first_mongo_document = @mongo_collection.save({:testing => true, :rating => 5, :title => 'testing', :_id => 1})
104
+ assert_equal @collection.all.length, 1
105
+ assert @collection.exists?(1)
106
+ assert !@collection.update(1, {:testing => false}, {:rating => 6})
107
+ assert_equal @collection.find(1).attributes["testing"], true
108
+ end
109
+ end
@@ -11,6 +11,13 @@ class DocumentTest < Test::Unit::TestCase
11
11
  @collection.drop
12
12
  end
13
13
 
14
+ def test_adding_attributes_to_the_document
15
+ json = '{"test":"hello"}'
16
+ document = Rack::JSON::Document.new(json)
17
+ document.add_attributes("user_id" => 1)
18
+ assert_equal(1, document.attributes["user_id"])
19
+ end
20
+
14
21
  def test_creating_from_json
15
22
  json = '{"test":"hello"}'
16
23
  document = Rack::JSON::Document.new(json)
@@ -0,0 +1,58 @@
1
+ require 'helper'
2
+
3
+ class FilterTest < Test::Unit::TestCase
4
+ include Rack::Test::Methods
5
+ include Rack::Utils
6
+
7
+ def app
8
+ Rack::Session::Cookie.new(
9
+ Rack::JSON::Filter.new lambda { |env|
10
+ request = Rack::JSON::Request.new(env)
11
+ env['rack.session'] = {}
12
+ env['rack.session']['user_id'] = 1
13
+ [200, {'Content-Length' => request.json.length.to_s, 'Content-Type' => 'text/plain'}, [request.json]]
14
+ }, :collections => [:testing], :filters => [:user_id]
15
+ )
16
+ end
17
+
18
+ def test_adding_user_id_query_parameter
19
+ get '/login'
20
+ get '/testing'
21
+ assert_equal "[?user_id=1]", last_request.query_string
22
+ end
23
+
24
+ def test_not_overriding_existing_query_parameters
25
+ get '/login'
26
+ get '/testing?[?title=awesome]'
27
+ assert_equal '[?title=awesome][?user_id=1]', URI.decode(last_request.query_string)
28
+ end
29
+
30
+ def test_reject_request_if_no_session_var
31
+ get '/testing'
32
+ assert_equal 412, last_response.status
33
+ end
34
+
35
+ def test_setting_query_params_on_post
36
+ get '/login'
37
+ post '/testing', '{ "title": "hello!" }'
38
+ assert_equal "[?user_id=1]", last_request.query_string
39
+ end
40
+
41
+ def test_setting_query_params_on_put
42
+ get '/login'
43
+ put '/testing/1', '{ "title": "hello!" }'
44
+ assert_equal "[?user_id=1]", last_request.query_string
45
+ end
46
+
47
+ def test_setting_query_params_on_delete
48
+ get '/login'
49
+ delete '/testing'
50
+ assert_equal "[?user_id=1]", last_request.query_string
51
+ end
52
+
53
+ def test_appending_query_param_to_document
54
+ get '/login'
55
+ post '/testing', '{ "title": "hello!" }'
56
+ assert_match /"user_id":1/, last_response.body
57
+ end
58
+ end
@@ -14,15 +14,25 @@ class ResourceTest < Test::Unit::TestCase
14
14
 
15
15
  def app
16
16
  Rack::JSON::Resource.new lambda { |env|
17
- [404, {'Content-Length' => '9', 'Content-Type' => 'text/plain'}, "Not Found"]
17
+ [404, {'Content-Length' => '9', 'Content-Type' => 'text/plain'}, ["Not Found"]]
18
18
  }, :collections => [:testing], :db => @db
19
19
  end
20
20
 
21
- def test_non_existing_resource
21
+ def test_get_non_existing_resource
22
22
  get '/blah'
23
23
  assert_equal 404, last_response.status
24
24
  end
25
25
 
26
+ def test_post_non_existing_resource
27
+ post '/blah', '{ "title": "hello!" }'
28
+ assert_equal 404, last_response.status
29
+ end
30
+
31
+ def test_get_root
32
+ get '/'
33
+ assert_equal 404, last_response.status
34
+ end
35
+
26
36
  def test_index_method
27
37
  @collection.save({:testing => true})
28
38
  get '/testing'
@@ -39,7 +49,7 @@ class ResourceTest < Test::Unit::TestCase
39
49
 
40
50
  def test_show_a_single_document
41
51
  put '/testing/1', '{"title": "testing first"}'
42
- put '/testing/2', '{"title": "testing second"}'
52
+ post '/testing', '{"title": "testing second"}'
43
53
  get '/testing/1'
44
54
  assert last_response.ok?
45
55
  assert_match /"title":"testing first"/, last_response.body
@@ -87,6 +97,22 @@ class ResourceTest < Test::Unit::TestCase
87
97
  assert_match /"title":"testing update"/, last_response.body
88
98
  end
89
99
 
100
+ def test_updating_a_document_with_matching_query_params
101
+ @collection.save({:title => 'testing', :_id => 1, :user_id => 1})
102
+ put '/testing/1?[?user_id=1]', '{"title": "testing update"}'
103
+ assert last_response.ok?
104
+ assert_match /"_id":1/, last_response.body
105
+ assert_match /"title":"testing update"/, last_response.body
106
+ end
107
+
108
+ def test_updating_a_document_with_non_matching_query_params
109
+ @collection.save({:title => 'testing', :_id => 1, :user_id => 2})
110
+ put '/testing/1?[?user_id=1]', '{"title": "testing update"}'
111
+ assert_equal 404, last_response.status
112
+ assert_equal @collection.find_one(:_id => 1)["title"], 'testing'
113
+ assert_nil @collection.find_one(:_id => 1, :user_id => 1)
114
+ end
115
+
90
116
  def test_deleting_a_document
91
117
  @collection.save({:title => 'testing', :_id => 1})
92
118
  assert @collection.find_one({:_id => 1})
@@ -18,7 +18,7 @@ class ResponseTest < Test::Unit::TestCase
18
18
 
19
19
  def test_response_body
20
20
  response = Rack::JSON::Response.new("test")
21
- assert_equal("test", response.to_a[2])
21
+ assert_equal(["test"], response.to_a[2])
22
22
  end
23
23
 
24
24
  def test_setting_the_content_length
@@ -33,12 +33,12 @@ class ResponseTest < Test::Unit::TestCase
33
33
 
34
34
  def test_sending_json
35
35
  response = Rack::JSON::Response.new("{'title': 'hello'}")
36
- assert_equal("{'title': 'hello'}", response.to_a[2])
36
+ assert_equal(["{'title': 'hello'}"], response.to_a[2])
37
37
  end
38
38
 
39
39
  def test_head_response
40
40
  response = Rack::JSON::Response.new("test", :head => true)
41
- assert_equal("", response.to_a[2])
41
+ assert_equal([""], response.to_a[2])
42
42
  assert_equal("4", response.to_a[1]["Content-Length"])
43
43
  assert_equal("text/plain", response.to_a[1]["Content-Type"])
44
44
  end
metadata CHANGED
@@ -1,12 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rackjson
3
3
  version: !ruby/object:Gem::Version
4
- prerelease: false
5
- segments:
6
- - 0
7
- - 1
8
- - 1
9
- version: 0.1.1
4
+ version: 0.2.0
10
5
  platform: ruby
11
6
  authors:
12
7
  - Oliver Nightingale
@@ -14,65 +9,49 @@ autorequire:
14
9
  bindir: bin
15
10
  cert_chain: []
16
11
 
17
- date: 2010-04-25 00:00:00 +01:00
12
+ date: 2010-04-26 00:00:00 +01:00
18
13
  default_executable:
19
14
  dependencies:
20
15
  - !ruby/object:Gem::Dependency
21
16
  name: mongo
22
- prerelease: false
23
- requirement: &id001 !ruby/object:Gem::Requirement
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
24
20
  requirements:
25
21
  - - ">="
26
22
  - !ruby/object:Gem::Version
27
- segments:
28
- - 0
29
- - 19
30
- - 1
31
23
  version: 0.19.1
32
- type: :runtime
33
- version_requirements: *id001
24
+ version:
34
25
  - !ruby/object:Gem::Dependency
35
26
  name: mongo_ext
36
- prerelease: false
37
- requirement: &id002 !ruby/object:Gem::Requirement
27
+ type: :runtime
28
+ version_requirement:
29
+ version_requirements: !ruby/object:Gem::Requirement
38
30
  requirements:
39
31
  - - ">="
40
32
  - !ruby/object:Gem::Version
41
- segments:
42
- - 0
43
- - 19
44
- - 1
45
33
  version: 0.19.1
46
- type: :runtime
47
- version_requirements: *id002
34
+ version:
48
35
  - !ruby/object:Gem::Dependency
49
36
  name: json
50
- prerelease: false
51
- requirement: &id003 !ruby/object:Gem::Requirement
37
+ type: :runtime
38
+ version_requirement:
39
+ version_requirements: !ruby/object:Gem::Requirement
52
40
  requirements:
53
41
  - - ">="
54
42
  - !ruby/object:Gem::Version
55
- segments:
56
- - 1
57
- - 2
58
- - 3
59
43
  version: 1.2.3
60
- type: :runtime
61
- version_requirements: *id003
44
+ version:
62
45
  - !ruby/object:Gem::Dependency
63
46
  name: rack
64
- prerelease: false
65
- requirement: &id004 !ruby/object:Gem::Requirement
47
+ type: :runtime
48
+ version_requirement:
49
+ version_requirements: !ruby/object:Gem::Requirement
66
50
  requirements:
67
51
  - - ">="
68
52
  - !ruby/object:Gem::Version
69
- segments:
70
- - 1
71
- - 0
72
- - 1
73
53
  version: 1.0.1
74
- type: :runtime
75
- version_requirements: *id004
54
+ version:
76
55
  description: A rack end point for storing json documents.
77
56
  email: oliver.n@new-bamboo.co.uk
78
57
  executables: []
@@ -90,7 +69,9 @@ files:
90
69
  - Rakefile
91
70
  - VERSION
92
71
  - lib/rackjson.rb
72
+ - lib/rackjson/collection.rb
93
73
  - lib/rackjson/document.rb
74
+ - lib/rackjson/filter.rb
94
75
  - lib/rackjson/json_document.rb
95
76
  - lib/rackjson/json_query.rb
96
77
  - lib/rackjson/mongo_document.rb
@@ -100,7 +81,9 @@ files:
100
81
  - rackjson.gemspec
101
82
  - test/helper.rb
102
83
  - test/suite.rb
84
+ - test/test_collection.rb
103
85
  - test/test_document.rb
86
+ - test/test_filter.rb
104
87
  - test/test_json_document.rb
105
88
  - test/test_json_query.rb
106
89
  - test/test_mongo_document.rb
@@ -119,28 +102,27 @@ required_ruby_version: !ruby/object:Gem::Requirement
119
102
  requirements:
120
103
  - - ">="
121
104
  - !ruby/object:Gem::Version
122
- segments:
123
- - 0
124
105
  version: "0"
106
+ version:
125
107
  required_rubygems_version: !ruby/object:Gem::Requirement
126
108
  requirements:
127
109
  - - ">="
128
110
  - !ruby/object:Gem::Version
129
- segments:
130
- - 0
131
111
  version: "0"
112
+ version:
132
113
  requirements: []
133
114
 
134
115
  rubyforge_project:
135
- rubygems_version: 1.3.6
116
+ rubygems_version: 1.3.5
136
117
  signing_key:
137
118
  specification_version: 3
138
119
  summary: A rack end point for storing json documents.
139
120
  test_files:
140
121
  - test/helper.rb
141
122
  - test/suite.rb
142
- - test/test_builder.rb
123
+ - test/test_collection.rb
143
124
  - test/test_document.rb
125
+ - test/test_filter.rb
144
126
  - test/test_json_document.rb
145
127
  - test/test_json_query.rb
146
128
  - test/test_mongo_document.rb
data/test/test_builder.rb DELETED
@@ -1,17 +0,0 @@
1
- require 'helper'
2
- require 'rack/builder'
3
-
4
- class BuilderTest < Test::Unit::TestCase
5
-
6
- def test_expose_resource_shortcut
7
- app = Rack::Builder.new do
8
- expose_resource :collections => [:testing], :db => Mongo::Connection.new.db("test")
9
- run lambda { |env|
10
- [404, {'Content-Length' => '9', 'Content-Type' => 'text/plain'}, "Not Found"]
11
- }
12
- end
13
-
14
- response = Rack::MockRequest.new(app).get('/testing')
15
- assert response.ok?
16
- end
17
- end