rackjson 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.0
1
+ 0.2.1
@@ -47,11 +47,7 @@ module Rack::JSON
47
47
  private
48
48
 
49
49
  def prepared selector
50
- if selector.is_a? Hash
51
- selector
52
- else
53
- {:_id => selector}
54
- end
50
+ selector.is_a?(Hash) ? selector : {:_id => selector}
55
51
  end
56
52
 
57
53
  end
@@ -0,0 +1,22 @@
1
+ module Rack::JSON
2
+ module EndPoint
3
+
4
+ private
5
+
6
+ def bypass? request
7
+ request.collection.empty? || !(@collections.include? request.collection.to_sym)
8
+ end
9
+
10
+ def bypass_path? request
11
+ bypass? request
12
+ end
13
+
14
+ def bypass_method? request
15
+ !@methods.include?(request.request_method.downcase.to_sym)
16
+ end
17
+
18
+ def render body, options={}
19
+ Rack::JSON::Response.new(body, options).to_a
20
+ end
21
+ end
22
+ end
@@ -1,15 +1,17 @@
1
1
  module Rack::JSON
2
2
  class Filter
3
+ include Rack::JSON::EndPoint
3
4
 
4
5
  def initialize(app, options)
5
6
  @app = app
6
7
  @collections = options[:collections]
7
8
  @filters = options[:filters]
9
+ @methods = options[:methods]
8
10
  end
9
11
 
10
12
  def call(env)
11
13
  request = Rack::JSON::Request.new(env)
12
- if bypass? request
14
+ if bypass_path?(request) || bypass_method?(request)
13
15
  @app.call(env)
14
16
  else
15
17
  apply_filters(request)
@@ -26,19 +28,15 @@ module Rack::JSON
26
28
 
27
29
  def apply_filters(request)
28
30
  @filters.each do |filter|
29
- return pre_condition_not_met unless request.session[filter.to_s]
31
+ return pre_condition_not_met unless request.session.keys.include? filter.to_s
30
32
  request.add_query_param "[?#{filter}=#{request.session[filter.to_s]}]"
31
33
  end
32
34
  append_filters_to_document_in request if request.post? || request.put?
33
35
  @app.call(request.env)
34
36
  end
35
37
 
36
- def bypass?(request)
37
- request.collection.empty? || !(@collections.include? request.collection.to_sym)
38
- end
39
-
40
38
  def pre_condition_not_met
41
- Rack::JSON::Response.new("pre condition not met", :status => 412, :head => true).to_a
39
+ render "pre condition not met", :status => 412, :head => true
42
40
  end
43
41
  end
44
42
  end
@@ -1,5 +1,6 @@
1
1
  module Rack::JSON
2
2
  class Resource
3
+ include Rack::JSON::EndPoint
3
4
  METHODS_NOT_ALLOWED = [:trace, :connect]
4
5
 
5
6
  def initialize(app, options)
@@ -20,10 +21,6 @@ module Rack::JSON
20
21
 
21
22
  private
22
23
 
23
- def bypass?(request)
24
- request.collection.empty? || !(@collections.include? request.collection.to_sym)
25
- end
26
-
27
24
  def delete(request)
28
25
  if request.member_path?
29
26
  if @collection.delete({:_id => request.resource_id})
@@ -69,10 +66,6 @@ module Rack::JSON
69
66
  render (error.class.to_s + " :" + error.message), :status => 422
70
67
  end
71
68
 
72
- def render(body, options={})
73
- Rack::JSON::Response.new(body, options).to_a
74
- end
75
-
76
69
  def update(request)
77
70
  document = Rack::JSON::Document.new(request.json)
78
71
  document.add_id(request.resource_id)
data/lib/rackjson.rb CHANGED
@@ -1,25 +1,3 @@
1
- class Hash
2
- def symbolize_keys
3
- inject({}) do |options, (key, value)|
4
- options[(key.to_sym rescue key) || key] = value
5
- options
6
- end
7
- end
8
-
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
20
- end
21
- end
22
-
23
1
  require 'rubygems'
24
2
  require 'json'
25
3
  require 'rack'
@@ -28,6 +6,7 @@ require 'time'
28
6
 
29
7
  module Rack::JSON
30
8
 
9
+ autoload :EndPoint, 'rackjson/end_point'
31
10
  autoload :Collection, 'rackjson/collection'
32
11
  autoload :Filter, 'rackjson/filter'
