rackjson 0.2.0 → 0.2.1

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.
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