couchmodel 0.1.1 → 0.1.2

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.
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 1
8
- - 1
9
- version: 0.1.1
8
+ - 2
9
+ version: 0.1.2
10
10
  platform: ruby
11
11
  authors:
12
12
  - Philipp Bruell
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-05-05 00:00:00 +02:00
17
+ date: 2010-06-12 00:00:00 +02:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -25,8 +25,10 @@ dependencies:
25
25
  - - ">="
26
26
  - !ruby/object:Gem::Version
27
27
  segments:
28
+ - 1
29
+ - 3
28
30
  - 0
29
- version: "0"
31
+ version: 1.3.0
30
32
  type: :development
31
33
  version_requirements: *id001
32
34
  description: CouchModel provides an interface to easly handle CouchDB documents. It also comes with a ActiveModel implementation to integrate into an Rails 3 application.
@@ -52,22 +54,24 @@ files:
52
54
  - lib/couch_model/collection.rb
53
55
  - lib/couch_model/server.rb
54
56
  - lib/couch_model/design.rb
55
- - lib/couch_model/transport.rb
56
57
  - lib/couch_model/base.rb
57
58
  - lib/couch_model/database.rb
58
59
  - lib/couch_model.rb
59
60
  - lib/core_extension/string.rb
60
61
  - lib/core_extension/array.rb
62
+ - lib/transport/request/builder.rb
63
+ - lib/transport/request/parameter/serializer.rb
64
+ - lib/transport/json.rb
65
+ - lib/transport/base.rb
61
66
  - lib/code_smells.reek
62
67
  - spec/spec_helper.rb
63
68
  - spec/lib/couch_model/view_spec.rb
64
69
  - spec/lib/couch_model/server_spec.rb
65
- - spec/lib/couch_model/core/association_spec.rb
66
- - spec/lib/couch_model/core/finder_spec.rb
67
- - spec/lib/couch_model/core/accessor_spec.rb
68
- - spec/lib/couch_model/core/setup_spec.rb
69
70
  - spec/lib/couch_model/design_spec.rb
70
- - spec/lib/couch_model/transport_spec.rb
71
+ - spec/lib/couch_model/base/association_spec.rb
72
+ - spec/lib/couch_model/base/finder_spec.rb
73
+ - spec/lib/couch_model/base/accessor_spec.rb
74
+ - spec/lib/couch_model/base/setup_spec.rb
71
75
  - spec/lib/couch_model/active_model_spec.rb
72
76
  - spec/lib/couch_model/collection_spec.rb
73
77
  - spec/lib/couch_model/design/association_test_model_one.design
@@ -80,6 +84,10 @@ files:
80
84
  - spec/lib/couch_model_spec.rb
81
85
  - spec/lib/core_extension/string_spec.rb
82
86
  - spec/lib/core_extension/array_spec.rb
87
+ - spec/lib/transport/request/builder_spec.rb
88
+ - spec/lib/transport/request/parameter/serializer_spec.rb
89
+ - spec/lib/transport/json_spec.rb
90
+ - spec/lib/transport/base_spec.rb
83
91
  - spec/fake_transport_helper.rb
84
92
  - spec/integration/views_spec.rb
85
93
  - spec/integration/associations_spec.rb
@@ -122,12 +130,11 @@ summary: CouchModel provides an interface to easly handle CouchDB documents.
122
130
  test_files:
123
131
  - spec/lib/couch_model/view_spec.rb
124
132
  - spec/lib/couch_model/server_spec.rb
125
- - spec/lib/couch_model/core/association_spec.rb
126
- - spec/lib/couch_model/core/finder_spec.rb
127
- - spec/lib/couch_model/core/accessor_spec.rb
128
- - spec/lib/couch_model/core/setup_spec.rb
129
133
  - spec/lib/couch_model/design_spec.rb
130
- - spec/lib/couch_model/transport_spec.rb
134
+ - spec/lib/couch_model/base/association_spec.rb
135
+ - spec/lib/couch_model/base/finder_spec.rb
136
+ - spec/lib/couch_model/base/accessor_spec.rb
137
+ - spec/lib/couch_model/base/setup_spec.rb
131
138
  - spec/lib/couch_model/active_model_spec.rb
132
139
  - spec/lib/couch_model/collection_spec.rb
133
140
  - spec/lib/couch_model/configuration_spec.rb
@@ -137,6 +144,10 @@ test_files:
137
144
  - spec/lib/couch_model_spec.rb
138
145
  - spec/lib/core_extension/string_spec.rb
139
146
  - spec/lib/core_extension/array_spec.rb
