logical_model 0.2.9 → 0.2.10
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +2 -1
- data/Gemfile.lock +78 -83
- data/README.rdoc +51 -8
- data/Rakefile +1 -1
- data/VERSION +1 -1
- data/client.rb +4 -48
- data/lib/logical_model.rb +92 -11
- data/logical_model.gemspec +8 -7
- data/service.rb +9 -5
- data/spec/client_spec.rb +27 -78
- data/spec/service_spec.rb +16 -1
- metadata +45 -36
- data/db/test.sqlite3 +0 -0
- data/logs/development.log +0 -144
data/Gemfile
CHANGED
@@ -4,9 +4,10 @@ source "http://rubygems.org"
|
|
4
4
|
gem "activemodel"
|
5
5
|
gem "activesupport"
|
6
6
|
gem "typhoeus", "~> 0.2.4"
|
7
|
-
gem "kaminari"
|
7
|
+
gem "kaminari", '~> 0.13.0'
|
8
8
|
|
9
9
|
group :development, :test do
|
10
|
+
gem 'activerecord'
|
10
11
|
gem "shoulda"
|
11
12
|
gem "bundler", "~> 1.0.10"
|
12
13
|
gem "jeweler", "~> 1.6.4"
|
data/Gemfile.lock
CHANGED
@@ -1,123 +1,118 @@
|
|
1
1
|
GEM
|
2
2
|
remote: http://rubygems.org/
|
3
3
|
specs:
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
activemodel (= 3.0.7)
|
29
|
-
activesupport (= 3.0.7)
|
30
|
-
activesupport (3.0.7)
|
31
|
-
arel (2.0.10)
|
32
|
-
builder (2.1.2)
|
4
|
+
actionpack (3.1.3)
|
5
|
+
activemodel (= 3.1.3)
|
6
|
+
activesupport (= 3.1.3)
|
7
|
+
builder (~> 3.0.0)
|
8
|
+
erubis (~> 2.7.0)
|
9
|
+
i18n (~> 0.6)
|
10
|
+
rack (~> 1.3.5)
|
11
|
+
rack-cache (~> 1.1)
|
12
|
+
rack-mount (~> 0.8.2)
|
13
|
+
rack-test (~> 0.6.1)
|
14
|
+
sprockets (~> 2.0.3)
|
15
|
+
activemodel (3.1.3)
|
16
|
+
activesupport (= 3.1.3)
|
17
|
+
builder (~> 3.0.0)
|
18
|
+
i18n (~> 0.6)
|
19
|
+
activerecord (3.1.3)
|
20
|
+
activemodel (= 3.1.3)
|
21
|
+
activesupport (= 3.1.3)
|
22
|
+
arel (~> 2.2.1)
|
23
|
+
tzinfo (~> 0.3.29)
|
24
|
+
activesupport (3.1.3)
|
25
|
+
multi_json (~> 1.0)
|
26
|
+
arel (2.2.1)
|
27
|
+
builder (3.0.0)
|
33
28
|
diff-lcs (1.1.3)
|
34
|
-
erubis (2.
|
35
|
-
|
36
|
-
ffi (1.0.9)
|
29
|
+
erubis (2.7.0)
|
30
|
+
ffi (1.0.11)
|
37
31
|
git (1.2.5)
|
38
|
-
guard (0.
|
32
|
+
guard (0.10.0)
|
33
|
+
ffi (>= 0.5.0)
|
39
34
|
thor (~> 0.14.6)
|
40
|
-
guard-rspec (0.
|
41
|
-
guard (>= 0.
|
42
|
-
|
35
|
+
guard-rspec (0.6.0)
|
36
|
+
guard (>= 0.10.0)
|
37
|
+
hike (1.2.1)
|
38
|
+
i18n (0.6.0)
|
43
39
|
jeweler (1.6.4)
|
44
40
|
bundler (~> 1.0)
|
45
41
|
git (>= 1.2.5)
|
46
42
|
rake
|
47
|
-
json (1.
|
48
|
-
kaminari (0.
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
rack (
|
59
|
-
rack-mount (0.6.14)
|
43
|
+
json (1.6.4)
|
44
|
+
kaminari (0.13.0)
|
45
|
+
actionpack (>= 3.0.0)
|
46
|
+
activesupport (>= 3.0.0)
|
47
|
+
railties (>= 3.0.0)
|
48
|
+
libnotify (0.7.1)
|
49
|
+
mime-types (1.17.2)
|
50
|
+
multi_json (1.0.4)
|
51
|
+
rack (1.3.6)
|
52
|
+
rack-cache (1.1)
|
53
|
+
rack (>= 0.4)
|
54
|
+
rack-mount (0.8.3)
|
60
55
|
rack (>= 1.0.0)
|
61
|
-
rack-
|
56
|
+
rack-ssl (1.3.2)
|
57
|
+
rack
|
58
|
+
rack-test (0.6.1)
|
62
59
|
rack (>= 1.0)
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
activeresource (= 3.0.7)
|
68
|
-
activesupport (= 3.0.7)
|
69
|
-
bundler (~> 1.0)
|
70
|
-
railties (= 3.0.7)
|
71
|
-
railties (3.0.7)
|
72
|
-
actionpack (= 3.0.7)
|
73
|
-
activesupport (= 3.0.7)
|
60
|
+
railties (3.1.3)
|
61
|
+
actionpack (= 3.1.3)
|
62
|
+
activesupport (= 3.1.3)
|
63
|
+
rack-ssl (~> 1.3.2)
|
74
64
|
rake (>= 0.8.7)
|
75
|
-
|
76
|
-
|
65
|
+
rdoc (~> 3.4)
|
66
|
+
thor (~> 0.14.6)
|
67
|
+
rake (0.9.2.2)
|
77
68
|
rb-inotify (0.8.8)
|
78
69
|
ffi (>= 0.5.0)
|
79
|
-
rcov (0.9.
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
rspec-
|
84
|
-
|
85
|
-
|
70
|
+
rcov (0.9.11)
|
71
|
+
rdoc (3.12)
|
72
|
+
json (~> 1.4)
|
73
|
+
rspec (2.8.0)
|
74
|
+
rspec-core (~> 2.8.0)
|
75
|
+
rspec-expectations (~> 2.8.0)
|
76
|
+
rspec-mocks (~> 2.8.0)
|
77
|
+
rspec-core (2.8.0)
|
78
|
+
rspec-expectations (2.8.0)
|
86
79
|
diff-lcs (~> 1.1.2)
|
87
|
-
rspec-mocks (2.
|
88
|
-
rspec-rails (2.
|
89
|
-
actionpack (
|
90
|
-
activesupport (
|
91
|
-
railties (
|
92
|
-
rspec (~> 2.
|
80
|
+
rspec-mocks (2.8.0)
|
81
|
+
rspec-rails (2.8.1)
|
82
|
+
actionpack (>= 3.0)
|
83
|
+
activesupport (>= 3.0)
|
84
|
+
railties (>= 3.0)
|
85
|
+
rspec (~> 2.8.0)
|
93
86
|
shoulda (2.11.3)
|
94
|
-
sinatra (1.2.
|
87
|
+
sinatra (1.2.8)
|
95
88
|
rack (~> 1.1)
|
96
89
|
tilt (>= 1.2.2, < 2.0)
|
97
|
-
|
90
|
+
sprockets (2.0.3)
|
91
|
+
hike (~> 1.2)
|
92
|
+
rack (~> 1.0)
|
93
|
+
tilt (~> 1.1, != 1.3.0)
|
94
|
+
sqlite3 (1.3.5)
|
98
95
|
sqlite3-ruby (1.3.3)
|
99
96
|
sqlite3 (>= 1.3.3)
|
100
97
|
thor (0.14.6)
|
101
98
|
tilt (1.3.3)
|
102
|
-
treetop (1.4.10)
|
103
|
-
polyglot
|
104
|
-
polyglot (>= 0.3.1)
|
105
99
|
typhoeus (0.2.4)
|
106
100
|
mime-types
|
107
101
|
mime-types
|
108
|
-
tzinfo (0.3.
|
102
|
+
tzinfo (0.3.31)
|
109
103
|
|
110
104
|
PLATFORMS
|
111
105
|
ruby
|
112
106
|
|
113
107
|
DEPENDENCIES
|
114
108
|
activemodel
|
109
|
+
activerecord
|
115
110
|
activesupport
|
116
111
|
bundler (~> 1.0.10)
|
117
112
|
guard-rspec
|
118
113
|
jeweler (~> 1.6.4)
|
119
114
|
json
|
120
|
-
kaminari
|
115
|
+
kaminari (~> 0.13.0)
|
121
116
|
libnotify
|
122
117
|
rb-inotify
|
123
118
|
rcov
|
data/README.rdoc
CHANGED
@@ -8,18 +8,62 @@ It was written following this tutorial: http://www.slideshare.net/ihower/service
|
|
8
8
|
|
9
9
|
LogicalModel makes some assumptions about the service you'll be consuming
|
10
10
|
|
11
|
-
|
11
|
+
* resource service is RESTfull
|
12
|
+
* INDEX response is
|
13
|
+
{
|
14
|
+
collection: [resources...],
|
15
|
+
total: total items
|
16
|
+
}
|
12
17
|
|
13
|
-
*
|
14
|
-
|
15
|
-
|
16
|
-
|
18
|
+
* SHOW response is
|
19
|
+
{
|
20
|
+
.... resource attributes ...
|
21
|
+
}
|
22
|
+
|
23
|
+
* CREATE response on success is
|
24
|
+
{
|
25
|
+
id: created_id
|
26
|
+
}
|
27
|
+
|
28
|
+
* CREATE response on failure is
|
29
|
+
{
|
30
|
+
message: 'error message',
|
31
|
+
error_codes: [],
|
32
|
+
errors: attribute_errors
|
33
|
+
}
|
34
|
+
|
35
|
+
* UPDATE response on success is
|
36
|
+
"OK"
|
37
|
+
|
38
|
+
* UPDATE response on failure is
|
39
|
+
{
|
40
|
+
message: 'error message',
|
41
|
+
error_codes: [],
|
42
|
+
errors: attribute_errors
|
43
|
+
}
|
44
|
+
|
45
|
+
* DESTROY response is
|
46
|
+
"ok"
|
17
47
|
|
18
48
|
== Usage
|
19
49
|
|
20
50
|
In your Gemfile:
|
21
51
|
|
22
|
-
gem "logical_model"
|
52
|
+
gem "logical_model"
|
53
|
+
|
54
|
+
== Testing
|
55
|
+
|
56
|
+
For runnings specs you must have the service running locally. Do like this:
|
57
|
+
|
58
|
+
ruby service.rb -p 3000 -e test
|
59
|
+
|
60
|
+
Also note that after a single run of the tests the server must be restarted to reset
|
61
|
+
the database. We could change this by deleting all users in the test setup.
|
62
|
+
|
63
|
+
To run spec:
|
64
|
+
|
65
|
+
bundle exec rspec spec/client_spec.rb
|
66
|
+
|
23
67
|
|
24
68
|
== Contributing to logical_model
|
25
69
|
|
@@ -33,11 +77,10 @@ gem "logical_model"
|
|
33
77
|
|
34
78
|
== Copyright
|
35
79
|
|
36
|
-
Copyright (c) 2011 Dwayne Macgowan. See LICENSE.txt for
|
80
|
+
Copyright (c) 2011,2012 Dwayne Macgowan. See LICENSE.txt for
|
37
81
|
further details.
|
38
82
|
|
39
83
|
=== TODO
|
40
84
|
|
41
|
-
* specs!
|
42
85
|
* put log in /log
|
43
86
|
* on create parse response and show errors, etc.
|
data/Rakefile
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.2.
|
1
|
+
0.2.10
|
data/client.rb
CHANGED
@@ -2,16 +2,16 @@ require 'rubygems'
|
|
2
2
|
require 'bundler/setup'
|
3
3
|
require 'typhoeus'
|
4
4
|
require 'json'
|
5
|
-
require 'lib/logical_model'
|
5
|
+
require './lib/logical_model'
|
6
6
|
|
7
7
|
class User < LogicalModel
|
8
8
|
#class << self; attr_accessor :base_uri end
|
9
9
|
|
10
|
-
|
10
|
+
self.hydra = Typhoeus::Hydra.new
|
11
11
|
self.use_ssl = false #(Rails.env=="production")
|
12
12
|
|
13
13
|
self.resource_path = "/api/v1/users"
|
14
|
-
self.attribute_keys = [:name, :email, :password, :bio]
|
14
|
+
self.attribute_keys = [:id, :name, :email, :password, :bio]
|
15
15
|
self.use_api_key = false
|
16
16
|
#self.api_key_name = "token"
|
17
17
|
#self.api_key = "8c330b5d70f86ebfa6497c901b299b79afc6d68c60df6df0bda0180d3777eb4a5528924ac96cf58a25e599b4110da3c4b690fa29263714ec6604b6cb2d943656"
|
@@ -21,48 +21,4 @@ class User < LogicalModel
|
|
21
21
|
TIMEOUT = 5500 # miliseconds
|
22
22
|
PER_PAGE = 9999
|
23
23
|
|
24
|
-
|
25
|
-
# response = Typhoeus::Request.get("#{base_uri}/api/v1/users/#{name}")
|
26
|
-
# if response.code == 200
|
27
|
-
# JSON.parse(response.body)["user"]
|
28
|
-
# elsif response.code == 404
|
29
|
-
# nil
|
30
|
-
# else
|
31
|
-
# raise response.body
|
32
|
-
# end
|
33
|
-
# end
|
34
|
-
|
35
|
-
# def self.create(attributes = {})
|
36
|
-
# response = Typhoeus::Request.post("#{base_uri}/api/v1/users", :body => attributes.to_json)
|
37
|
-
# if response.success?
|
38
|
-
# JSON.parse(response.body)["user"]
|
39
|
-
# else
|
40
|
-
# raise response.body
|
41
|
-
# end
|
42
|
-
# end
|
43
|
-
|
44
|
-
# def self.update(name, attributes)
|
45
|
-
# response = Typhoeus::Request.put("#{base_uri}/api/v1/users/#{name}", :body => attributes.to_json)
|
46
|
-
# if response.success?
|
47
|
-
# JSON.parse(response.body)["user"]
|
48
|
-
# else
|
49
|
-
# raise response.body
|
50
|
-
# end
|
51
|
-
# end
|
52
|
-
|
53
|
-
# def self.destroy(name)
|
54
|
-
# response = Typhoeus::Request.delete("#{base_uri}/api/v1/users/#{name}")
|
55
|
-
# response.success?
|
56
|
-
# end
|
57
|
-
|
58
|
-
# def self.login(name, password)
|
59
|
-
# response = Typhoeus::Request.post("#{base_uri}/api/v1/users/#{name}/sessions", :body => {:password => password}.to_json)
|
60
|
-
# if response.success?
|
61
|
-
# JSON.parse(response.body)["user"]
|
62
|
-
# elsif response.code == 400
|
63
|
-
# nil
|
64
|
-
# else
|
65
|
-
# raise response.body
|
66
|
-
# end
|
67
|
-
# end
|
68
|
-
end
|
24
|
+
end
|
data/lib/logical_model.rb
CHANGED
@@ -69,6 +69,18 @@ class LogicalModel
|
|
69
69
|
def log_path; @log_path ||= "log/logical_model.log"; end
|
70
70
|
def use_api_key; @use_api_key ||= false; end
|
71
71
|
|
72
|
+
def validates_associated(*associations)
|
73
|
+
associations.each do |association|
|
74
|
+
validates_each association do |record, attr, value|
|
75
|
+
unless value.collect{ |r| r.nil? || r.valid? }.all?
|
76
|
+
value.reject { |t| t.valid? }.each do |t|
|
77
|
+
record.errors.add("", "#{t.class.name} #{t.errors.full_messages.to_sentence}")
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
72
84
|
# host eg: "127.0.0.1:3010"
|
73
85
|
# resource_path eg: "/api/v1/people"
|
74
86
|
end
|
@@ -77,17 +89,12 @@ class LogicalModel
|
|
77
89
|
@json_root ||= self.class.to_s.underscore
|
78
90
|
end
|
79
91
|
|
80
|
-
|
81
92
|
def self.resource_uri(id=nil)
|
82
93
|
prefix = (use_ssl)? "https://" : "http://"
|
83
94
|
sufix = (id.nil?)? "" : "/#{id}"
|
84
95
|
"#{prefix}#{host}#{resource_path}#{sufix}"
|
85
96
|
end
|
86
97
|
|
87
|
-
def persisted?
|
88
|
-
false
|
89
|
-
end
|
90
|
-
|
91
98
|
def initialize(attributes={})
|
92
99
|
self.attributes = attributes
|
93
100
|
end
|
@@ -95,6 +102,61 @@ class LogicalModel
|
|
95
102
|
def self.has_many_keys=(keys)
|
96
103
|
@has_many_keys = keys
|
97
104
|
attr_accessor *keys
|
105
|
+
|
106
|
+
keys.each do |association|
|
107
|
+
|
108
|
+
# return empty array or @association variable for each association
|
109
|
+
define_method association do
|
110
|
+
if instance_variable_get("@#{association}").blank?
|
111
|
+
instance_variable_set("@#{association}", [])
|
112
|
+
end
|
113
|
+
|
114
|
+
instance_variable_get("@#{association}")
|
115
|
+
end
|
116
|
+
|
117
|
+
# this method loads the contact attributes recieved by logical model from the service
|
118
|
+
define_method "#{association}=" do |params|
|
119
|
+
collection = []
|
120
|
+
params.each do |attr_params|
|
121
|
+
if attr_params["_type"].present?
|
122
|
+
attr_class = attr_params.delete("_type").to_s.constantize
|
123
|
+
else
|
124
|
+
attr_class = association.to_s.camelize.constantize
|
125
|
+
end
|
126
|
+
collection << attr_class.new(attr_params)
|
127
|
+
end
|
128
|
+
instance_variable_set("@#{association}", collection)
|
129
|
+
end
|
130
|
+
|
131
|
+
define_method "new_#{association.to_s.singularize}" do |attr_params|
|
132
|
+
if attr_params["_type"].present?
|
133
|
+
clazz = attr_params.delete(:_type).constantize
|
134
|
+
else
|
135
|
+
clazz = association.to_s.singularize.camelize.constantize
|
136
|
+
end
|
137
|
+
|
138
|
+
return unless clazz
|
139
|
+
|
140
|
+
temp_object = clazz.new(attr_params.merge({"#{self.json_root}_id" => self.id}))
|
141
|
+
eval(association.to_s) << temp_object
|
142
|
+
temp_object
|
143
|
+
end
|
144
|
+
|
145
|
+
# this method loads the contact attributes from the html form (using nested resources conventions)
|
146
|
+
define_method "#{association}_attributes=" do |key_attributes|
|
147
|
+
array = []
|
148
|
+
key_attributes.each do |attr_params|
|
149
|
+
attr_params.to_hash.symbolize_keys!
|
150
|
+
if attr_params["_type"].present?
|
151
|
+
attr_class = attr_params.delete("_type").to_s.constantize
|
152
|
+
else
|
153
|
+
attr_class = association.to_s.singularize.camelize.constantize
|
154
|
+
end
|
155
|
+
array << attr_class.new(attr_params)
|
156
|
+
end
|
157
|
+
instance_variable_set("@#{association}", array)
|
158
|
+
end
|
159
|
+
end
|
98
160
|
end
|
99
161
|
|
100
162
|
def self.has_many_keys
|
@@ -178,7 +240,7 @@ class LogicalModel
|
|
178
240
|
# This pagination won't block excecution waiting for result, pagination will be enqueued in Objectr#hydra.
|
179
241
|
#
|
180
242
|
# Parameters:
|
181
|
-
#
|
243
|
+
# @param options [Hash].
|
182
244
|
# Valid options are:
|
183
245
|
# * :page - indicated what page to return. Defaults to 1.
|
184
246
|
# * :per_page - indicates how many records to be returned per page. Defauls to 20
|
@@ -187,8 +249,8 @@ class LogicalModel
|
|
187
249
|
# Usage:
|
188
250
|
# Person.async_paginate(:page => params[:page]){|i| result = i}
|
189
251
|
def self.async_paginate(options={})
|
190
|
-
options[:page]
|
191
|
-
options[:per_page]
|
252
|
+
page = options[:page] || 1
|
253
|
+
per_page = options[:per_page] || 20
|
192
254
|
|
193
255
|
options = self.merge_key(options)
|
194
256
|
|
@@ -200,7 +262,14 @@ class LogicalModel
|
|
200
262
|
result_set = self.from_json(response.body)
|
201
263
|
|
202
264
|
# this paginate is will_paginate's Array pagination
|
203
|
-
collection = Kaminari.paginate_array(
|
265
|
+
collection = Kaminari.paginate_array(
|
266
|
+
result_set[:collection],
|
267
|
+
{
|
268
|
+
:total_count=>result_set[:total],
|
269
|
+
:limit => per_page,
|
270
|
+
:offset => per_page * ([page, 1].max - 1)
|
271
|
+
}
|
272
|
+
)
|
204
273
|
|
205
274
|
yield collection
|
206
275
|
else
|
@@ -303,7 +372,7 @@ class LogicalModel
|
|
303
372
|
end
|
304
373
|
|
305
374
|
# Updates Objects attributes, this will only send attributes passed as arguments
|
306
|
-
#
|
375
|
+
#
|
307
376
|
#
|
308
377
|
# Returns false if Object#valid? is false.
|
309
378
|
# Returns updated object if successfull.
|
@@ -348,7 +417,7 @@ class LogicalModel
|
|
348
417
|
end
|
349
418
|
|
350
419
|
# Saves Objects attributes
|
351
|
-
#
|
420
|
+
#
|
352
421
|
#
|
353
422
|
# Returns false if Object#valid? is false.
|
354
423
|
# Returns updated object if successfull.
|
@@ -422,4 +491,16 @@ class LogicalModel
|
|
422
491
|
self.class.delete(self.id,params)
|
423
492
|
end
|
424
493
|
|
494
|
+
def persisted?
|
495
|
+
false
|
496
|
+
end
|
497
|
+
|
498
|
+
# Returns true if a record has not been persisted yet.
|
499
|
+
#
|
500
|
+
# Usage:
|
501
|
+
# @person.new_record?
|
502
|
+
def new_record?
|
503
|
+
!self.persisted?
|
504
|
+
end
|
505
|
+
|
425
506
|
end
|
data/logical_model.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "logical_model"
|
8
|
-
s.version = "0.2.
|
8
|
+
s.version = "0.2.10"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Dwayne Macgowan"]
|
12
|
-
s.date = "
|
12
|
+
s.date = "2012-01-09"
|
13
13
|
s.description = "LogicalModel allows to use a resource as a model. It is based on web presentation http://www.slideshare.net/ihower/serviceoriented-design-and-implement-with-rails3"
|
14
14
|
s.email = "dwaynemac@gmail.com"
|
15
15
|
s.extra_rdoc_files = [
|
@@ -31,10 +31,8 @@ Gem::Specification.new do |s|
|
|
31
31
|
"config/database.yml",
|
32
32
|
"db/development.sqlite3",
|
33
33
|
"db/migrate/001_create_users.rb",
|
34
|
-
"db/test.sqlite3",
|
35
34
|
"lib/logical_model.rb",
|
36
35
|
"logical_model.gemspec",
|
37
|
-
"logs/development.log",
|
38
36
|
"models/user.rb",
|
39
37
|
"service.rb",
|
40
38
|
"spec/client_spec.rb",
|
@@ -56,7 +54,8 @@ Gem::Specification.new do |s|
|
|
56
54
|
s.add_runtime_dependency(%q<activemodel>, [">= 0"])
|
57
55
|
s.add_runtime_dependency(%q<activesupport>, [">= 0"])
|
58
56
|
s.add_runtime_dependency(%q<typhoeus>, ["~> 0.2.4"])
|
59
|
-
s.add_runtime_dependency(%q<kaminari>, ["
|
57
|
+
s.add_runtime_dependency(%q<kaminari>, ["~> 0.13.0"])
|
58
|
+
s.add_development_dependency(%q<activerecord>, [">= 0"])
|
60
59
|
s.add_development_dependency(%q<shoulda>, [">= 0"])
|
61
60
|
s.add_development_dependency(%q<bundler>, ["~> 1.0.10"])
|
62
61
|
s.add_development_dependency(%q<jeweler>, ["~> 1.6.4"])
|
@@ -72,7 +71,8 @@ Gem::Specification.new do |s|
|
|
72
71
|
s.add_dependency(%q<activemodel>, [">= 0"])
|
73
72
|
s.add_dependency(%q<activesupport>, [">= 0"])
|
74
73
|
s.add_dependency(%q<typhoeus>, ["~> 0.2.4"])
|
75
|
-
s.add_dependency(%q<kaminari>, ["
|
74
|
+
s.add_dependency(%q<kaminari>, ["~> 0.13.0"])
|
75
|
+
s.add_dependency(%q<activerecord>, [">= 0"])
|
76
76
|
s.add_dependency(%q<shoulda>, [">= 0"])
|
77
77
|
s.add_dependency(%q<bundler>, ["~> 1.0.10"])
|
78
78
|
s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
|
@@ -89,7 +89,8 @@ Gem::Specification.new do |s|
|
|
89
89
|
s.add_dependency(%q<activemodel>, [">= 0"])
|
90
90
|
s.add_dependency(%q<activesupport>, [">= 0"])
|
91
91
|
s.add_dependency(%q<typhoeus>, ["~> 0.2.4"])
|
92
|
-
s.add_dependency(%q<kaminari>, ["
|
92
|
+
s.add_dependency(%q<kaminari>, ["~> 0.13.0"])
|
93
|
+
s.add_dependency(%q<activerecord>, [">= 0"])
|
93
94
|
s.add_dependency(%q<shoulda>, [">= 0"])
|
94
95
|
s.add_dependency(%q<bundler>, ["~> 1.0.10"])
|
95
96
|
s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
|
data/service.rb
CHANGED
@@ -2,7 +2,7 @@ require 'rubygems'
|
|
2
2
|
require 'bundler/setup'
|
3
3
|
require 'active_record'
|
4
4
|
require 'sinatra'
|
5
|
-
require 'models/user'
|
5
|
+
require './models/user'
|
6
6
|
|
7
7
|
# setting up the environment
|
8
8
|
env_index = ARGV.index("-e")
|
@@ -17,12 +17,16 @@ if env == "test"
|
|
17
17
|
User.create(:name => "paul", :email => "paul@pauldix.net", :bio => "rubyist")
|
18
18
|
end
|
19
19
|
|
20
|
-
|
21
|
-
|
22
20
|
# Simple RESTfull Service
|
23
21
|
# for LogicalModel Testing
|
24
22
|
|
23
|
+
# index
|
24
|
+
# Responds { collection, total }
|
25
|
+
get 'api/v1/users' do
|
26
|
+
users = User.all
|
25
27
|
|
28
|
+
{ collection: users, total: users.count}.to_json
|
29
|
+
end
|
26
30
|
|
27
31
|
# HTTP entry points
|
28
32
|
# get a user by name
|
@@ -40,7 +44,7 @@ post '/api/v1/users' do
|
|
40
44
|
begin
|
41
45
|
user = User.new(params[:user])
|
42
46
|
if user.save
|
43
|
-
user.to_json
|
47
|
+
[201, {id: user.id}.to_json]
|
44
48
|
else
|
45
49
|
error 400, {:errors => user.errors}.to_json
|
46
50
|
end
|
@@ -76,4 +80,4 @@ delete '/api/v1/users/:name' do
|
|
76
80
|
else
|
77
81
|
error 404, {:error => "user not found"}.to_json
|
78
82
|
end
|
79
|
-
end
|
83
|
+
end
|
data/spec/client_spec.rb
CHANGED
@@ -5,33 +5,7 @@ require File.dirname(__FILE__) + '/../client'
|
|
5
5
|
|
6
6
|
# Also note that after a single run of the tests the server must be restarted to reset
|
7
7
|
# the database. We could change this by deleting all users in the test setup.
|
8
|
-
|
9
|
-
# TODO testing in these specs should be focus on LogicalModel behaviour.
|
10
8
|
describe "LogicalModel User client" do
|
11
|
-
before(:each) do
|
12
|
-
# User.destroy_all
|
13
|
-
# User.base_uri = "http://localhost:3000"
|
14
|
-
|
15
|
-
# @user = User.find_by_name(:name => "paul")
|
16
|
-
# User.delete(@user.id)
|
17
|
-
# User.destroy("trotter")
|
18
|
-
|
19
|
-
# @user = User.new({:name => "bryan",
|
20
|
-
# :email => "bryan@spamtown.usa",
|
21
|
-
# :password => "strongpass",
|
22
|
-
# :bio => "rubyist"})
|
23
|
-
# @user.create
|
24
|
-
# User.create(
|
25
|
-
# :name => "paul",
|
26
|
-
# :email => "paul@pauldix.net",
|
27
|
-
# :password => "strongpass",
|
28
|
-
# :bio => "rubyist")
|
29
|
-
# User.create(
|
30
|
-
# :name => "bryan",
|
31
|
-
# :email => "bryan@spamtown.usa",
|
32
|
-
# :password => "strongpass",
|
33
|
-
# :bio => "rubyist")
|
34
|
-
end
|
35
9
|
|
36
10
|
describe "#create" do
|
37
11
|
context "with valid attributes" do
|
@@ -55,27 +29,33 @@ describe "LogicalModel User client" do
|
|
55
29
|
end
|
56
30
|
end
|
57
31
|
|
58
|
-
|
59
|
-
|
60
|
-
#
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
#
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
32
|
+
describe "#paginate" do
|
33
|
+
before do
|
34
|
+
# --> Mock service
|
35
|
+
req = Typhoeus::Request.any_instance
|
36
|
+
response = mock(
|
37
|
+
code: 200,
|
38
|
+
body: {
|
39
|
+
collection: [{name:'a',email:'a@m'},
|
40
|
+
{name:'b',email:'b@m'},
|
41
|
+
{name:'c',email:'c@m'}],
|
42
|
+
total: 6
|
43
|
+
}.to_json,
|
44
|
+
request: mock(url:"mockedurl"),
|
45
|
+
time: 1234
|
46
|
+
)
|
47
|
+
req.stub(:on_complete).and_yield(response)
|
48
|
+
# <-- service mocked
|
49
|
+
|
50
|
+
@users = User.paginate(page:1, per_page:1)
|
51
|
+
end
|
52
|
+
it "should return a Kaminari::PaginatableArray" do
|
53
|
+
@users.should be_a(Kaminari::PaginatableArray)
|
54
|
+
end
|
55
|
+
it "should set total_count" do
|
56
|
+
@users.total_count.should == 6
|
57
|
+
end
|
58
|
+
end
|
79
59
|
|
80
60
|
describe "#https" do
|
81
61
|
context "when use_ssl is tue" do
|
@@ -96,35 +76,4 @@ describe "LogicalModel User client" do
|
|
96
76
|
end
|
97
77
|
end
|
98
78
|
end
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
# it "should create a user" do
|
103
|
-
# user = User.create({
|
104
|
-
# :name => "trotter",
|
105
|
-
# :email => "trotter@spamtown.usa",
|
106
|
-
# :password => "whatev"})
|
107
|
-
# User.find_by_name("trotter")["email"].should == "trotter@spamtown.usa"
|
108
|
-
# end
|
109
|
-
|
110
|
-
# it "should update a user" do
|
111
|
-
# user = User.update("paul", :bio => "rubyist and author")
|
112
|
-
# user["name"].should == "paul"
|
113
|
-
# user["bio"].should == "rubyist and author"
|
114
|
-
# User.find_by_name("paul")["bio"] == "rubyist and author"
|
115
|
-
# end
|
116
|
-
|
117
|
-
# it "should destroy a user" do
|
118
|
-
# User.destroy("bryan").should == true
|
119
|
-
# User.find_by_name("bryan").should be_nil
|
120
|
-
# end
|
121
|
-
|
122
|
-
# it "should verify login credentials" do
|
123
|
-
# user = User.login("paul", "strongpass")
|
124
|
-
# user["name"].should == "paul"
|
125
|
-
# end
|
126
|
-
|
127
|
-
# it "should return nil with invalid credentials" do
|
128
|
-
# User.login("paul", "wrongpassword").should be_nil
|
129
|
-
# end
|
130
79
|
end
|
data/spec/service_spec.rb
CHANGED
@@ -22,7 +22,22 @@ describe "v1 service: " do
|
|
22
22
|
before(:each) do
|
23
23
|
User.delete_all
|
24
24
|
end
|
25
|
-
|
25
|
+
|
26
|
+
describe "get /api/v1/users" do
|
27
|
+
before do
|
28
|
+
User.create(name: "dwayne", email: "dwaynemac@gmail.com", password: "asdf", bio: "test")
|
29
|
+
User.create(name: "2dwayne", email: "dw2aynemac@gmail.com", password: "a2sdf", bio: "te2st")
|
30
|
+
get '/api/v1/users'
|
31
|
+
end
|
32
|
+
it { should respond_with :success }
|
33
|
+
it "should send collection" do
|
34
|
+
ActiveSupport::JSON.decode(last_response.body)['collection'].should_not be_nil
|
35
|
+
end
|
36
|
+
it "should send total items number" do
|
37
|
+
AcriveSupport::JSON.decode(last_response.body)['total'].should == 2
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
26
41
|
describe "RESTfull GET (on /api/v1/users/:id)" do
|
27
42
|
context "for existing user" do
|
28
43
|
before(:each) do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: logical_model
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.10
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2012-01-09 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activemodel
|
16
|
-
requirement: &
|
16
|
+
requirement: &78627270 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *78627270
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: activesupport
|
27
|
-
requirement: &
|
27
|
+
requirement: &78626410 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *78626410
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: typhoeus
|
38
|
-
requirement: &
|
38
|
+
requirement: &78624510 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ~>
|
@@ -43,21 +43,32 @@ dependencies:
|
|
43
43
|
version: 0.2.4
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *78624510
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: kaminari
|
49
|
-
requirement: &
|
49
|
+
requirement: &78623980 !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ~>
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 0.13.0
|
55
|
+
type: :runtime
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: *78623980
|
58
|
+
- !ruby/object:Gem::Dependency
|
59
|
+
name: activerecord
|
60
|
+
requirement: &78623670 !ruby/object:Gem::Requirement
|
50
61
|
none: false
|
51
62
|
requirements:
|
52
63
|
- - ! '>='
|
53
64
|
- !ruby/object:Gem::Version
|
54
65
|
version: '0'
|
55
|
-
type: :
|
66
|
+
type: :development
|
56
67
|
prerelease: false
|
57
|
-
version_requirements: *
|
68
|
+
version_requirements: *78623670
|
58
69
|
- !ruby/object:Gem::Dependency
|
59
70
|
name: shoulda
|
60
|
-
requirement: &
|
71
|
+
requirement: &78623310 !ruby/object:Gem::Requirement
|
61
72
|
none: false
|
62
73
|
requirements:
|
63
74
|
- - ! '>='
|
@@ -65,10 +76,10 @@ dependencies:
|
|
65
76
|
version: '0'
|
66
77
|
type: :development
|
67
78
|
prerelease: false
|
68
|
-
version_requirements: *
|
79
|
+
version_requirements: *78623310
|
69
80
|
- !ruby/object:Gem::Dependency
|
70
81
|
name: bundler
|
71
|
-
requirement: &
|
82
|
+
requirement: &78622890 !ruby/object:Gem::Requirement
|
72
83
|
none: false
|
73
84
|
requirements:
|
74
85
|
- - ~>
|
@@ -76,10 +87,10 @@ dependencies:
|
|
76
87
|
version: 1.0.10
|
77
88
|
type: :development
|
78
89
|
prerelease: false
|
79
|
-
version_requirements: *
|
90
|
+
version_requirements: *78622890
|
80
91
|
- !ruby/object:Gem::Dependency
|
81
92
|
name: jeweler
|
82
|
-
requirement: &
|
93
|
+
requirement: &78622410 !ruby/object:Gem::Requirement
|
83
94
|
none: false
|
84
95
|
requirements:
|
85
96
|
- - ~>
|
@@ -87,10 +98,10 @@ dependencies:
|
|
87
98
|
version: 1.6.4
|
88
99
|
type: :development
|
89
100
|
prerelease: false
|
90
|
-
version_requirements: *
|
101
|
+
version_requirements: *78622410
|
91
102
|
- !ruby/object:Gem::Dependency
|
92
103
|
name: rcov
|
93
|
-
requirement: &
|
104
|
+
requirement: &78621770 !ruby/object:Gem::Requirement
|
94
105
|
none: false
|
95
106
|
requirements:
|
96
107
|
- - ! '>='
|
@@ -98,10 +109,10 @@ dependencies:
|
|
98
109
|
version: '0'
|
99
110
|
type: :development
|
100
111
|
prerelease: false
|
101
|
-
version_requirements: *
|
112
|
+
version_requirements: *78621770
|
102
113
|
- !ruby/object:Gem::Dependency
|
103
114
|
name: sqlite3-ruby
|
104
|
-
requirement: &
|
115
|
+
requirement: &78621440 !ruby/object:Gem::Requirement
|
105
116
|
none: false
|
106
117
|
requirements:
|
107
118
|
- - ! '>='
|
@@ -109,10 +120,10 @@ dependencies:
|
|
109
120
|
version: '0'
|
110
121
|
type: :development
|
111
122
|
prerelease: false
|
112
|
-
version_requirements: *
|
123
|
+
version_requirements: *78621440
|
113
124
|
- !ruby/object:Gem::Dependency
|
114
125
|
name: sinatra
|
115
|
-
requirement: &
|
126
|
+
requirement: &78621020 !ruby/object:Gem::Requirement
|
116
127
|
none: false
|
117
128
|
requirements:
|
118
129
|
- - ~>
|
@@ -120,10 +131,10 @@ dependencies:
|
|
120
131
|
version: 1.2.6
|
121
132
|
type: :development
|
122
133
|
prerelease: false
|
123
|
-
version_requirements: *
|
134
|
+
version_requirements: *78621020
|
124
135
|
- !ruby/object:Gem::Dependency
|
125
136
|
name: json
|
126
|
-
requirement: &
|
137
|
+
requirement: &78599190 !ruby/object:Gem::Requirement
|
127
138
|
none: false
|
128
139
|
requirements:
|
129
140
|
- - ! '>='
|
@@ -131,10 +142,10 @@ dependencies:
|
|
131
142
|
version: '0'
|
132
143
|
type: :development
|
133
144
|
prerelease: false
|
134
|
-
version_requirements: *
|
145
|
+
version_requirements: *78599190
|
135
146
|
- !ruby/object:Gem::Dependency
|
136
147
|
name: rspec-rails
|
137
|
-
requirement: &
|
148
|
+
requirement: &78598610 !ruby/object:Gem::Requirement
|
138
149
|
none: false
|
139
150
|
requirements:
|
140
151
|
- - ! '>='
|
@@ -142,10 +153,10 @@ dependencies:
|
|
142
153
|
version: '0'
|
143
154
|
type: :development
|
144
155
|
prerelease: false
|
145
|
-
version_requirements: *
|
156
|
+
version_requirements: *78598610
|
146
157
|
- !ruby/object:Gem::Dependency
|
147
158
|
name: guard-rspec
|
148
|
-
requirement: &
|
159
|
+
requirement: &78598040 !ruby/object:Gem::Requirement
|
149
160
|
none: false
|
150
161
|
requirements:
|
151
162
|
- - ! '>='
|
@@ -153,10 +164,10 @@ dependencies:
|
|
153
164
|
version: '0'
|
154
165
|
type: :development
|
155
166
|
prerelease: false
|
156
|
-
version_requirements: *
|
167
|
+
version_requirements: *78598040
|
157
168
|
- !ruby/object:Gem::Dependency
|
158
169
|
name: rb-inotify
|
159
|
-
requirement: &
|
170
|
+
requirement: &78597410 !ruby/object:Gem::Requirement
|
160
171
|
none: false
|
161
172
|
requirements:
|
162
173
|
- - ! '>='
|
@@ -164,10 +175,10 @@ dependencies:
|
|
164
175
|
version: '0'
|
165
176
|
type: :development
|
166
177
|
prerelease: false
|
167
|
-
version_requirements: *
|
178
|
+
version_requirements: *78597410
|
168
179
|
- !ruby/object:Gem::Dependency
|
169
180
|
name: libnotify
|
170
|
-
requirement: &
|
181
|
+
requirement: &78596950 !ruby/object:Gem::Requirement
|
171
182
|
none: false
|
172
183
|
requirements:
|
173
184
|
- - ! '>='
|
@@ -175,7 +186,7 @@ dependencies:
|
|
175
186
|
version: '0'
|
176
187
|
type: :development
|
177
188
|
prerelease: false
|
178
|
-
version_requirements: *
|
189
|
+
version_requirements: *78596950
|
179
190
|
description: LogicalModel allows to use a resource as a model. It is based on web
|
180
191
|
presentation http://www.slideshare.net/ihower/serviceoriented-design-and-implement-with-rails3
|
181
192
|
email: dwaynemac@gmail.com
|
@@ -199,10 +210,8 @@ files:
|
|
199
210
|
- config/database.yml
|
200
211
|
- db/development.sqlite3
|
201
212
|
- db/migrate/001_create_users.rb
|
202
|
-
- db/test.sqlite3
|
203
213
|
- lib/logical_model.rb
|
204
214
|
- logical_model.gemspec
|
205
|
-
- logs/development.log
|
206
215
|
- models/user.rb
|
207
216
|
- service.rb
|
208
217
|
- spec/client_spec.rb
|
@@ -225,7 +234,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
225
234
|
version: '0'
|
226
235
|
segments:
|
227
236
|
- 0
|
228
|
-
hash: -
|
237
|
+
hash: -162919699
|
229
238
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
230
239
|
none: false
|
231
240
|
requirements:
|
data/db/test.sqlite3
DELETED
Binary file
|
data/logs/development.log
DELETED
@@ -1,144 +0,0 @@
|
|
1
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.004691s FAILED:
|
2
|
-
LogicalModel Log RESPONSE: "745: unexpected token at 'user%5Bbio%5D=rubyist&user%5Bemail%5D=paul%40pauldix.net&user%5Bname%5D=paul&user%5Bpassword%5D=strongpass'"
|
3
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.00462s FAILED:
|
4
|
-
LogicalModel Log RESPONSE: "745: unexpected token at 'user%5Bbio%5D=rubyist&user%5Bemail%5D=paul%40pauldix.net&user%5Bname%5D=paul&user%5Bpassword%5D=strongpass'"
|
5
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.004597s FAILED:
|
6
|
-
LogicalModel Log RESPONSE: "745: unexpected token at 'user%5Bbio%5D=rubyist&user%5Bemail%5D=paul%40pauldix.net&user%5Bname%5D=paul&user%5Bpassword%5D=strongpass'"
|
7
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.00463s FAILED:
|
8
|
-
LogicalModel Log RESPONSE: "745: unexpected token at 'user%5Bbio%5D=rubyist&user%5Bemail%5D=paul%40pauldix.net&user%5Bname%5D=paul&user%5Bpassword%5D=strongpass'"
|
9
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.004576s FAILED:
|
10
|
-
LogicalModel Log RESPONSE: "745: unexpected token at 'user%5Bbio%5D=rubyist&user%5Bemail%5D=paul%40pauldix.net&user%5Bname%5D=paul&user%5Bpassword%5D=strongpass'"
|
11
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.00471s FAILED:
|
12
|
-
LogicalModel Log RESPONSE: "745: unexpected token at 'user%5Bbio%5D=rubyist&user%5Bemail%5D=paul%40pauldix.net&user%5Bname%5D=paul&user%5Bpassword%5D=strongpass'"
|
13
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.004598s FAILED:
|
14
|
-
LogicalModel Log RESPONSE: "745: unexpected token at 'user%5Bbio%5D=rubyist&user%5Bemail%5D=paul%40pauldix.net&user%5Bname%5D=paul&user%5Bpassword%5D=strongpass'"
|
15
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.021388s FAILED:
|
16
|
-
LogicalModel Log RESPONSE: "745: unexpected token at 'user%5Bbio%5D=rubyist&user%5Bemail%5D=paul%40pauldix.net&user%5Bname%5D=paul&user%5Bpassword%5D=strongpass'"
|
17
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.004659s FAILED:
|
18
|
-
LogicalModel Log RESPONSE: "745: unexpected token at 'user%5Bbio%5D=rubyist&user%5Bemail%5D=paul%40pauldix.net&user%5Bname%5D=paul&user%5Bpassword%5D=strongpass'"
|
19
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.005105s FAILED:
|
20
|
-
LogicalModel Log RESPONSE: "745: unexpected token at 'user%5Bbio%5D=rubyist&user%5Bemail%5D=paul%40pauldix.net&user%5Bname%5D=paul&user%5Bpassword%5D=strongpass'"
|
21
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.004775s FAILED:
|
22
|
-
LogicalModel Log RESPONSE: "745: unexpected token at 'user%5Bbio%5D=rubyist&user%5Bemail%5D=paul%40pauldix.net&user%5Bname%5D=paul&user%5Bpassword%5D=strongpass'"
|
23
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.145529s FAILED:
|
24
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
25
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.0216s FAILED:
|
26
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
27
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.018887s FAILED:
|
28
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
29
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.127662s FAILED:
|
30
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
31
|
-
LogicalModel Log: 0 https://localhost:3000/api/v1/users in 0.044237s FAILED: error
|
32
|
-
LogicalModel Log RESPONSE:
|
33
|
-
LogicalModel Log: 0 https://localhost:3000/api/v1/users in 0.000878s FAILED: error
|
34
|
-
LogicalModel Log RESPONSE:
|
35
|
-
LogicalModel Log: 0 https://localhost:3000/api/v1/users in 0.001611s FAILED: error
|
36
|
-
LogicalModel Log RESPONSE:
|
37
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.233063s FAILED:
|
38
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
39
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.157818s FAILED:
|
40
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
41
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.067717s FAILED:
|
42
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
43
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.011295s FAILED:
|
44
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
45
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.019577s FAILED:
|
46
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
47
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.047789s FAILED:
|
48
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
49
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.021546s FAILED:
|
50
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
51
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.049893s FAILED:
|
52
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
53
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 5.021058s FAILED:
|
54
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
55
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.047952s FAILED:
|
56
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
57
|
-
LogicalModel Log: 0 http://localhost:3000/api/v1/users in 0.001093s FAILED: error
|
58
|
-
LogicalModel Log RESPONSE:
|
59
|
-
LogicalModel Log: 0 http://localhost:3000/api/v1/users in 0.000394s FAILED: error
|
60
|
-
LogicalModel Log RESPONSE:
|
61
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.136481s FAILED:
|
62
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
63
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.050792s FAILED:
|
64
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
65
|
-
LogicalModel Log: 200 http://localhost:3000/api/v1/users in 0.141034s FAILED:
|
66
|
-
LogicalModel Log RESPONSE: {"user":{"name":"bryan","created_at":"2011-11-03T14:37:44-03:00","updated_at":"2011-11-03T14:37:44-03:00","id":24,"bio":"another rubyist","email":"bryan@pauldix.net"}}
|
67
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.050582s FAILED:
|
68
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
69
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.035647s FAILED:
|
70
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
71
|
-
LogicalModel Log: 200 http://localhost:3000/api/v1/users in 0.201605s FAILED:
|
72
|
-
LogicalModel Log RESPONSE: {"user":{"name":"bryan","created_at":"2011-11-03T14:39:18-03:00","updated_at":"2011-11-03T14:39:18-03:00","id":26,"bio":"another rubyist","email":"bryan@pauldix.net"}}
|
73
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.038625s FAILED:
|
74
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
75
|
-
LogicalModel Log: 200 http://localhost:3000/api/v1/users in 0.191726s FAILED:
|
76
|
-
LogicalModel Log RESPONSE: {"user":{"name":"bryan","created_at":"2011-11-03T14:41:10-03:00","updated_at":"2011-11-03T14:41:10-03:00","id":28,"bio":"another rubyist","email":"bryan@pauldix.net"}}
|
77
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.018539s FAILED:
|
78
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
79
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.049956s FAILED:
|
80
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
81
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.018731s FAILED:
|
82
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
83
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.048094s FAILED:
|
84
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
85
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.02157s FAILED:
|
86
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
87
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.051048s FAILED:
|
88
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
89
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 5.02165s FAILED:
|
90
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
91
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.050986s FAILED:
|
92
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
93
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.013325s FAILED:
|
94
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
95
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.11644s FAILED:
|
96
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
97
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.014655s FAILED:
|
98
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
99
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.050812s FAILED:
|
100
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
101
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.015264s FAILED:
|
102
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
103
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.048666s FAILED:
|
104
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
105
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 5.023148s FAILED:
|
106
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
107
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.047819s FAILED:
|
108
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
109
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.014254s FAILED:
|
110
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
111
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.048866s FAILED:
|
112
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
113
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.01741s FAILED:
|
114
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
115
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.051693s FAILED:
|
116
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
117
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.035599s FAILED:
|
118
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
119
|
-
LogicalModel Log: 200 http://localhost:3000/api/v1/users in 0.187376s FAILED:
|
120
|
-
LogicalModel Log RESPONSE: {"user":{"name":"bryan","created_at":"2011-11-03T14:58:14-03:00","updated_at":"2011-11-03T14:58:14-03:00","id":30,"bio":"another rubyist","email":"bryan@pauldix.net"}}
|
121
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.02095s FAILED:
|
122
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
123
|
-
LogicalModel Log: 0 https://localhost:3000/api/v1/users in 0.000257s FAILED: error
|
124
|
-
LogicalModel Log RESPONSE:
|
125
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.023091s FAILED:
|
126
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
127
|
-
LogicalModel Log: 0 https://localhost:3000/api/v1/users in 0.000932s FAILED: error
|
128
|
-
LogicalModel Log RESPONSE:
|
129
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.019534s FAILED:
|
130
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
131
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 5.0228s FAILED:
|
132
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
133
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.012712s FAILED:
|
134
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
135
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.050448s FAILED:
|
136
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
137
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.058483s FAILED:
|
138
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
139
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.01427s FAILED:
|
140
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
141
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.051569s FAILED:
|
142
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
143
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.116518s FAILED:
|
144
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|