33
12
  autoload :Document, 'rackjson/document'
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.2.0"
8
+ s.version = "0.2.1"
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-26}
12
+ s.date = %q{2010-04-29}
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 = [
@@ -26,6 +26,7 @@ Gem::Specification.new do |s|
26
26
  "lib/rackjson.rb",
27
27
  "lib/rackjson/collection.rb",
28
28
  "lib/rackjson/document.rb",
29
+ "lib/rackjson/end_point.rb",
29
30
  "lib/rackjson/filter.rb",
30
31
  "lib/rackjson/json_document.rb",
31
32
  "lib/rackjson/json_query.rb",
data/test/helper.rb CHANGED
@@ -10,4 +10,16 @@ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
10
10
  require 'rackjson'
11
11
 
12
12
  class Test::Unit::TestCase
13
+ def self.test(name, &block)
14
+ test_name = "test_#{name.gsub(/\s+/,'_')}".to_sym
15
+ defined = instance_method(test_name) rescue false
16
+ raise "#{test_name} is already defined in #{self}" if defined
17
+ if block_given?
18
+ define_method(test_name, &block)
19
+ else
20
+ define_method(test_name) do
21
+ flunk "No implementation provided for #{name}"
22
+ end
23
+ end
24
+ end
13
25
  end
@@ -11,7 +11,7 @@ class CollectionTest < Test::Unit::TestCase
11
11
  @collection.delete_all
12
12
  end
13
13
 
14
- def test_finding_a_single_document_by_id
14
+ test "finding a single document by id" do
15
15
  mongo_document = @mongo_collection.save({:testing => true, :rating => 5, :title => 'testing', :_id => 1})
16
16
  assert_equal @collection.find(1).attributes, @mongo_collection.find_one(:_id => 1)
17
17
  assert_kind_of Rack::JSON::Document, @collection.find(1)
data/test/test_filter.rb CHANGED
@@ -11,46 +11,60 @@ class FilterTest < Test::Unit::TestCase
11
11
  env['rack.session'] = {}
12
12
  env['rack.session']['user_id'] = 1
13
13
  [200, {'Content-Length' => request.json.length.to_s, 'Content-Type' => 'text/plain'}, [request.json]]
14
- }, :collections => [:testing], :filters => [:user_id]
14
+ }, :collections => [:testing], :filters => [:user_id], :methods => @test_methods || [:get, :post, :put, :delete]
15
15
  )
16
16
  end
17
17
 
18
- def test_adding_user_id_query_parameter
18
+ test "adding a user id query parameter" do
19
19
  get '/login'
20
20
  get '/testing'
21
21
  assert_equal "[?user_id=1]", last_request.query_string
22
22
  end
23
23
 
24
- def test_not_overriding_existing_query_parameters
24
+ test "dont override any existing query parameters" do
25
25
  get '/login'
26
26
  get '/testing?[?title=awesome]'
27
27
  assert_equal '[?title=awesome][?user_id=1]', URI.decode(last_request.query_string)
28
28
  end
29
29
 
30
- def test_reject_request_if_no_session_var
30
+ test "reject request if no session var" do
31
31
  get '/testing'
32
32
  assert_equal 412, last_response.status
33
33
  end
34
34
 
35
- def test_setting_query_params_on_post
35
+ test "setting query parameters on a post request" do
36
36
  get '/login'
37
37
  post '/testing', '{ "title": "hello!" }'
38
38
  assert_equal "[?user_id=1]", last_request.query_string
39
39
  end
40
40
 
41
- def test_setting_query_params_on_put
41
+ test "setting query params on put requests" do
42
42
  get '/login'
43
43
  put '/testing/1', '{ "title": "hello!" }'
44
44
  assert_equal "[?user_id=1]", last_request.query_string
45
45
  end
46
46
 
47
- def test_setting_query_params_on_delete
47
+ test "setting query params on delete requests" do
48
48
  get '/login'
49
49
  delete '/testing'
50
50
  assert_equal "[?user_id=1]", last_request.query_string
51
51
  end
52
52
 
53
- def test_appending_query_param_to_document
53
+ test "setting query params on get requests" do
54
+ @test_methods = [:get]
55
+ get '/login'
56
+ get '/testing'
57
+ assert_equal "[?user_id=1]", last_request.query_string
58
+ end
59
+
60
+ test "not adding methods when the request method is not filterable" do
61
+ @test_methods = [:post]
62
+ get '/login'
63
+ get '/testing'
64
+ assert_not_equal "[?user_id=1]", last_request.query_string
65
+ end
66
+
67
+ test "appending query params to a document" do
54
68
  get '/login'
55
69
  post '/testing', '{ "title": "hello!" }'
56
70
  assert_match /"user_id":1/, last_response.body
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rackjson
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Oliver Nightingale
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2010-04-26 00:00:00 +01:00
12
+ date: 2010-04-29 00:00:00 +01:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -71,6 +71,7 @@ files:
71
71
  - lib/rackjson.rb
72
72
  - lib/rackjson/collection.rb
73
73
  - lib/rackjson/document.rb
74
+ - lib/rackjson/end_point.rb
74
75
  - lib/rackjson/filter.rb
75
76
  - lib/rackjson/json_document.rb
76
77
  - lib/rackjson/json_query.rb