147
+ - spec/lib/transport/request/builder_spec.rb
148
+ - spec/lib/transport/request/parameter/serializer_spec.rb
149
+ - spec/lib/transport/json_spec.rb
150
+ - spec/lib/transport/base_spec.rb
140
151
  - spec/integration/views_spec.rb
141
152
  - spec/integration/associations_spec.rb
142
153
  - spec/integration/saved_model_spec.rb
@@ -1,178 +0,0 @@
1
- require 'uri'
2
- require 'cgi'
3
- require 'net/http'
4
- require 'json'
5
-
6
- module CouchModel
7
-
8
- # Common transport layer for http transfers.
9
- class Transport
10
-
11
- attr_reader :http_method
12
- attr_reader :url
13
- attr_reader :options
14
- attr_reader :headers
15
- attr_reader :parameters
16
- attr_reader :body
17
- attr_reader :response
18
-
19
- def initialize(http_method, url, options = { })
20
- @http_method = http_method
21
- @uri = URI.parse url
22
- @headers = options[:headers] || { }
23
- @parameters = options[:parameters] || { }
24
- @body = options[:body]
25
- end
26
-
27
- def perform
28
- initialize_request_class
29
- initialize_request_path
30
- initialize_request
31
- initialize_request_body
32
- perform_request
33
- end
34
-
35
- private
36
-
37
- def initialize_request_class
38
- request_class_name = @http_method.to_s.capitalize
39
- raise NotImplementedError, "the request method #{http_method} is not implemented" unless Net::HTTP.const_defined?(request_class_name)
40
- @request_class = Net::HTTP.const_get request_class_name
41
- end
42
-
43
- def initialize_request_path
44
- serialize_parameters
45
- @request_path = @uri.path + @serialized_parameters
46
- end
47
-
48
- def serialize_parameters
49
- quote_parameters
50
- @serialized_parameters = if @parameters.nil? || @parameters.empty?
51
- ""
52
- else
53
- "?" + @quoted_parameters.collect do |key, value|
54
- value.is_a?(Array) ?
55
- value.map{ |element| "#{key}=#{element}" }.join("&") :
56
- "#{key}=#{value}"
57
- end.join("&")
58
- end
59
- end
60
-
61
- def quote_parameters
62
- @quoted_parameters = { }
63
- @parameters.each do |key, value|
64
- encoded_key = CGI.escape(key.to_s)
65
- @quoted_parameters[encoded_key] = value.is_a?(Array) ? value.map{ |element| CGI.escape element } : CGI.escape(value)
66
- end
67
- end
68
-
69
- def initialize_request
70
- @request = @request_class.new @request_path, @headers
71
- end
72
-
73
- def initialize_request_body
74
- return unless [ :post, :put ].include?(@http_method.to_sym)
75
- @request.body = @body ? @body : @serialized_parameters.sub(/^\?/, "")
76
- end
77
-
78
- def perform_request
79
- @response = Net::HTTP.start(@uri.host, @uri.port) do |connection|
80
- connection.request @request
81
- end
82
- end
83
-
84
- def self.request(http_method, url, options = { })
85
- transport = new http_method, url, options
86
- transport.perform
87
- transport.response
88
- end
89
-
90
- end
91
-
92
- # Extended transport layer for http transfers. Basic authorization and JSON transfers are supported.
93
- class ExtendedTransport < Transport
94
-
95
- # The UnexpectedStatusCodeError is raised if the :expected_status_code option is given to
96
- # the :request method and the responded status code is different from the expected one.
97
- class UnexpectedStatusCodeError < StandardError
98
-
99
- attr_reader :status_code
100
- attr_reader :message
101
-
102
- def initialize(status_code, message = nil)
103
- @status_code, @message = status_code, message
104
- end
105
-
106
- def to_s
107
- "#{super} received status code #{self.status_code}" + (@message ? " [#{@message}]" : "")
108
- end
109
-
110
- end
111
-
112
- attr_reader :expected_status_code
113
- attr_reader :auth_type
114
- attr_reader :username
115
- attr_reader :password
116
-
117
- def initialize(http_method, url, options = { })
118
- super http_method, url, options
119
- @expected_status_code = options[:expected_status_code]
120
- @auth_type = options[:auth_type]
121
- @username = options[:username]
122
- @password = options[:password]
123
- end
124
-
125
- def perform
126
- initialize_headers
127
- super
128
- check_status_code
129
- parse_response
130
- end
131
-
132
- private
133
-
134
- def initialize_headers
135
- @headers["Accept"] = "application/json"
136
- end
137
-
138
- def initialize_request
139
- super
140
- if @auth_type == :basic
141
- @request.basic_auth @username, @password
142
- elsif @auth_type
143
- raise NotImplementedError, "the given auth_type [#{@auth_type}] is not implemented"
144
- end
145
- end
146
-
147
- def quote_parameters
148
- @parameters.each do |key, value|
149
- @parameters[key] = value.to_json if value.respond_to?(:to_json)
150
- end
151
- super
152
- end
153
-
154
- def initialize_request_body
155
- super
156
- if @body
157
- @request.body = @body.to_json
158
- @request["Content-Type"] = "application/json"
159
- end
160
- end
161
-
162
- def check_status_code
163
- return unless @expected_status_code
164
- response_code = @response.code
165
- response_body = @response.body
166
- raise UnexpectedStatusCodeError.new(response_code.to_i, response_body) if @expected_status_code.to_s != response_code
167
- end
168
-
169
- def parse_response
170
- body = @response.body
171
- @response = body.nil? ? nil : JSON.parse(body)
172
- rescue JSON::ParserError
173
- @response = body.to_s
174
- end
175
-
176
- end
177
-
178
- end
@@ -1,114 +0,0 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "spec_helper"))
2
- require File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "..", "lib", "couch_model", "transport"))
3
-
4
- describe CouchModel::Transport do
5
-
6
- use_real_transport!
7
-
8
- describe "request" do
9
-
10
- before :each do
11
- @http_method = :get
12
- @url = "http://localhost:5984/"
13
- @options = { }
14
-
15
- @request = Net::HTTP::Get.new "/", { }
16
- @response = Object.new
17
- @response.stub!(:code).and_return("200")
18
- @response.stub!(:body).and_return("test")
19
- Net::HTTP.stub!(:start).and_return(@response)
20
- end
21
-
22
- def do_request(options = { })
23
- CouchModel::Transport.request @http_method, @url, @options.merge(options)
24
- end
25
-
26
- it "should initialize the correct request object" do
27
- Net::HTTP::Get.should_receive(:new).with("/", { }).and_return(@request)
28
- do_request
29
- end
30
-
31
- it "should perform the request" do
32
- Net::HTTP.should_receive(:start).and_return(@response)
33
- do_request
34
- end
35
-
36
- it "should return the response" do
37
- do_request.body.should == "test"
38
- end
39
-
40
- context "with parameters" do
41
-
42
- before :each do
43
- @options.merge! :parameters => { :foo => "bar", :test => [ "value1", "value2" ] }
44
- end
45
-
46
- it "should initialize the correct request object" do
47
- Net::HTTP::Get.should_receive(:new).with(
48
- "/?foo=bar&test=value1&test=value2", { }
49
- ).and_return(@request)
50
- do_request
51
- end
52
-
53
- end
54
-
55
- end
56
-
57
- end
58
-
59
- describe CouchModel::ExtendedTransport do
60
-
61
- use_real_transport!
62
-
63
- describe "request" do
64
-
65
- before :each do
66
- @http_method = :get
67
- @url = "http://localhost:5984/"
68
- @options = {
69
- :auth_type => :basic,
70
- :username => "test",
71
- :password => "test",
72
- :expected_status_code => 200
73
- }
74
-
75
- @request = Net::HTTP::Get.new "/", { }
76
- @response = Object.new
77
- @response.stub!(:code).and_return("200")
78
- @response.stub!(:body).and_return("{\"test\":\"test\"}")
79
- Net::HTTP.stub!(:start).and_return(@response)
80
- end
81
-
82
- def do_request(options = { })
83
- CouchModel::ExtendedTransport.request @http_method, @url, @options.merge(options)
84
- end
85
-
86
- it "should initialize the correct request object" do
87
- Net::HTTP::Get.should_receive(:new).with("/", { "Accept" => "application/json" }).and_return(@request)
88
- do_request
89
- end
90
-
91
- it "should perform the request" do
92
- Net::HTTP.should_receive(:start).and_return(@response)
93
- do_request
94
- end
95
-
96
- it "should return the parsed response" do
97
- do_request.should == { "test" => "test" }
98
- end
99
-
100
- it "should raise NotImplementedError if the given auth_type is wrong" do
101
- lambda do
102
- do_request :auth_type => :invalid
103
- end.should raise_error(NotImplementedError)
104
- end
105
-
106
- it "should raise UnexpectedStatusCodeError if responded status code is wrong" do
107
- lambda do
108
- do_request :expected_status_code => 201
109
- end.should raise_error(CouchModel::ExtendedTransport::UnexpectedStatusCodeError)
110
- end
111
-
112
- end
113
-
114
- end